在 pygame 中连续移动方块

Making a square move continously in pygame

所以我是 pygame 的新手,我正在尝试让这个黑色方块向上、向下、向左和向右移动。我希望我能做到这一点,就像当我按下这些键中的任何一个并将它们放在黑匣子中时,它们会不断向上移动。谁能帮我? 这是我的代码

import pygame, sys
import math

pygame.init()


width = 1900
height = 1000
white = (255,255,255)
black = (0,0,0)
player_color = (0,0,0)
player_pos = [950,500]
player_size = (20)

screen = pygame.display.set_mode((width,height))



game_over = False

while not game_over:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            game_over = True

        if event.type == pygame.KEYDOWN:

            x = player_pos[0]
            y = player_pos[1]   

            if event.key == pygame.K_LEFT:
                x -= player_size
            elif event.key == pygame. K_RIGHT:
                x += player_size
            elif event.key == pygame. K_DOWN:
                y += player_size
            elif event.key == pygame. K_UP:
                y -= player_size
            player_pos = [x,y]

    screen.fill(white)
    
    pygame.draw.rect(screen,black, (player_pos[0], player_pos[1],20,20))
    

    
    pygame.display.update()

你必须使用 pygame.key.get_pressed() instead of the keyboard events. See How can I make a sprite move when key is held down.

键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN 事件在每次按下一个键时发生一次。 KEYUP 每松开一个键就会出现一次。使用键盘事件进行单个操作或逐步移动。

pygame.key.get_pressed() returns a list with the state of each key. If a key is held down, the state for the key is True, otherwise False. Use pygame.key.get_pressed() 评估按钮的当前状态并获得连续移动。

使用pygame.time.Clock来控制每秒的帧数,从而控制游戏速度和玩家的移动速度。

方法tick() of a pygame.time.Clock object, delays the game in that way, that every iteration of the loop consumes the same period of time. See pygame.time.Clock.tick():

This method should be called once per frame.

import pygame, sys
pygame.init()

width = 1900
height = 1000
white = (255,255,255)
black = (0,0,0)
player_color = (0,0,0)
player_pos = [950,500]
player_size = (20)

screen = pygame.display.set_mode((width,height))
clock = pygame.time.Clock()

game_over = False
while not game_over:
    clock.tick(100)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    keys = pygame.key.get_pressed()
    player_pos[0] += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * player_size
    player_pos[1] += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * player_size

    screen.fill(white)
    pygame.draw.rect(screen, player_color, (player_pos[0], player_pos[1],20,20))
    pygame.display.update()

pygame.quit()
sys.exit()