python坦克大战(5)战斗处理与炮弹

坦克大战5

1.战斗处理

class Fire:
    """战斗处理"""
    def __init__(self,view_manager,screen):
        pass

    #随机生成坦克
    #逐次递增每次生成的数量
    def makemonster(self,view_manager,screen,monsters):
        #这里可以设定控制最多生成的坦克数量
        #if len(monsters) >= 10:
        #    #控制总数量
        #    return
    
        #只有当所有敌对坦克被消灭完之后再生成一批新的坦克
        if len(monsters) > 0:
            return

        #屏幕倒计时
        if pv.startmake == False:
            pv.startmake = True
            pv.startmaketime = datetime.datetime.now()            
            return
        #生成怪物倒计时提示
        lostpass = pv.waitmakedelay - (datetime.datetime.now() - pv.startmaketime).seconds 
        if lostpass > 0 :
            #字体
            nowfont = view_manager.font[0]
            hptxt = nowfont.render('敌军' + str(lostpass) + '秒后到达',1,pv.COLOR_BLUE)
            screen.blit(hptxt,(view_manager.screen_width / 2 - 150,view_manager.screen_height / 4))
            return
        #动态增加等待时间,给予玩家休息
        pv.waitmakedelay+=1
        #重置下次生成怪物倒计时开关
        pv.startmake = False
               
        #生成新坦克
        j = 0
        while j < pv.lastmakemonstersnum:
            newmons = Monster(view_manager,screen)
            monsters.append(newmons)
            j+=1

        #下次生成怪物时递增1个
        pv.lastmakemonstersnum+=1

        #关卡计数
        pv.gatenum+=1


    #刷新战斗场景
    def show(self,view_manager,screen,player,monsters):
        #绘制背景地图图片
        if pv.gatenum < 0:
            pv.gatenum = 0

        #根据关卡地图绘制不同的背景        
        screen.blit(view_manager.map[pv.gatenum % 2],(0,0))
        

        #绘制我方坦克
        player.work(screen,view_manager)                      

        if player.is_die() == True:            
            pv.runstate = pv.RUN_STATE_OVER
            return

        #生成怪物
        self.makemonster(view_manager,screen,monsters)

        #绘制怪物
        for m in monsters:
            m.work(screen,view_manager)
    
        #玩家子弹碰撞怪物
        for b in player.bullets:
            if b.is_effect == False:
                continue

            if b.is_bomb == True:
                continue

            #子弹处于哪个怪物的范围,就触发爆炸
            for m in monsters:
                rect = m.getrect(view_manager)
                if rect != None:
                    if b.x >= m.x and b.x <= m.x + rect.width and b.y >= m.y and b.y <= m.y + rect.height :
                        #爆炸
                        b.is_bomb = True
                        #扣减血量
                        m.hp-=b.reducval
                    
        #移除已经无血的怪物
        for b in monsters:
            if b.hp <= 0:
                monsters.remove(b)
                player.kill+=1

        #怪物子弹碰撞玩家
        for m in monsters:
            rect = player.getrect(view_manager)
            if rect != None:
                for b in m.bullets:
                    if b.is_effect == False:
                        continue

                    if b.is_bomb == True:
                        continue

                    #子弹位于玩家的范围,触发爆炸
                    if b.x >= player.x and b.x <= player.x + rect.width and b.y >= player.y and b.y <= player.y + rect.height :
                        #爆炸
                        b.is_bomb = True
                        #扣减血量
                        player.hp-=b.reducval

2.炮弹

class Bullet:
    """炮弹类"""
    def __init__(self,view_manager,screen,x,y,move):
        #造成伤害值
        self.reducval = 15        
        #运动速度
        self.speed = 8
        #运动朝向
        self.move = move
        #坐标
        self.x = x
        self.y = y
        #有效
        self.is_effect = True
        #爆炸状态
        self.is_bomb = False
        #爆炸动画状态 0-6
        self.bomstate = 0
        

    # 根据子弹发射时的朝向获取子弹对应的图片
    def bitmap(self, view_manager): 
        #爆炸
        if self.is_bomb == True:            
            if self.bomstate <= len(view_manager.bomb) - 1:
                #播放爆炸动画
                self.bomstate+=1
                return view_manager.bomb[self.bomstate - 1]

            #爆炸动画播放完毕,消失
            self.is_effect = False
            #播放音乐:发射
            view_manager.sounds[1].play()
            return None

        #竖向子弹
        if self.move == pv.MOVE_UP or self.move == pv.MOVE_DOWN  :
            return view_manager.bullet[0]

        #横向子弹
        if self.move == pv.MOVE_LEFT or self.move == pv.MOVE_RIGHT :
            return view_manager.bullet[1]


    #绘制炮弹
    def draw(self,view_manager,screen):
        bmp = self.bitmap(view_manager)
        if bmp != None:
            if self.is_bomb == True:
                #爆炸动画调整爆炸图片显示位置
                bodyrect = bmp.get_rect()
                screen.blit(bmp,(self.x - bodyrect.width / 2,self.y - bodyrect.height / 2))
            else:
                screen.blit(bmp,(self.x,self.y))


    #炮弹移动
    def move_position(self,view_manager,screen):
        if self.move == pv.MOVE_UP:
            self.y-=self.speed                   

        if self.move == pv.MOVE_DOWN:
            self.y+=self.speed
            
        if self.move == pv.MOVE_LEFT:
            self.x-=self.speed

        if self.move == pv.MOVE_RIGHT:
            self.x+=self.speed

        #超边界失效
        if self.x <= 0 or self.x >= view_manager.screen_width or self.y <= 0 or self.y >= view_manager.screen_height:
            self.is_effect = False
            #这里也可以改成碰到边界爆炸
            #self.is_bomb = True

python坦克大战(6)常量全局变量以及完整游戏下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值