1. 当前所在位置:
  2. 首页
  3. 公告

cocos-Lua 捕鱼碰撞检测方法

2018-12-18 admin
在Lua中不用物理引擎的检测碰撞会很卡,Lua的for循环的效率比C++的低几十倍
 
那样的话,怎么处理呢?我在想能不能把碰撞检测的过程扔到C++中处理呢
 
后来发现cocos2dx中有一个物理世界,可以进行碰撞检测,于是把碰撞检测的处理扔到那去处理,发现在玩时就没有那么卡了
 
首先先绑定一个碰撞检测的事件,然后创建每个鱼的PhysicsBody,还有就是设置物理掩码,都设置为无碰撞效果,只需要检测是否碰撞到了
 
   local box = cc.PhysicsBody:createCircle(self._sp:getContentSize().width/3)
   box:setDynamic(true)
   box:setCategoryBitmask(1)  
   box:setContactTestBitmask(1)  
   box:setCollisionBitmask(2)
   self._sp:setPhysicsBody(box)
因为我们只是需要检测子弹与鱼是否碰撞到,不需要显示碰撞效果,所以掩码都一样
 
 
 
添加的碰撞检测事件
 
    local conListener=cc.EventListenerPhysicsContact:create()
    conListener:registerScriptHandler(function(contact)  
        local node1=contact:getShapeA():getBody():getNode()  
        local node2=contact:getShapeB():getBody():getNode()
        if not node1 or not node2 then return end 
        if node1:getName() ~= node2:getName() then
            local fish = nil
            local vB = nil
            if node1:getName() == "Bullet" then
                vB = node1:getParent()
                fish = node2:getParent()
            else
                vB = node2:getParent()
                fish = node1:getParent()
            end
            if not vB._isAlive then
                return
            end
            if vB._isLockFishID ~= 0 and fish._id~=vB._isLockFishID then
                return
            end
            --播放鱼被击中的效果
            self:showHitFish(fish)
            --播放撒网动作
            local vBPos = cc.p(vB._sp:getPositionX(),vB._sp:getPositionY())
            self:FallingNet(vBPos, vB)
            local info = 
            {
                chairId = self._deskNum,
                fishId = fish._id,
                bulletKind = vB._buttleMultiplePicNum,
                bulletId = vB._id,
                bulletMulriple = vB._buttleMultiple,
                eventType = LKPY_NOTIFY_AssistantID.SUB_C_CATCH_FISH,
            }
            self._callback(info)
            for k,v in pairs(self._bulletList) do
                if v._id == vB._id or v._isKnockBall == 0 then
                    table.remove(self._bulletList,k)
                    v:disappear()
                    break
                end
            end 
        end
        return true  
    end,cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)  
    cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(conListener,self)
 
 其实就一个思路,采用物理世界的碰撞检测就行
--------------------- 
 
上一篇:星力游戏捕鱼概率分析 下一篇:没有了
捕鱼驾到