在cocos2d-x 3.x封装了物理引擎
在layer中添加几个精灵
require("Cocos2d")
require("Cocos2dConstants")
require("bitExtend")
LayerPhysics=class("LayerPhysics",function ()
return cc.Layer:create()
end)
function LayerPhysics:ctor()
-- 碰撞监听
local conListener=cc.EventListenerPhysicsContact:create();
conListener:registerScriptHandler(function(contact)
print("---contact-碰撞了--")
return true
end,cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
conListener:registerScriptHandler(function()
print("seperate")
end,cc.Handler.EVENT_PHYSICS_CONTACT_SEPERATE)
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(conListener,self)
end
function LayerPhysics:createLayer()
local layer=LayerPhysics.new()
layer:createSprite()
return layer
end
function LayerPhysics:createSprite()
local size=cc.Director:getInstance():getWinSize()
--创建一个围绕屏幕四周的物理边界
local node=cc.Node:create()
node:setPhysicsBody(cc.PhysicsBody:createEdgeBox(size,cc.PHYSICSBODY_MATERIAL_DEFAULT,5))
node:setPosition(size.width/2,size.height/2)
self:addChild(node)
--一个body的CategoryBitmask和另一个body的ContactTestBitmask的逻辑与的结果不等于0时,接触事件将被发出,否则不发送。
--一个body的CategoryBitmask和另一个body的CollisionBitmask的逻辑与结果不等于0时,他们将碰撞,否则不碰撞
--需要两个body相互位与运算的值都是大于0时才会发生碰撞检测和发送接触事件通知
local sp1=cc.Sprite:create("test/logo.png")
local b1=cc.PhysicsBody:createBox(sp1:getContentSize())
b1:setDynamic(false)
-- b1:getShape(0):setFriction(0)
-- b1:getShape(0):setRestitution(1)
-- b1:setCategoryBitmask(0x01) --类别掩码 默认值为0xFFFFFFFF
-- b1:setContactTestBitmask(0x01) --接触掩码 默认值为 0x00000000
-- b1:setCollisionBitmask(0x01) --碰撞掩码 默认值为0xFFFFFFFF
b1:setCategoryBitmask(0x0d)
b1:setContactTestBitmask(0x0d)
b1:setCollisionBitmask(0x0d)
sp1:setPhysicsBody(b1)
sp1:setPosition(60,sp1:getContentSize().height/2)
sp1:setTag(1)
self:addChild(sp1)
print("b1:",b1:isDynamic())
print("bit:"..bit._and(0x0d,0x03))
local sp2=cc.Sprite:create("test/logo.png")
local b2=cc.PhysicsBody:createCircle(sp2:getContentSize().width/2);
b2:setDynamic(true)
-- b2:getShape(0):setFriction(0)
-- b2:getShape(0):setRestitution(1)
-- b2:setCategoryBitmask(0x03)
-- b2:setContactTestBitmask(0x01)
-- b2:setCollisionBitmask(0x01)
b2:setCategoryBitmask(0x03)
b2:setContactTestBitmask(0x03)
b2:setCollisionBitmask(0x03)
sp2:setPhysicsBody(b2)
sp2:setPosition(200,sp2:getContentSize().height/2)
sp2:setTag(2)
self:addChild(sp2)
print("b2:",b2:isDynamic())
local sp3=cc.Sprite:create("test/logo.png")
local b3=cc.PhysicsBody:createBox(sp3:getContentSize())
b3:setDynamic(false)
b3:setCategoryBitmask(0x03)
b3:setContactTestBitmask(0x02)
b3:setCollisionBitmask(0x02)
sp3:setPhysicsBody(b3)
sp3:setTag(3)
sp3:setPosition(250,320)
self:addChild(sp3)
-- cc.Director:getInstance():getRunningScene():getPhysicsWorld():addJoint(
-- cc.PhysicsJointDistance:construct(b1,b2,cc.vertex2F(0,0),cc.vertex2F(0,sp2:getContentSize().width/2)))
-- 只对两个body监听
local l=cc.EventListenerPhysicsContactWithBodies:create(b1,b2)
---
--@param cc.PhysicsContact contact
l:registerScriptHandler(function(contact)
-- 处理游戏中精灵碰撞逻辑
print("getShapeA:",contact:getShapeA():getBody():getNode())
local node1=contact:getShapeA():getBody():getNode()
print("tag:",node1:getTag())
local node2=contact:getShapeB():getBody():getNode()
print("pp")
end, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(l,self)
--触摸监听
local listener=cc.EventListenerTouchOneByOne:create()
listener:setSwallowTouches(true)
---
--@param touch cc.Touch
--@param event cc.Event
listener:registerScriptHandler(function(touch, event)
sp2:getPhysicsBody():setVelocity(cc.p(0,100))
local target = event:getCurrentTarget()
local locationInNode = target:convertToNodeSpace(touch:getLocation())
local s = target:getContentSize()
local rect = cc.rect(0, 0, s.width, s.height)
--触摸点是否在精灵上
if cc.rectContainsPoint(rect, locationInNode) then
return true
end
return false
end,cc.Handler.EVENT_TOUCH_BEGAN)
listener:registerScriptHandler(function(touch,event)
local target = event:getCurrentTarget()
local posX,posY = target:getPosition()
local delta = touch:getDelta()
target:setPosition(cc.p(posX + delta.x, posY + delta.y))
end,cc.Handler.EVENT_TOUCH_MOVED)
local eventDispatcher = self:getEventDispatcher()
-- 精灵2添加触摸事件
eventDispatcher:addEventListenerWithSceneGraphPriority(listener,sp2)
-- 精灵3添加触摸事件
eventDispatcher:addEventListenerWithSceneGraphPriority(listener:clone(),sp3)
end
return LayerPhysics
创建一个带物理世界的场景
require("Cocos2d")
require("Cocos2dConstants")
require("LayerPhysics")
PhysicsScene=class("PhysicsScene",function ()
return cc.Scene:createWithPhysics()
end)
function PhysicsScene:create()
local scene=PhysicsScene.new();
-- 设置PhysicsWorld调试(有红色的框框)
scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
-- scene:getPhysicsWorld():setSpeed(20)
local layer=LayerPhysics:createLayer()
scene:addChild(layer)
return scene
end
return PhysicsScene
require("bitExtend")
print("bit:"..bit._and(0x0d,0x03))