我们来移动外星飞船,思想是飞船左右移动,碰到屏幕边缘后,然后会向下移动
在alien.py中添加方法update()
def update(self):
#向右移动外星飞船
self.x += 1
self.rect.x = self.x
然后在主循环中更新外星人的位置
ck.update_aliens(aliens)
在g_fun.py末端添加update_aliens()
def update_aliens(aliens):
aliens.update()
运行程序,发现飞船向右移动,直至消失
下面我们让飞船碰到屏幕边缘后向下移动一段距离
alien.py
def check_edge(self):
screen_rect = self.screen.get_rect()
if self.rect.right >= screen_rect.right:
return True
elif self.rect.left <= 0:
return True
def update(self):
#向右移动外星飞船
self.x += (1 * self.my_setting.fleet_dir)
self.rect.x = self.x
别忘记在setting.py中添加self.fleet_dir = 1
g_fun.py
def check_fleet_edge(my_setting, aliens):
for alien in aliens.sprites():
if alien.check_edge():
change_fleet_dir(my_setting, aliens)
break
def change_fleet_dir(my_setting, aliens):
for alien in aliens.sprites():
alien.rect.y += 10
my_setting.fleet_dir *= -1
def update_aliens(my_setting, aliens):
check_fleet_edge(my_setting, aliens)
aliens.update()
接下来,检测外星飞船与子弹的碰撞
修改update_bullets()函数如下
def update_bullets(aliens, bullets):
bullets.update()
#删除消失的子弹
for bullet in bullets.copy():
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
sprite.groupcollide()来检测两个编组成员的碰撞,若两个成员碰撞,就删除他们,(若把第一个True改为False,子弹不会被删除,会继续击落下一个飞船)
对了,此时,主程序中的update_bulleta()还需要传递实参aliens
ck.update_bullets(aliens, bullets)
那么,当我们把外星飞船击毁后,我们需要生成新的外星飞船,
g_fun.py
def update_bullets(my_setting, screen, ship, aliens, bullets):
.......................................
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
if len(aliens) == 0:
bullets.empty()
alien_fleet(my_setting, screen, aliens, ship)
main.py中
ck.update_bullets(my_setting, screen, ship, aliens, bullets)
运行程序,会发现当外星飞船被击落后,会出现新的一批
为了使程序运行流畅,我们重构下update_bullets(),把处理外星人碰撞和处理子弹的程序再创建一个新的函数,
这是目前所有代码集合链接:链接:http://pan.baidu.com/s/1nuO6lTJ 密码:srjj