Skip to main content
 首页 » 编程设计

python之pygame之按住按钮

2025年05月04日14qlqwjy

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

       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 keystate block 。它必须针对每个方向重复,并且游戏世界需要在每个 while block 中更新。那是五个需要复制相同代码的地方……如果没有按下一个键,还有 4 个方向。我可以将它包装在一个函数中,但我想知道在 pygame 中是否有更好的方法来处理按住按钮的问题。

请您参考如下方法:

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 实现相同的效果,在这种情况下您不需要处理按键事件。