quick-cocos2d-x 飞机大战(打飞机)小demo教程------碰撞检测以及胜负


--其实能把这个文件直接覆盖的,你对比一下没多少区别的
--导入lua文件
--定时器
scheduler = require("framework.scheduler")
--主角飞机
local Role = import("..Obj.Role")
--敌人
local Enemy = import("..Obj.Enemy")
--子弹
local Bullet = import("..Obj.Bullet")


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

function MainScene:ctor()
	self.plane = Role.new()
	--添加主角飞机在场景
    self:addChild(self.plane)

    --保存敌人的容器
	self.arrayEnemy = CCArray:create()
	self.arrayEnemy:retain()

	--保存子弹的容器
	self.arrayBullet = CCArray:create()
	self.arrayBullet:retain()


end

--生产敌人的定时器回调函数
function MainScene:newEnemy( dt )
    local planeEnemy = Enemy.new()
    planeEnemy:pos(math.random(50,display.sizeInPixels.width-50), display.cy*2)
    self:addChild(planeEnemy)
    self.arrayEnemy:addObject(planeEnemy)
    --print(arrayEnemy:count() .. "arrayEnemy")
end

--生产子弹的定时器回调函数
function MainScene:newBullet( dt )
    local roleBullet = Bullet.new()
    self:addChild(roleBullet)
    roleBullet:pos(self.plane:getPositionX(),self.plane:getPositionY())
    roleBullet:runBullet()
    self.arrayBullet:addObject(roleBullet)
    --print(arrayBullet:count() .. "arrayBullet")
end

--检测碰撞的定时器回调函数
function MainScene:onCollision( dt )
    --敌人跟子弹的碰撞 如果碰撞那么就要在场景内删除对象和在容器内删除
    for i=0, self.arrayEnemy:count()-1 do
        for j=0, self.arrayBullet:count()-1 do
            local enemyObj = tolua.cast(self.arrayEnemy:objectAtIndex(i), "CCNode")
            local bulletObj = tolua.cast(self.arrayBullet:objectAtIndex(j), "CCNode")

            --敌人超过屏幕还没死就自动删除
            if enemyObj:getPositionY() == -480 then
                enemyObj:removeFromParent()
                self.arrayEnemy:removeObjectAtIndex(i)
                return
            end

            --子弹超出屏幕范围还没消失自动删除
            if bulletObj:getPositionY() == 480 then
                bulletObj:removeFromParent()
                self.arrayBullet:removeObjectAtIndex(j)
                return
            end

            --敌人跟子弹碰撞判断
            if  enemyObj:boundingBox():intersectsRect(bulletObj:boundingBox()) then
                enemyObj:removeFromParent()
                bulletObj:removeFromParent()
                self.arrayEnemy:removeObjectAtIndex(i)
                self.arrayBullet:removeObjectAtIndex(j)
                return
            end
        end
    end

    --敌人跟主角飞机的碰撞以及判断结果 如果碰撞那么就要在场景内删除对象和在容器内删除
    for i=0, self.arrayEnemy:count()-1 do
        local enemyObj = tolua.cast(self.arrayEnemy:objectAtIndex(i), "CCNode")

        if self.plane:boundingBox():intersectsRect(enemyObj:boundingBox()) then
            self.plane:removeFromParent()
            scheduler.unscheduleGlobal(self.handle1)
            scheduler.unscheduleGlobal(self.handle2)
            scheduler.unscheduleGlobal(self.handle3)
            self:addChild(ui.newTTFLabel({text = "Game Over", font = "黑体", size = 40}):pos(display.cx, display.cy))
        end

    end

end


function MainScene:onEnter()

    --初始化启动三个定时器
    self.handle1 = scheduler.scheduleGlobal(handler(self, self.newEnemy), 0.5)
    self.handle2 = scheduler.scheduleGlobal(handler(self, self.newBullet), 0.5)
    self.handle3 =  scheduler.scheduleGlobal(handler(self, self.onCollision), 0)

end

function MainScene:onExit()

    --用完手尾要好,清除它们
    self.arrayEnemy:release()
    self.arrayBullet:release()

end



return MainScene


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值