pygame 精灵运动

pygame Sprite Movement

下面我定义了一个pygame游戏循环。我可以在 8 个方向上移动精灵。

    #player position
    def player(x,y):
        screen.blit(playerImg, (x, y))
    
    #enemy position
    def enemy(x,y):
        screen.blit(enemyImg, (x, y))
    
    def fire_bullet(x,y):
        global bullet_state
        bullet_state = "fire"
        screen.blit(bulletImg, (x + 16, y + 10))

    # Game Loop
    running = True
    while running:
        #fill values RGB - Red, Green, Blue
        screen.fill(bc.goodblue)
        #background immage
        screen.blit(background, (0,0))
    
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False        
            #if keystroke is pressed
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    playerx_change = -movespeed
                if event.key == pygame.K_RIGHT or event.key == ord('d'):
                    playerx_change = movespeed
                if event.key == pygame.K_UP or event.key == ord('w'):
                    playery_change = -movespeed
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    playery_change = movespeed
                if event.key == pygame.K_SPACE and bullet_state == "ready":
                    bulletx = playerx
                    fire_bullet(bulletx, bullety)
            if event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):
                    playerx_change = 0
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == ord('s') or event.key == ord('w'):
                    playery_change = 0


        #player movement
        playery += playery_change
        playerx += playerx_change

        if playerx <= 0:
            playerx = 0
        if playerx >= width - PImgWidth:
            playerx = width - PImgWidth
        if playery <=0:
            playery = 0
        if playery >=height - PImgHeight:
            playery = height - PImgHeight
    
        #enemy movement
        enemyx += enemyx_change
   
        if enemyx <= 0:
            enemyx_change = enemyspeed
            enemyy += enemyy_change
        if enemyx >= width - EImgWidth:
            enemyx_change = -enemyspeed
            enemyy += enemyy_change
    
        player(playerx, playery)
        enemy(enemyx, enemyy)
        pygame.display.update()
    
    pygame.quit()

但是,有一个小问题。

如果我按向左箭头键,精灵会向左移动。如果我然后也按向右箭头键,精灵开始向右移动。

如果我随后松开左箭头键,精灵就会停止。我不希望这发生。如果我朝正确的方向移动,然后松开左箭头键,我想继续朝正确的方向移动。

我不知道设置它的有效方法。

如果您释放 LEFTRIGHTa d 在设置playerx_change = 0: 之前,您必须检查这些键之一是否仍被按下。使用pygame.key.get_pressed()评估键的状态:

if event.type == pygame.KEYUP:
    if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == ord('a') or event.key == ord('d'):

        keys = pygame.key.get_pressed()
        if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
            playerx_change = 0

分别对 UPDOWNs 执行相同的操作 w

while running:
    # [...]

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                playerx_change = -movespeed
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                playerx_change = movespeed
            if event.key == pygame.K_UP or event.key == ord('w'):
                playery_change = -movespeed
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                playery_change = movespeed
            if event.key == pygame.K_SPACE and bullet_state == "ready":
                    bulletx = playerx
                    fire_bullet(bulletx, bullety)        
                
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_a or event.key == pygame.K_d:
                keys = pygame.key.get_pressed()
                if not keys[pygame.K_LEFT] and not keys[pygame.K_RIGHT] and not keys[pygame.K_a] and not keys[pygame.K_d]:
                    playerx_change = 0
            
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_s or event.key == pygame.K_w:
                keys = pygame.key.get_pressed()
                if not keys[pygame.K_UP] and not keys[pygame.K_DOWN] and not keys[pygame.K_s] and not keys[pygame.K_w]:
                    playery_change = 0