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

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

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

碰撞检测:

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

检测碰撞的函数如下:

  1. function GameScene:checkCollision()  
  2.     --这个方法处理碰撞检测,子弹和敌人的碰撞检测,敌人和player的碰撞检测  
  3.     for k_b,v_b in pairs(self.bullets) do  
  4.        for k_e,v_e in pairs(self.enermy) do  
  5.             if cc.rectIntersectsRect(v_e:getBoundingBox(),v_b:getBoundingBox()) then--检测碰撞  
  6.                local effectSprite = display.newSprite("#explosion_01.png"):addTo(self)--爆炸精灵  
  7.                effectSprite:pos(v_e:getPosition())  
  8.                --这里用了笨方法,在播放完动画后,removeSelf,这个Animation是不是不能更Action一起呢?没有在API中找到答案,我会继续的。  
  9.                effectSprite:playAnimationOnce(self:createAnimation("explosion_0%d.png",0.5,3))  
  10.                local sequence = cc.Sequence:create(cc.DelayTime:create(0.6),  
  11.                     cc.CallFunc:create(function()  
  12.                         effectSprite:removeSelf()  
  13.                     end)  
  14.                )  
  15.                  
  16.                effectSprite:runAction(sequence)  
  17.                    --子弹是一枪毙命,偷懒了  
  18.                v_e.isDead = true   
  19.                v_b.isDead = true  
  20.            end  
  21.        end  
  22.     end  
  23.       
  24.     --清除死亡的子弹和敌人  
  25.     for k_b,v_b in pairs(self.bullets) do  
  26.        if v_b.isDead == true then  
  27.            self.bullets[v_b] = nil  
  28.            v_b:removeSelf()  
  29.        end  
  30.     end  
  31.     for k_e,v_e in pairs(self.enermy) do  
  32.        if v_e.isDead == true then  
  33.             self.enermy[v_e] = nil  
  34.             v_e:removeSelf()  
  35.        end  
  36.     end  
  37. end  
  38. --帧动画从1开始,返回一个真动画  
  39. function GameScene:createAnimation(frameName,delayTime,frameNum)  
  40.     local frames = display.newFrames(frameName,1,frameNum)  
  41.     local animation = display.newAnimation(frames,delayTime / frameNum)  
  42.     return animation  
  43. end  

到这里,我要写的东西就完了,这个程序没有那么精致,但是,其中还是有不少知识点的,相信对于像我一样刚开始接触quick的人来说还是有帮助的,当然,至于程序的细化,实现更复杂的功能,就《微信打飞机来说》,剩下的工作可能就是更改了,应该没多少难点了。

