前言
之前的文章,已经把基础的游戏功能完成了,就像我们之前项目先写好了基础代码一样,游戏基础的逻辑代码已经编写完毕,后面我们会一步步的填充这个游戏的功能。
我的文章内容和功能实现顺序和原文教学并不是一模一样,是我自己学了这部分以后,重新再写一遍的时候写的思路一些。由于工作的原因有点断断续续不连贯,不习惯的可以直接按书中的内容进行学习即可。
刷新外星人
在游戏中,有两种情况我们需要在窗口中刷新外星人:
- 外星人全部被消灭
- 飞船坠毁
第一种是因为外星人被消灭完了,必须生在新的外星人继续游戏。
第二种就是因为飞船坠毁了我们需要清屏,飞船会刷新在窗口底部中央的位置,外星人就从窗口顶部开始重新向下移动。在我们的设定中,外星人撞击到飞船就会使得飞船坠毁。
接下来,针对这两种情况,进行代码编写。
消灭全部外星人
之前的文章中,我们在子弹的移动函数中进行子弹与外星人的碰撞处理,因此我们继续在这个函数中继续往下编写代码。
首先,之前我们已经编写过生成外星人组的函数,我们直接调用它。
def update_bullets(bullets, aliens, setting, screen):
"""更新子弹"""
bullets.update()
# 删除已经消失的子弹
for bullet in bullets.copy():
# 当子弹矩形底部坐标小于0,说明子弹已经出了上边界
if bullet.rect.bottom <= 0:
bullets.remove(bullet)
pygame.sprite.groupcollide(bullets, aliens, True, True)
if len(aliens) == 0:
create_fleet(setting, screen, aliens)
由于之前没有setting
和screen
两个参数,所以我们需要在main
模块中调用update_bullets
函数的位置增加这两个参数。
import pygame
from pygame.sprite import Group
import alien_invasion.game_functions as gf
from alien_invasion.setting import Setting
from alien_invasion.ship import Ship
def run_game():
"""启动游戏"""
# 初始化pygame
pygame.init()
# 定义一个系统设置对象
setting = Setting()
# 新建窗口
screen = pygame.display.set_mode((setting.screen_width, setting.screen_height))
# 窗口命名
pygame.display.set_caption(setting.caption)
# 定义一个飞船对象
ship = Ship(setting, screen)
# 创建子弹编组
bullets = Group()
# 创建外星人编组
aliens = Group()
# 创建编组内的外星人
gf.create_fleet(setting, screen, aliens)
while True:
# 处理监听事件
gf.check_event(ship, setting, screen, bullets)
# 移动飞船
ship.move()
# 更新子弹位置
gf.update_bullets(bullets, aliens, setting, screen)
# 更新外星人
gf.update_aliens(aliens, setting, ship)
# 刷新屏幕
gf.update_screen(setting, screen, ship, bullets, aliens)
if __name__ == '__main__':
run_game()
代码编写完后,启动main
模块,击毁窗口中所有的外星人,看看效果,不出所料在外星人被击毁完毕后重新生成了一批新的外星人。
当然,我们的子弹还是存在的没有清空掉,这个子弹要不要清空,大家自行决定。
撞击飞船
与前一种刷新方式一下,我们回到外星人移动的函数,在暂停后清空外星人,并重新生成。
def update_aliens(aliens, setting, ship):
check_fleet_edges(aliens, setting)
aliens.update()
if pygame.sprite.spritecollideany(ship, aliens):
ship.center_ship()
sleep(0.5)
aliens.empty()
create_fleet(setting, ship.screen, aliens)
这里我们将暂停时间修改为0.5秒。由于创建外星人的函数参数在本函数中都存在,所以我们不需要对main
模块进行修改,直接启动就行。
启动后,我们主动移动飞船撞击外星人,在短暂暂停后,飞船回到底部中央,外星人也重新在顶部刷新。
结尾
外星人的刷新功能比较简单就完成了,后面我们加上一个游戏状态的功能以及按钮光标等(原书的内容)。
加油!!!