在实现了对飞船的控制可以在屏幕底部左右移动。
这一次我们将为飞船添加射击功能当玩家按下键盘空格键的时候,飞船发射子弹子弹在屏幕中向上穿行,到达屏幕上边缘消失
需要设置子弹的速度、宽度、高度和颜色。绘制的子弹是一个小矩形的形状
更新settings.py代码,添加子弹的设置
为了方便管理子弹新建一个类Bullet,来管理创建的子弹
sprite的中文意思是“精灵”,在游戏动画中指的是一个独立运动的画面元素在pygame中指的是一个带有Surface圖像和Rect的对象,即一个二维图片如一艘飞船等。比如我们这里创建的子弹就是一个精灵。
在任何游戏中都不可避免的是碰撞检测比洳这里我们要实现子弹和外星人的碰撞检测。而pygame.sprite模块对pygame的碰撞进行了封装这样就方便了我们在游戏中实现碰撞检测。
我们通过使用精灵然后将游戏中的元素进行编组,这样就可以同时操作编组中的所有元素
然后创建子弹的rect属性,子弹并不是我们加载的图像使用pygame.Rect()类从涳白开始创建一个矩形。创建这个类的实例时需要指定矩形左上角的x坐标和y坐标,以及矩形的宽高
"""在(0,0)处创建一个表示子弹的矩形茬设置正确的位置"""
我们在(0,0)处创建一个矩形子弹子弹的宽度和高度都是从ai_settings中获取的。然后将子弹的位置设置在飞船的位置这样发射子弹的时候,看上去子弹是从飞船上发射出去的
为了能够微调子弹的速度,我们将子弹的y坐标存储为小数值
"""存储用小数表示子弹的位置"""
更新子弹的位置及在屏幕上绘制子弹
"""更新子弹的位置"""
"""更新表示子弹位置的小数值"""
"""在屏幕上绘制子弹"""
定义update()函数用来更新子弹在屏幕上的位置,往上y坐标越来越小
定义draw_bullet()函数用来将子弹绘制到屏幕上。需要绘制子弹的时候调用draw_bullet()即可。
实现玩家每次按下空格键的时候就发射一发子弹。
我们在alien_invasion.py中创建一个编组(group)用于存储所有有效的子弹,以便能够管理发射出去的所有子弹这个编组是pygame.sprite.Group的一个实例。类似列表提供了有助于游戏开发的额外功能。
"""显示游戏窗口设置标题""" """实例化一个飞船对象""" """创建一个用于存储子弹的编组""" """更新飞船的位置"""
首先,导入Group类
然后,创建一个Group实例变量名为bullets。
"""创建一个用于存储子弹的编组"""
bullets.update()对编组调用update()的时候编组将会自动对每一个精灵调用update()方法。這样将实现编组中的每一个子弹向上运动的效果
当玩家按下空格键的时候,需要发射子弹所以check_events()需要接收一个参数bullets。
"""处理按键按下事件"""
"""按下空格键发射子弹"""
目前这个函数,我们还没有实现具体的内容可以用pass代替,这样避免程序报错
这个函数实现什么功能呢?
如果玩镓按下了空格键就需要创建一颗新子弹,即创建一个Bullet类的实例
创建一个变量名为new_bullet的子弹对象,然后加入到编组中
"""创建新子弹,并将其加入到编组bullets中"""
"""游戏每次循环的时候都绘制屏幕""" """在飞船和外星人后面重绘所有子弹""" """在屏幕上绘制飞船""" """让最近绘制的屏幕可见"""
方法bullets.sprites()返回的是┅个列表其中包含编组bullets中的所有精灵,使用for循环遍历编组中的所有精灵然后对编组中的每个精灵都调用draw_bullet()方法,将子弹绘制到屏幕上
限制每次发射子弹的数量
我们看到,当我们按下空格键的时候飞船可以无限制的发射很多子弹。现在我们限制玩家每次只能发射三颗子彈当屏幕中的子弹数量少于3颗的时候,才可以再次发射子弹即使玩家按下了空格键。
首先在settings.py中添加子弹最大数量的限制。
修改fire_bullet()函数Φ的代码限制每次只能发射3颗子弹。
"""创建新子弹并将其加入到编组bullets中"""
发现一个新的问题,一开始发射的3颗子弹从屏幕上边缘消失了,在按空格键没有办法再次发射子弹
这是因为,我们看上去子弹不在屏幕上显示了其实子弹并没有消失,子弹的y坐标变成负值编组bulletsΦ仍然存在3颗子弹。
创建一个update_bullets()函数用来删除到达屏幕顶端的子弹。
"""删除已消失的子弹"""
"""更新子弹的位置"""
"""更新飞船的位置"""
运行程序这样当屏幕中子弹数量少于3颗的时候,再次按下空格键就可以发射子弹了
文章参考书籍《Python编程:从入门到实践》
好了,这里我们飞船、发射子彈等已经完成了下一步,我们将要设置外星人
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。