美文网首页
用python3从零开始开发一款烧脑射击游戏#4

用python3从零开始开发一款烧脑射击游戏#4

作者: 李相赫的乐芙兰 | 来源:发表于2019-01-28 18:01 被阅读28次

    上回说到将小方块放置到真实的游戏场景中,并增加阻挡
    今天我们再添加新的元素:子弹

    用python3从零开始开发一款烧脑射击游戏#4

    可以看到子弹是一些快速自动向前移动的“小小方块”,它的生命历程是这样的:
    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()
    

    完整的代码从这里获取

    相关文章

      网友评论

          本文标题:用python3从零开始开发一款烧脑射击游戏#4

          本文链接:https://www.haomeiwen.com/subject/fkfzjqtx.html