Pygame《Alien Invasion》开发:如何实现每个外星人独立投掷炸弹
你遇到的问题来自两处错误逻辑:
_drop_bombs方法中你仅实例化了1个炸弹对象,重复添加到精灵组,所有炸弹本质是同一个对象,坐标自然相同Bomb类初始化时固定读取ai_game.alien的坐标,这个属性是你在__init__里单独初始化的首个外星人实例,和舰队中其他外星人无关
第一步:修改bombs.py的Bomb类
让Bomb支持接收指定的外星人对象来设置出生位置:
from pygame.sprite import Sprite class Bomb(Sprite): """create a bullet that is dropped by aliens""" # 增加alien参数,接收投弹的外星人对象 def __init__(self, ai_game, alien): super().__init__() self.screen = ai_game.screen self.settings = ai_game.settings self.color = self.settings.bullet_color self.rect = pygame.Rect(0, 0, self.settings.bullet_width, self.settings.bullet_height) # 用传入的alien坐标设置炸弹出生位置,而不是固定的ai_game.alien self.rect.midbottom = alien.rect.midbottom self.y = float(self.rect.y) # 其余方法保持不变 def update(self): """move bullet down screen""" self.y += self.settings.bullet_speed self.rect.y = self.y def draw_bomb(self): """draw bullet to screen""" pygame.draw.rect(self.screen, self.color, self.rect)
第二步:修改alien_invasion.py的_drop_bombs方法
给每个外星人单独创建对应的炸弹实例:
def _drop_bombs(self): """drop bombs from alien ships""" # 删掉原本只创建1个炸弹的逻辑,遍历每个外星人时单独创建 for alien in self.aliens: # 把当前遍历到的外星人作为参数传入Bomb new_bomb = Bomb(self, alien) self.bombs.add(new_bomb)
提示:当前逻辑为每帧所有外星人都会投弹,会出现满屏炸弹的情况,后续可以增加投弹冷却、随机触发概率、仅最前排外星人投弹的规则,即可实现你需要的等级解锁随机投弹效果。
内容的提问来源于stack exchange,提问作者Zoidberg
相关产品推荐
相关产品推荐

