【问题标题】:pygame Sprite Movementpygame 精灵运动
【发布时间】:2020-11-04 06:17:14
【问题描述】:

下面我定义了一个 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()

但是,有一个小问题。

如果我按下左箭头键,精灵会向左移动。如果我再按右箭头键,精灵就会开始向右移动。

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

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

【问题讨论】:

    标签: python pygame logic


    【解决方案1】:

    如果您释放 LEFTRIGHTad,您必须检查其中一个是否在您可以设置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
    

    【讨论】:

    • 太棒了!谢谢。
    猜你喜欢
    • 2017-09-13
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多