问题描述
我在 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)
您可能还想考虑按下向上和向下按钮(或向左和向右,就此而言)时的预期结果。至少,您可能希望将其作为测试用例 :-)