用Quick3.3简单开发微信打飞机03 添加爆炸动画和子弹与敌机的碰撞

这个就作为最后一篇吧,当然,可以扩展的方面还有很多,比如分数的记录,结算界面还有一些小道具等,就不添加了。这只是当作一个简单的入门,而在这个入门中确实学到了不少东西。而那些没添加的东西呢,其实,就没那么重要了。没有太难的知识点。所以,就没必要纠结太长时间了。


碰撞检测:

碰撞检测重新写了一个计时器,这个计时器是每帧调用的,也就是每秒调用60次。但是,没有用updata。

检测碰撞的函数如下:

function GameScene:checkCollision()
	--这个方法处理碰撞检测,子弹和敌人的碰撞检测,敌人和player的碰撞检测
    for k_b,v_b in pairs(self.bullets) do
       for k_e,v_e in pairs(self.enermy) do
            if cc.rectIntersectsRect(v_e:getBoundingBox(),v_b:getBoundingBox()) then--检测碰撞
               local effectSprite = display.newSprite("#explosion_01.png"):addTo(self)--爆炸精灵
               effectSprite:pos(v_e:getPosition())
               --这里用了笨方法,在播放完动画后,removeSelf,这个Animation是不是不能更Action一起呢?没有在API中找到答案,我会继续的。
               effectSprite:playAnimationOnce(self:createAnimation("explosion_0%d.png",0.5,3))
               local sequence = cc.Sequence:create(cc.DelayTime:create(0.6),
                    cc.CallFunc:create(function()
                        effectSprite:removeSelf()
                    end)
               )
               
               effectSprite:runAction(sequence)
                   --子弹是一枪毙命,偷懒了
	           v_e.isDead = true 
	           v_b.isDead = true
	       end
	   end
	end
	
	--清除死亡的子弹和敌人
	for k_b,v_b in pairs(self.bullets) do
	   if v_b.isDead == true then
	       self.bullets[v_b] = nil
	       v_b:removeSelf()
	   end
	end
	for k_e,v_e in pairs(self.enermy) do
	   if v_e.isDead == true then
            self.enermy[v_e] = nil
            v_e:removeSelf()
	   end
	end
end
--帧动画从1开始,返回一个真动画
function GameScene:createAnimation(frameName,delayTime,frameNum)
	local frames = display.newFrames(frameName,1,frameNum)
	local animation = display.newAnimation(frames,delayTime / frameNum)
	return animation
end
到这里,我要写的东西就完了,这个程序没有那么精致,但是,其中还是有不少知识点的,相信对于像我一样刚开始接触quick的人来说还是有帮助的,当然,至于程序的细化,实现更复杂的功能,就《微信打飞机来说》,剩下的工作可能就是更改了,应该没多少难点了。

GameScene源码:

require("src/app/scenes/Utils")
require("src/app/data/EnermyConfig")
local BulletConfig = require("src/app/data/BulletConfig")
local BulletSprite = import(".BulletSprite")
local EnermySprite = import(".EnermySprite")
local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")

local GameScene = class("GameScene",function ()
    return display.newScene("GameScene")
end)

function GameScene:ctor()
    --加载plist
    display.addSpriteFrames("explosion.plist", "explosion.png")
    --添加Player精灵
    self.player = display.newSprite("hero_1.png"):addTo(self)
    self.player:pos(display.cx,display.cy)
    self.player:setLocalZOrder(10)
    self.touchPos = cc.p(0,0)
    self.bullets = {}
    self.enermy = {}

    --添加一个TouchLayer接收点击事件
    self.touchLayer = display.newColorLayer(cc.c4b(255,0,0,255)):addTo(self)
    self.touchLayer:setTouchEnabled(true)
    self.touchLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)
        
        if event.name == "began" then
            self.touchPos = cc.p(event.x,event.y)
        elseif event.name == "moved" then
            local x = event.x - self.touchPos.x ;
            local y = event.y - self.touchPos.y ;
            self.touchPos = cc.p(event.x,event.y) ;
            self:onTouch(x,y) ;
        else
            self.touchPos = cc.p(0,0) 
        end
        return true
    end)
    --添加子弹的创建计时器
    scheduler.scheduleGlobal(function()
      self:createBullet()
      self:createEnermy()
      self:checkCollision()
    end , 1)  -- 1 为时间
    --添加碰撞检测的计时器
    scheduler.scheduleGlobal(function()
        self:checkCollision()
    end,1.0 / 60)  -- 1 为时间
end

function GameScene:onTouch(x,y)
     --更新飞机的位置,没有对飞机是否会触屏做限制
    self.player:pos(self.player:getPositionX() + x,self.player:getPositionY() + y)
end

function GameScene:createBullet()
    local config = config_bullets[1]
    local bullet = BulletSprite:create(config):addTo(self)
    bullet:pos(self.player:getPosition())
    self.bullets[bullet] = bullet
end

function GameScene:createEnermy()
	--print("create enermy schedule")
	local config = config_enermy[1]
	local x = math.random(100,400)
	local y = display.height + 100
	local enermy = EnermySprite:create(config):addTo(self)
    enermy:setPosition(cc.p(x,y))
	self.enermy[enermy] = enermy 
end
function GameScene:checkCollision()
	--这个方法处理碰撞检测,子弹和敌人的碰撞检测,敌人和player的碰撞检测
    for k_b,v_b in pairs(self.bullets) do
       for k_e,v_e in pairs(self.enermy) do
            if cc.rectIntersectsRect(v_e:getBoundingBox(),v_b:getBoundingBox()) then
               local effectSprite = display.newSprite("#explosion_01.png"):addTo(self)
               effectSprite:pos(v_e:getPosition())
               --effectSprite:runAction(cc.Sequence(self:createAnimation("explosion_0%d.png",0.5,3),cc.RemoveSelf(),nil))
               effectSprite:playAnimationOnce(self:createAnimation("explosion_0%d.png",0.5,3))
               local sequence = cc.Sequence:create(cc.DelayTime:create(0.6),
                    cc.CallFunc:create(function()
                        effectSprite:removeSelf()
                    end)
               )
               
               effectSprite:runAction(sequence)
             
	           v_e.isDead = true 
	           v_b.isDead = true
	       end
	   end
	end
	
	--清除死亡的子弹和敌人
	for k_b,v_b in pairs(self.bullets) do
	   if v_b.isDead == true then
	       self.bullets[v_b] = nil
	       v_b:removeSelf()
	   end
	end
	for k_e,v_e in pairs(self.enermy) do
	   if v_e.isDead == true then
            self.enermy[v_e] = nil
            v_e:removeSelf()
	   end
	end
end
--帧动画从1开始
function GameScene:createAnimation(frameName,delayTime,frameNum)
	local frames = display.newFrames(frameName,1,frameNum)
	local animation = display.newAnimation(frames,delayTime / frameNum)
	return animation
end

function GameScene:onEnter()
end

function GameScene:onExit()
end

return GameScene


由于,自己知识有限,程序可能还有其他问题。如果,有人发现希望指正,大家一起进步吧!!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值