Python/Pygame.. 麻烦 类

Python/Pygame.. Trouble w/ classes

大家好,我在制作游戏时遇到了一些问题....我想在图像每隔 "step" 发生变化时移动我的角色,它看起来像动画...

我已经为此工作了几个小时,但到目前为止我唯一做的就是移动字符,但所有图像都是在移动时一次性绘制的

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    currentimageleft = 1
    gamedisplay.blit(background, (0,0))
    if currentimageleft == 1:
        gamedisplay.blit(temp1, (template_x, template_y), (g1x, g1y, box, box))
        template_x -= moveit
        currentimageleft += 1
    if currentimageleft == 2:
        gamedisplay.blit(temp1, (template_x, template_y), (g2x, g2y, box, box))
        template_x -= moveit
        currentimageleft += 1
    if currentimageleft == 3:
        gamedisplay.blit(temp1, (template_x, template_y), (g3x, g3y, box, box))
        template_x -= moveit
        currentimageleft += 1
    if currentimageleft == 4:
        gamedisplay.blit(temp1, (template_x, template_y), (g4x, g4y, box, box))
        template_x -= moveit
        currentimageleft = 1
    pygame.display.update()

使用 elif 进行后续比较,这样每次迭代只进行一次。

由于您在每个 if 块中递增 currentimgeleft,因此它会触发下一个 if 块。你只希望一个触发每一帧,所以将 if 切换为 elif 除了第一个,然后每次按下 K_LEFT 按钮时你将只有一个触发键盘。像这样

if currentimageleft == 1:
    # code
elif currentimageleft == 2:
    # code
...

但是,请注意,每次为按键输入更大的 if 语句时,您都会设置 currentimageleft。这将确保您总是最终使用动画的第一个精灵。您可能希望将 currentimageleft 与 class 变量相关联,方法是在 __init__ 中声明它类似于

def __init__(self, ...):
    # other code, including possible parent constructors
    self.currentleftimage = 1
    # more code

然后您将使用 self.currentimageleft 而不是 currentimageleft 访问您的变量。然后,这将允许您在按钮按下检测中使用 elseelif 子句(代码段中的外部 if )将 self.currentleftimage 变量重置回 1 允许您以这种方式跟踪运动。

您可能还会发现 this other answer on the equivalent form of switch in Python 很有趣,尽管对 elif 子句的多次调用也是完全正常的,并且在许多情况下可能会导致代码更清晰。