赞
踩
本篇我们实现我们小游戏外星人大战的子弹相关实现。
首先,我们创建一个子弹类:
import pygame
from pygame.sprite import Sprite
# 子弹类
class Bullet(Sprite):
def __init__(self, screen, ship):
super().__init__()
# 要绘制到的屏幕
self.screen = screen
# 子弹宽度
self.bullet_width = 4
# 子弹高度
self.bullet_height = 8
# 子弹移动速度
self.bullet_speed_factor = 1
# 子弹背景色
self.bullet_background = (60, 60, 62)
# 子弹外接矩形
self.bullet_rect = pygame.Rect(0, 0, self.bullet_width, self.bullet_height)
# 子弹横轴坐标
self.bullet_rect.centerx = ship.air_ship_rect.centerx
# 子弹纵轴坐标--和飞船top一样,这样看起来就是从飞船射击出去的
self.bullet_rect.top = ship.air_ship_rect.top
# 小数存储y坐标
self.bullet_y = float(self.bullet_rect.y)
def update(self):
"""
更新子弹位置,向屏幕上方移动
"""
# 更新纵轴坐标
self.bullet_y -= self.bullet_speed_factor
# 更新子弹rect
self.bullet_rect.y = self.bullet_y
def blitme(self):
"""
在指定屏幕绘制子弹
"""
# 绘制子弹
pygame.draw.rect(self.screen, self.bullet_background, self.bullet_rect)
其中只有两个方法,一个是绘制子弹的方法,一个是更新子弹位置的方法。每行代码都有注释,就不给大家一一说明了。
类创建完成后,我们需要在我们的控制类中添加对应的按键处理,这里我们选择使用空格键作为子弹发射的按键:
def listening_key_down(self, event):
"""
监听key_down事件
:param event:
"""
if event.key == pygame.K_RIGHT:
self.air_ship.move_right = True
elif event.key == pygame.K_LEFT:
self.air_ship.move_left = True
# 按下空格时创建一颗子弹,并添加之编组中去
elif event.key == pygame.K_SPACE:
self.bullet_add()
bullet_add方法生成一颗子弹,并且添加到子弹编组中去:
def bullet_add(self):
"""
添加子弹到编组
"""
bullet = Bullet(self.screen, self.air_ship)
self.bullets.add(bullet)
在控制类中我们声明这个编组:
# 声明子弹编组
self.bullets = Group()
这里面有一个新的概念:Group和Sprite
详细的介绍可以参考官方文档:
https://www.pygame.org/docs/ref/sprite.html
简单来说我们可以将我们游戏中的每一个元素看做是一个Sprite也就是精灵,这个可以当做是游戏对象的基类。至于Group则类似于一个列表,只不过这个列表给我们提供了一些很便捷的方法,可以方便的控制我们的精灵元素。比如,我们要更新子弹时,最开始想到的是用一个循环来做,依次调用子弹的update方法,而放入这个编组后,我们可以直接通过group的update方法更新所有的子弹。
最方便的是,我们可以通过pygame方便的对编组进行边缘碰撞的检测,这也是我们为什么会使用group的原因。
就像上面说的,我们最后一个步骤当然是要更新子弹后创建子弹了:
while True:
....
# 更新子弹
self.bullets.update()
在我们的update_game_screen方法中增加子弹绘制:
# 绘制子弹
for bullet in self.bullets.sprites():
bullet.blitme()
运行效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。