Pygame中子弹Sprite更新影响玩家位置问题求助
问题解决:子弹与玩家位置/速度相互影响的问题
问题根源
你遇到的问题是因为Vector2是可变对象,当你把玩家的self.pos和self.vel直接传给Bullet的构造函数时,Bullet里的self.pos和self.vel其实是引用了和玩家相同的对象。后续修改Bullet的位置时,会直接改变玩家的位置,反之亦然。
修复方案
在创建Bullet时,传递玩家位置和速度的副本,而不是原对象。可以通过Vector2的.copy()方法,或者重新创建一个新的Vector2实例来实现:
方案一:修改Player类的input方法
def input(self): keys = pygame.key.get_pressed() if keys[pygame.K_UP]: # 传递位置和速度的副本,切断引用关联 self.bullet_list.add(Bullet(self.pos.copy(), self.vel.copy()))
方案二:修改Bullet类的__init__方法
如果不想修改Player的代码,也可以在Bullet的构造函数内部创建副本:
def __init__(self, pos, vel): super().__init__() self.pos = pos.copy() # 创建位置的独立副本 self.vel = vel.copy() # 创建速度的独立副本
额外代码修正提示
你的代码还有几处语法/逻辑错误需要修正,否则无法正常运行:
- Player和Bullet的
update方法都缺少self参数,需修正:# Player的update方法 def update(self): self.input() # Bullet的update方法 def update(self): self.pos += self.vel # 这里要把vel改为self.vel - 主循环内每次都会重新创建
bullets和players组,会导致玩家和子弹被反复重置,需将这两行移到循环外:bullets = pygame.sprite.Group() players = pygame.sprite.Group(Player(bullets)) # 注意这里应该是Player而非Player1 while True: # 事件处理(必须添加,否则无法关闭窗口) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() bullets.update() players.update() # 后续添加屏幕绘制、刷新等逻辑
内容的提问来源于stack exchange,提问作者marloop007
相关产品推荐
相关产品推荐

