尽管在 pygame 中有输入,精灵仍然不动

问题描述

我在 pygame 中遇到了一个问题,无论输入如何,精灵都不会移动,我已经检查了几次,但不知道它有什么问题。一共三页,第一页是游戏的主循环,第二页是玩家精灵的代码,第三页是一些游戏功能

main---------page-01

import pygame
import sys
from player import Player
import game_functions as gf

def run_game():
    # Intialise the game and start the screen
    pygame.init()   
    screen = pygame.display.set_mode((800,600))
    pygame.display.set_caption("Amarcreep")
    
    player = Player(screen)
    
    # Main loop
    while True:
        # Check if user wants to quit
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
                
        # Navy screen       
        screen.fill((0,128))
        
        gf.responses(screen,player)
        player.p_movements()
            
        # Make the player appear
        player.draw_player()
        
        # Make the newly made screen visible
        pygame.display.flip()
    
run_game()

播放器--------------------page-02

import pygame
from pygame.sprite import Sprite


class Player(Sprite):
    # Initialise the main player
    
    def __init__(self,screen):
        super(Player,self).__init__()
        
        self.screen = screen
        self.screen_rect = screen.get_rect()
        
        # Specifying the position of the player at start 
        self.rect = pygame.Rect(0,30,30)
        self.rect.centerx = self.screen_rect.centerx
        self.rect.bottom = 590
        
        self.moving_left = False
        self.moving_right = False
        self.moving_up = False
        
    def p_movements(self):
        
        if self.moving_left:
            self.rect.x -= 5
        if self.moving_right:
            self.rect.x += 5
        if self.moving_up:
            self.rect.y -= 30   
        
    def draw_player(self):
        ''' Draw the player on the screen'''
        pygame.draw.rect(self.screen,(255,255,255),self.rect)
        
            

game_functions-----------------page-03

import pygame


def responses(screen,player):
    ''' Check for responses'''
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                player.moving_up == True
                
            elif event.key == pygame.K_LEFT:
                player.moving_left == True
                
            elif event.key == pygame.K_RIGHT:
                player.moving_right == True
                
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                player.moving_up == False
                
            elif event.key == pygame.K_LEFT:
                player.moving_left == False
                
            elif event.key == pygame.K_RIGHT:
                player.moving_right == False

解决方法

您在主事件循环中所做的第一件事是在寻找退出事件时完全清除队列。游戏功能文件中的第二个事件循环不一定会顺利进行。

事实上,有两个事件循环是相当混乱的,其中一个会丢弃任何不是退出事件的东西——这很可能导致丢失事件。

我怀疑更好的方法是提供一个 response 游戏函数,它只处理一个事件(并且根本不接触事件队列):

def response(screen,player,evt):
    if evt.type == pygame.KEYDOWN:
        blah blah blah

并让主要的(现在是唯一的)事件循环调用它不想自己处理的事件:

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()
    gf.response(screen,event)

您可能还想考虑按下向上和向下按钮(或向左和向右,就此而言)时的预期结果。至少,您可能希望将其作为测试用例 :-)