上回说到将小方块放置到真实的游戏场景中,并增加阻挡
今天我们再添加新的元素:子弹
可以看到子弹是一些快速自动向前移动的“小小方块”,它的生命历程是这样的:
1.被玩家控制的小方块发射出来
2.沿着射出的方向一直移动
3.碰到阻挡或者地图边界后消失
4.碰到其他玩家会消失(这个会在后续实现了多人在线游戏后再实现)
子弹也是一个“单位”,我们用另外一个类来定义它
class Bullet(object):
def __init__(self,id,x,y,dir,ms):
self.id = id
self.x = x#当前坐标
self.y = y#当前坐标
self.dir = dir#移动方向
self.ms = ms#移动速度
从演示中可以看出,同一时间场景内可能会存在多个子弹
所以我们用一个数组来存放当前正在飞行中的子弹
bullet_list = []
而子弹碰到阻挡或者地图边界后消失,我们需要把发生碰撞的子弹记下来,并且从bullet_list中删除
del_list = []
用来存放这一帧中所有发生碰撞需要被删除的子弹
这里特别说明一下,不推荐发生碰撞时直接从bullet_list中remove,尽量不要在遍历一个数组时对这个数组执行删除操作
由于子弹被发射出去后不需要玩家后续的控制,可以一直向前移动,我们这样实现Bullet类的Move函数
def Move(self):
tx = self.x + Dx[self.dir]
ty = self.y + Dy[self.dir]
if(OnBlock(tx,ty,BulletSize,BulletSize)):#碰到了阻挡或者地图边界,需要删除子弹
del_list.append(self.id)
else:#更新子弹坐标并绘制
self.x = tx
self.y = ty
pygame.draw.rect(screen,color1,Rect(self.x,self.y,BulletSize,BulletSize))
我们再来看怎么处理发射子弹
发射一颗子弹其实就是创建了一个Bullet类的对象
然后为了防止玩家一直按发射键,我们控制一下发射的速度
我们在Robot类的Update函数中加入这样一段代码:
if (key_press[K_SPACE]):
nowtime = time.time()
if(nowtime > self.shoot_time + 1):
self.shoot_time = nowtime#记录玩家的发射时间
px = self.x + RobotSize//2 - BulletSize//2
py = self.y + RobotSize//2 - BulletSize//2
bul = Bullet(total_bullet,px,py,self.dir,RobotSize)#创建一个子弹对象
bullet_list.append(bul)#加入全局的子弹管理列表中
total_bullet += 1
最后我们在主循环中统一更新子弹的位置,以及删掉碰到阻挡的子弹
while True:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.fill(color)#绘制屏幕
robot.Update()#玩家移动
for bul in bullet_list:
bul.Move()#子弹移动
for id in del_list:#删除碰到阻挡的子弹
for bul in bullet_list:
if bul.id == id :
bullet_list.remove(bul)
break
del_list.clear()
完整的代码从这里获取
网友评论