用Quick-Cocos2d-x 3.3简单开发微信打飞机 -03 添加爆炸动画和子弹与敌机的碰撞

前言

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


正文

碰撞检测:

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

检测碰撞的函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
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

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


感谢本文笔者(最后的牛仔)的分享,Cocos引擎中文官网欢迎更多的开发者分享开发经验。来稿请发送至:support@cocos.org

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值