天涯明月刀ol|天涯明月刀迅雷下载
  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)
 
 其實就一個思路,采用物理世界的碰撞檢測就行
--------------------- 
 
上一篇:星力游戲捕魚概率分析 下一篇:沒有了
捕魚駕到 天涯明月刀ol