You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例。按键修改的是前者的移动状态,自然不会影响到屏幕上显示的飞船。

具体修复步骤:

  1. 修改User_input_responses的初始化逻辑:不要自行创建Ship实例,改为接收外部传入的飞船对象:
class User_input_responses:
    def __init__(self, ship):
        self.ship = ship  # 使用主程序传入的飞船实例
  1. 在主程序中传入正确的Ship实例:在Alien_Invasion的__init__方法里,先创建飞船,再把它传给移动处理类:
self.ship = Ship(self)
self.movement = User_input_responses(self.ship)  # 传入已创建的飞船
  1. 补充缺失的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
  1. 额外检查:确保Settings类中正确定义了ship_speed属性,否则飞船即使状态正确也不会移动。

内容的提问来源于stack exchange,提问作者Wade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:37:33