zoukankan      html  css  js  c++  java
  • 用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  

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

  • 相关阅读:
    JAVA多线程知识点
    RabbitMQ和Springboot集成RabbitMQ知识点
    JAVA动态代理cglib或jdk
    [转]解决System.Data.SqlClient.SqlException (0x80131904): Timeout 时间已到的问题的一个方向
    [转]C#判断文档编码格式,并读取文档数据(防止出现乱码)
    create_linux命令写入到sh脚本并删除
    cmd cd切换到d盘
    sql 优化前后
    LISTAGG()WITHIN GROUP()
    使用shell递归遍历文件并打印所有文件名的绝对路径
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4807009.html
Copyright © 2011-2022 走看看