0

我一直在慢慢尝试学习 pygame 和 python,并尝试制作一个简单的 spritesheet 动画。我很确定我做得不对,但我仍在努力了解课程的真正运作方式等等。到目前为止,我有一个按键返回True和一个释放返回FalseTrue然后激活动画的循环。

while done == False:
for event in pygame.event.get():

    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RIGHT:
            x_speed = walk_speed
            dir = 1
            cycle = True
        if event.key == pygame.K_LEFT:
            x_speed = 0 - walk_speed
            dir = 0
            cycle = True

    if event.type == pygame.KEYUP:
        if event.key == pygame.K_RIGHT:
            x_speed = 0
            dir = 1
            cycle = False
        if event.key == pygame.K_LEFT:
            x_speed = 0
            dir = 0
            cycle = False


    if cycle == True:
        it += 1
        if it > 6:
            it = 0
        pygame.time.set_timer(it, 100)

    elif cycle == False:
        it = 1
        pygame.time.set_timer(it, 0)
        it = 1


    ennis.speed = x_speed
if it > 6:
    it = 0
if dir == 1:
    ennis.sprite = walking_right[it]
if dir == 0:
    ennis.sprite = walking_left[it]
ennis.update()

我知道这可能是一种可怕的、混乱的、基本的方法,但它有效,我理解!好吧,它几乎可以工作。

目前,传入的事件 Idpygame.time.set_timer()it变量,它抛出一个Value Error,表示 Id 必须介于 之间NOEVENT(0) and NUMEVENTS(32)。所以,我看到它的方式是,我需要创建一个递增it1 的事件,并在它超过 6 时重置为 0。

提前感谢您的帮助!

4

1 回答 1

0

动画不需要使用事件,可以使用的一种用途可能是闪烁的星星。

pygame 事件队列的工作原理:

操作系统将您的键盘和鼠标按下发送到队列。当您调用pygame.event.get()它时,它会从队列中获取第一个事件。之后,您可以检查其类型:KEYDOWN,以及相应的按钮。

set_timer 的作用是设置您选择的重复事件。如果我们将计时器设置为 1 秒,事件 id 为 12,我们将每秒获得一个事件。然后我们可以做一些动作,例如播放声音。它并没有真正用于动画。

如何编写动画精灵:

而不是你的布尔值,你应该有 states:STANDINGWALKING. 精灵应该有一个更新方法,您可以在其中移动精灵并更改其表面。每次调用更新都应该分配下一个表面。要进行某种延迟,您可以使用时钟,它将返回自上次调用以来的毫秒数。这样,您可以将 Clock 的结果累积到某个最高值,此时您将更改 sprite。

于 2013-06-20T22:19:43.173 回答