Pygame开发游戏飞船无法移动问题求助
问题描述
游戏运行后飞船正常显示在屏幕中央,但按下方向键时飞船无任何移动反应;按下Q键可正常退出游戏,说明keydown方法能正常工作,推测问题与ship_movement的使用逻辑有关,求解决思路。
主文件代码
import pygame from settings import Settings from ship_test import Ship from ship_movement import User_input_responses class Alien_Invasion: def __init__(self): pygame.init() self.settings = Settings() self.movement = User_input_responses() #screen self.screen = pygame.display.set_mode((self.settings.screen_width , self.settings.screen_height)) pygame.display.set_caption(("Alien Invader")) self.bg_color = self.settings.bg_color self.clock = pygame.time.Clock() self.ship = Ship(self) def update_screen(self): pygame.display.flip() self.screen.fill(self.bg_color) self.ship.blitme() def game(self): while True: self.movement.user_input_reactions() self.ship.ship_movement() self.update_screen() self.clock.tick(60) if __name__ == '__main__': game_launcher = Alien_Invasion() game_launcher.game()
移动处理文件代码
import pygame import sys from ship_test import Ship class User_input_responses: def __init__(self): self.ship = Ship() def user_input_reactions(self): for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: self.keydown(event) elif event.type == pygame.KEYUP: self.keyup(event) def keydown(self, event): if event.key == pygame.K_RIGHT: self.ship.moving_right = True elif event.key == pygame.K_LEFT: self.ship.moving_left = True elif event.key == pygame.K_UP: self.ship.moving_up = True elif event.key == pygame.K_DOWN: self.ship.moving_down = True elif event.key == pygame.K_q: sys.exit()
飞船类文件代码
import pygame from settings import Settings class Ship: def __init__(self, game=""): if game: self.screen = game.screen self.screen_rect = self.screen.get_rect() self.image = pygame.image.load("images/ship.bmp") self.rect = self.image.get_rect() self.rect.center = self.screen_rect.center self.x = float(self.rect.x) self.y = float(self.rect.y) self.settings = Settings() self.moving_right = False self.moving_left = False self.moving_up = False self.moving_down = False def ship_movement(self): if self.moving_right and self.rect.right < self.screen_rect.right: self.x += self.settings.ship_speed if self.moving_left and self.rect.left > 0: self.x -= self.settings.ship_speed if self.moving_down and self.rect.bottom < self.screen_rect.bottom: self.y += self.settings.ship_speed if self.moving_up and self.rect.top > 0: self.y -= self.settings.ship_speed self.rect.x = self.x self.rect.y = self.y def blitme(self): self.screen.blit(self.image,self.rect)
解决思路
核心问题是移动处理类和主程序用的是两个完全独立的Ship实例:你在User_input_responses里创建了一个自己的Ship对象,但主程序中实际绘制、更新的是另一个Ship实例。按键修改的是前者的移动状态,自然不会影响到屏幕上显示的飞船。
具体修复步骤:
- 修改
User_input_responses的初始化逻辑:不要自行创建Ship实例,改为接收外部传入的飞船对象:
class User_input_responses: def __init__(self, ship): self.ship = ship # 使用主程序传入的飞船实例
- 在主程序中传入正确的Ship实例:在
Alien_Invasion的__init__方法里,先创建飞船,再把它传给移动处理类:
self.ship = Ship(self) self.movement = User_input_responses(self.ship) # 传入已创建的飞船
- 补充缺失的
keyup方法:原代码中只处理了KEYDOWN事件,没有处理KEYUP,会导致按住方向键松开后飞船持续移动,补全该方法:
def keyup(self, event): if event.key == pygame.K_RIGHT: self.ship.moving_right = False elif event.key == pygame.K_LEFT: self.ship.moving_left = False elif event.key == pygame.K_UP: self.ship.moving_up = False elif event.key == pygame.K_DOWN: self.ship.moving_down = False
- 额外检查:确保
Settings类中正确定义了ship_speed属性,否则飞船即使状态正确也不会移动。
内容的提问来源于stack exchange,提问作者Wade
相关产品推荐
相关产品推荐