GameScene源码:

  1. require("src/app/scenes/Utils")  
  2. require("src/app/data/EnermyConfig")  
  3. local BulletConfig = require("src/app/data/BulletConfig")  
  4. local BulletSprite = import(".BulletSprite")  
  5. local EnermySprite = import(".EnermySprite")  
  6. local scheduler = require(cc.PACKAGE_NAME .. ".scheduler")  
  7.   
  8. local GameScene = class("GameScene",function ()  
  9.     return display.newScene("GameScene")  
  10. end)  
  11.   
  12. function GameScene:ctor()  
  13.     --加载plist  
  14.     display.addSpriteFrames("explosion.plist", "explosion.png")  
  15.     --添加Player精灵  
  16.     self.player = display.newSprite("hero_1.png"):addTo(self)  
  17.     self.player:pos(display.cx,display.cy)  
  18.     self.player:setLocalZOrder(10)  
  19.     self.touchPos = cc.p(0,0)  
  20.     self.bullets = {}  
  21.     self.enermy = {}  
  22.   
  23.     --添加一个TouchLayer接收点击事件  
  24.     self.touchLayer = display.newColorLayer(cc.c4b(255,0,0,255)):addTo(self)  
  25.     self.touchLayer:setTouchEnabled(true)  
  26.     self.touchLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT,function(event)  
  27.           
  28.         if event.name == "began" then  
  29.             self.touchPos = cc.p(event.x,event.y)  
  30.         elseif event.name == "moved" then  
  31.             local x = event.x - self.touchPos.x ;  
  32.             local y = event.y - self.touchPos.y ;  
  33.             self.touchPos = cc.p(event.x,event.y) ;  
  34.             self:onTouch(x,y) ;  
  35.         else  
  36.             self.touchPos = cc.p(0,0)   
  37.         end  
  38.         return true  
  39.     end)  
  40.     --添加子弹的创建计时器  
  41.     scheduler.scheduleGlobal(function()  
  42.       self:createBullet()  
  43.       self:createEnermy()  
  44.       self:checkCollision()  
  45.     end , 1)  -- 1 为时间  
  46.     --添加碰撞检测的计时器  
  47.     scheduler.scheduleGlobal(function()  
  48.         self:checkCollision()  
  49.     end,1.0 / 60)  -- 1 为时间  
  50. end  
  51.   
  52. function GameScene:onTouch(x,y)  
  53.      --更新飞机的位置,没有对飞机是否会触屏做限制  
  54.     self.player:pos(self.player:getPositionX() + x,self.player:getPositionY() + y)  
  55. end  
  56.   
  57. function GameScene:createBullet()  
  58.     local config = config_bullets[1]  
  59.     local bullet = BulletSprite:create(config):addTo(self)  
  60.     bullet:pos(self.player:getPosition())  
  61.     self.bullets[bullet] = bullet  
  62. end  
  63.   
  64. function GameScene:createEnermy()  
  65.     --print("create enermy schedule")  
  66.     local config = config_enermy[1]  
  67.     local x = math.random(100,400)  
  68.     local y = display.height + 100  
  69.     local enermy = EnermySprite:create(config):addTo(self)  
  70.     enermy:setPosition(cc.p(x,y))  
  71.     self.enermy[enermy] = enermy   
  72. end  
  73. function GameScene:checkCollision()  
  74.     --这个方法处理碰撞检测,子弹和敌人的碰撞检测,敌人和player的碰撞检测  
  75.     for k_b,v_b in pairs(self.bullets) do  
  76.        for k_e,v_e in pairs(self.enermy) do  
  77.             if cc.rectIntersectsRect(v_e:getBoundingBox(),v_b:getBoundingBox()) then  
  78.                local effectSprite = display.newSprite("#explosion_01.png"):addTo(self)  
  79.                effectSprite:pos(v_e:getPosition())  
  80.                --effectSprite:runAction(cc.Sequence(self:createAnimation("explosion_0%d.png",0.5,3),cc.RemoveSelf(),nil))  
  81.                effectSprite:playAnimationOnce(self:createAnimation("explosion_0%d.png",0.5,3))  
  82.                local sequence = cc.Sequence:create(cc.DelayTime:create(0.6),  
  83.                     cc.CallFunc:create(function()  
  84.                         effectSprite:removeSelf()  
  85.                     end)  
  86.                )  
  87.                  
  88.                effectSprite:runAction(sequence)  
  89.                
  90.                v_e.isDead = true   
  91.                v_b.isDead = true  
  92.            end  
  93.        end  
  94.     end  
  95.       
  96.     --清除死亡的子弹和敌人  
  97.     for k_b,v_b in pairs(self.bullets) do  
  98.        if v_b.isDead == true then  
  99.            self.bullets[v_b] = nil  
  100.            v_b:removeSelf()  
  101.        end  
  102.     end  
  103.     for k_e,v_e in pairs(self.enermy) do  
  104.        if v_e.isDead == true then  
  105.             self.enermy[v_e] = nil  
  106.             v_e:removeSelf()  
  107.        end  
  108.     end  
  109. end  
  110. --帧动画从1开始  
  111. function GameScene:createAnimation(frameName,delayTime,frameNum)  
  112.     local frames = display.newFrames(frameName,1,frameNum)  
  113.     local animation = display.newAnimation(frames,delayTime / frameNum)  
  114.     return animation  
  115. end  
  116.   
  117. function GameScene:onEnter()  
  118. end  
  119.   
  120. function GameScene:onExit()  
  121. end  
  122.   
  123. return GameScene  

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

原文地址:https://www.cnblogs.com/dudu580231/p/4807009.html