前言
在编写外星人入侵的项目的时候,主函数使用下面的代码创建精灵族并添加子弹类
self.bullets = pygame.sprite.Group()
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
之后使用下面一行代码更新所有子弹的位置,但是奇怪的是程序运行的时候没有更新子弹位置
self.bullets.update()
原因
找了一会原因,想到这个update方法从始至终我都没有写过,它是怎么控制子弹位置的,找到创建Bullet类的文件看一下,书上更新子弹位置使用update函数,但是这里我改成了update_bullet_position,再看一下初始化如下
class Bullet(Sprite):
"""管理飞船发射子弹的类"""
def __init__(self, game):
super().__init__()
引用Sprite父类,Sprite中有update方法,这里在写update同名就是重新父类中的update方法,破案了。
不使用self.bullets.update()
在创建Bullet类的时候,更新位置的函数名不写update时候,只需要这样修改就可以
def _fire_bullet(self):
"""创建子弹"""
new_bullet = Bullet(self)
self.bullets.add(new_bullet)
def _update_bullets(self):
"""更新子弹"""
# self.bullets.update() # 所有子弹成员调用update方法更新位置
# 删除消失的子弹
for bullet in self.bullets.sprites():
bullet.update_bullet_position() # 更新位置
if bullet.rect.bottom < 0:
self.bullets.remove(bullet)
else:
bullet.draw_bullet()
就是每次循环都调用更新位置的函数,这样感觉代码明了一点。