我是 Python 新手,目前正在使用 Python 速成类(class)创建游戏。我的项目涉及开发一款入侵游戏,我在其中控制一艘宇宙飞船。然而,我在有效管理飞船的方向方面遇到了困难。
外星人游戏.py
import sys
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("TemplAReeb's First Game")
ship = Ship(ai_settings, screen)
bg_color = (230, 230, 230)
while True:
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings, screen, ship)
screen.fill(bg_color)
ship.blitme()
pygame.display.flip()
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
screen.fill(bg_color)
ship.blitme()
pygame.display.flip()
run_game()
game_functions.py
import sys
import pygame
def check_keydown_events(event, ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = True
elif event.key == pygame.K_LEFT:
ship.moving_left = True
def check_keyup_events(event, ship):
if event.key == pygame.K_RIGHT:
ship.moving_right = False
elif event.key == pygame.K_LEFT:
ship.moving_left = False
def check_events(ship):
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event, ship)
elif event.type==pygame.KEYUP:
check_keyup_events(event, ship)
def update_screen(ai_settings, screen, ship):
bg_color = (230, 230, 230)
screen.fill(bg_color)
ship.blitme()
pygame.display.flip()
船舶.py
import pygame
class Ship():
def __init__(self, ai_settings, screen):
self.screen = screen
self.ai_settings = ai_settings
self.image = pygame.image.load('D:/Python/Pycharm Projects/GameAlien/images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
self.center = float(self.rect.centerx)
self.moving_right=False
self.moving_left=False
def update(self):
if self.moving_right and self.rect.right<self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left>0:
self.center -= self.ai_settings.ship_speed_factor
self.rect.centerx = self.center
def blitme(self):
self.screen.blit(self.image, self.rect)
当我按下向左箭头键时,船应该向左移动,相应地,当我按下向右箭头键时,它应该向右移动。不幸的是,该船的运动行为目前不稳定;它要么不可预测地移动,要么在不响应进一步输入的情况下向一个方向发起移动,从而基本上陷入困境。
最佳答案
问题是您多次调用 pygame.event.get()
在主循环中。注意,pygame.event.get()
获取所有消息并将它们从队列中删除,因此第一个或第二个调用随机获取事件,而另一个调用则什么也得不到。
在主循环中获取一次事件并将它们传递给函数 check_events
:
def check_events(ship, events):
for event in events:
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN:
check_keydown_events(event, ship)
elif event.type==pygame.KEYUP:
check_keyup_events(event, ship)
while True:
# the one and only call to `pygame.event.get()`
# get the pending events and clear the event queue
events = pygame.event.get()
for event in events:
if event.type==pygame.QUIT:
sys.exit()
check_events(ship, events)
# [...]
但请注意,可以使用 pygame.key.get_pressed()
来简化代码:
def check_events(ship):
keys = pygame.key.get_pressed()
ship.moving_right = keys[pygame.K_RIGHT]
ship.moving_left = keys[pygame.K_LEFT]
pygame.key.get_pressed()
返回的状态当事件由 pygame.event.get()
处理时进行评估或 pygame.event.poll()
关于python - 无法控制游戏中的物体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57152899/