【问题标题】:animation in pygamepygame中的动画
【发布时间】:2013-04-07 23:15:33
【问题描述】:

这个程序的目标是让一个绿色圆圈在屏幕上循环上下跳动。我已经让它下降并再次备份,但不是让它再次下降。

import pygame, sys, time, random
from pygame.locals import *
from time import *

pygame.init()
windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Bounce")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

info = pygame.display.Info()
sw = info.current_w
sh = info.current_h
y= 0
yy= sh

while True:
    windowSurface.fill(BLACK)
    pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
    sleep(.006)
    y+= 1
    if y>sh:
        pygame.draw.circle(windowSurface, GREEN , (250,yy), 13, 0)
        sleep(.0001)
        yy +=-1
    if yy<-.00001:
        y=0
        y+= 1
        pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)

    pygame.display.update()

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

【问题讨论】:

    标签: python animation pygame


    【解决方案1】:

    在您的if yy &lt; -.00001: 块中,我认为您正在尝试将状态重置为程序开始时的状态。如果是这样,你忘了设置yy = sh

    换句话说:

    if yy<-.00001:
        y=0
        yy=sh   # <- add this line
        y+= 1
        pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
    

    不过,总的来说,我同意半身人的观点。这段代码太复杂了。我建议使用状态变量来记录球是向上还是向下移动,然后在循环中检查该变量并增加或减少位置。当你到达屏幕的另一端时,交换状态变量来改变球的方向。

    编辑:试试这个:

    import pygame, sys, time, random
    from pygame.locals import *
    from time import *
    
    pygame.init()
    windowSurface = pygame.display.set_mode((500, 400), 0, 32)
    pygame.display.set_caption("Bounce")
    
    BLACK = (0, 0, 0)
    WHITE = (255, 255, 255)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    
    info = pygame.display.Info()
    sw = info.current_w
    sh = info.current_h
    y = 0
    
    # Initial direction is down
    direction = 1
    
    while True:
        windowSurface.fill(BLACK)
        pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
        #print "Drawing at 250,", y
        sleep(.006)
        y += direction
        if y >= sh:
            # Changes the direction from down to up
            direction = -1
        elif y <= 0:
            # Changes the direction from up to down
            direction = 1
    
        pygame.display.update()
    
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
    

    注意:希望这对你有用。我没有安装 pygame,所以我只运行它,将 pygame 的东西注释掉,print 调用替换而不是绘制命令。无论如何,它对我有用。

    【讨论】:

      【解决方案2】:

      对于您尝试制作的动画而言,您的代码似乎太复杂了。

      您正在寻找模拟“弹跳效果”的可能是 sin 函数(因为它在 -1 和 1 之间振荡):

      t = 0
      speed = 0.01
      maxHeight = 200
      while True:
          windowSurface.fill(BLACK)
          pygame.draw.circle(windowSurface, GREEN , (250,y), 13, 0)
          sleep(.006)
          t += 1
          y = int( ( sin(t*speed) + 1) * maxHeight / 2 )
      
          pygame.draw.circle(windowSurface, GREEN , (250, y , 13, 0)
      
          pygame.display.update()
      
          for event in pygame.event.get():
              if event.type == QUIT:
                  pygame.quit()
                  sys.exit()
      

      不要忘记将from math import sin 放在代码的顶部。

      如果您想实现一些逼真的效果,您可能应该使用球的速度和加速度,而不是使用“sin”函数来模拟弹跳效果。

      【讨论】:

      • pygame.draw.circle(windowSurface, GREEN , (250, (sin(sinx)+1)*100), 13, 0) TypeError: integer argument expected, got float
      • 哦,对不起。您需要将其转换为int。编辑了我的答案!
      【解决方案3】:

      使用 while 循环让您的球弹起。 它应该一遍又一遍地循环代码。当它没有第二次下降时会发生什么?它会抛出错误吗?它只是冻结吗?

      【讨论】:

        【解决方案4】:

        您可以添加一个简单的解决方法是一个计数器变量,因此每次您的球改变方向时variable+=1 因此在经过一定数量的更改后程序停止。假设这就是你想要它做的事情。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-21
          • 2017-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多