1

当你按住一个键时,我找到了一个让精灵移动的解决方案。问题是它强制编写丑陋的重复代码。我找到的当前解决方案是:

       for event in pygame.event.get():
            if event.type == KEYDOWN:
                keystate = pygame.key.get_pressed()
                while keystate[K_RIGHT]:
                    screen.fill((255,255,255))
                    pygame.event.get()

                    for sprite in sprites:
                        rimage = sprite[1].getimage()

                        if sprite[2] is None:
                            x+=3
                            sprite[1].update(time)
                            screen.blit(rimage, (x,y))
                            if sprite[1].isfinished() == True:
                                sprite[1].reset()
                            last_dir = "right"
                            if x >= screen_width - rimage.get_width():
                                x = screen_width - rimage.get_width()

                    #update player sprite movement
                    #update player sprite animation
                    #update rest of game map

                    keystate = pygame.key.get_pressed()
                    time = pygame.time.get_ticks()


                    pygame.display.update()

问题是 while 键状态块。它必须针对每个方向重复,并且游戏世界需要在每个 while 块中更新。那是需要复制相同代码的五个地方......如果没有按下一个键,则需要四个方向。我可以将它包装在一个函数中,但我想知道是否有更好的方法来处理在 pygame.

4

3 回答 3

5

pygame中程序的常用方式是使用事件来更新方向,然后在事件之外编写更新位置代码,这样就不需要复制代码。

clock = pygame.time.Clock()

direction = (0,0)

while True:    # main loop

   for event in pygame.event.get():

        if event.type == KEYDOWN:
            if event.key == K_RIGHT:
                direction = (3, 0)
            elif event.key == K_LEFT:
                direction = (-3, 0)
            elif event.key == K_UP:
                direction = (0, 3)
            elif event.key == K_DOWN:
                direction = (0, -3)
            else:
                print "Unrecognized key"

        if event.type == KEYUP:
            direction = (0, 0)

    screen.fill((255,255,255))

    for sprite in sprites:
        rimage = sprite[1].getimage()

        if sprite[2] is None:

            # Check if new position is inside the screen
            new_pos = x + direction[0], y + direction[1]
            if new_pos[0] + rimage.get_width() < screen_width:
                x = new_pos[0]
            if new_pos[1] + rimage.get_height() < screen_height:
                y = new_pos[1]

            # Draw the sprite
            sprite[1].update(time)
            screen.blit(rimage, (x,y))
            if sprite[1].isfinished() == True:
                sprite[1].reset()
                last_dir = direction

    #update player sprite movement
    #update player sprite animation
    #update rest of game map

    time = pygame.time.get_ticks()

    pygame.display.update()

    clock.tick(40)  # Keep game running at 40 fps

如果您愿意,您可以使用 keystate 实现相同的效果,在这种情况下,您不需要处理关键事件。

于 2012-12-02T17:50:32.930 回答
1

Pygame 建议或暗示将程序分为 3 个部分:

事件处理、更新和绘制。正如 pmoleri 已经说过的,您只需改变运动的方向。在更新函数中,您应该传入一个 delta 时间参数,以根据传递的时间移动所有精灵。这非常重要,因为其他技术没有考虑处理器的可变速度。DOS 中的游戏就是这样制作的,所以现在我们需要模拟器来人为地减慢处理器的速度。绘制部分只是简单地绘制所有的精灵。

这样你就可以清楚地划分游戏中这三个不同的部分:玩家输入、游戏逻辑(移动、碰撞、动作等)和绘图。

于 2012-12-02T18:25:19.163 回答
1

另外,pygame.key.get_pressed()可以使用。

这将返回当前被按住的所有键的列表。

keys = pygame.key.get_pressed()

if keys[pygame.K_w]:
  # Move Up
if keys[pygame.K_a]:
  # Move Down
... etc ...

这不需要在事件部分,但可能是玩家更新的地方。

这可以使代码不那么笨重并且(可能)更有效率

-希望我能帮上忙!

于 2018-04-24T18:30:14.787 回答