require "Cocos2d"
require "Cocos2dConstants"
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
cclog("----------------------------------------")
cclog("LUA ERROR: " .. tostring(msg) .. "\n")
cclog(debug.traceback())
cclog("----------------------------------------")
return msg
end
local function main()
collectgarbage("collect")
--避免内存泄漏
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
--初始化导演
local director = cc.Director:getInstance()
local glview = director:getOpenGLView()
if glview == nil then
glview = cc.GLView:createWithRect("HelloLua", cc.rect(0, 0, 960, 640))
director:setOpenGLView(glview)
end
glview:setDesignResolutionSize(960, 640, cc.ResolutionPolicy.SHOW_ALL)
--显示帧率
director:setDisplayStats(true)
--设置帧率
director:setAnimationInterval(1.0 / 60)
--增加搜索路径
cc.FileUtils:getInstance():addSearchPath("src")
cc.FileUtils:getInstance():addSearchPath("res")
--创建场景
local scene = require("GameScene")
local settingScene = scene.create()
--运行场景
if cc.Director:getInstance():getRunningScene() then
cc.Director:getInstance():replaceScene(settingScene)
else
cc.Director:getInstance():runWithScene(settingScene)
end
end
xpcall(main, __G__TRACKBACK__)
require "Cocos2d"
require "Cocos2dConstants"
local size = cc.Director:getInstance():getWinSize()
local debug = true
cclog = function(...)
if debug then
print(string.format(...))
end
end
local GameScene = class("GameScene",function()
local scene = cc.Scene:createWithPhysics()
scene:getPhysicsWorld():setDebugDrawMask(cc.PhysicsWorld.DEBUGDRAW_ALL)
return scene
end)
function GameScene:ctor()
self.visibleSize = cc.Director:getInstance():getVisibleSize()
self.origin = cc.Director:getInstance():getVisibleOrigin()
end
function GameScene.create()
local scene = GameScene.new()
scene:addChild(scene:createPhysicsLayer())
return scene
end
function GameScene:createPhysicsLayer()
local layer = cc.Layer:create()
self.layer = layer
local body = cc.PhysicsBody:createEdgeBox(size, cc.PHYSICSBODY_MATERIAL_DEFAULT, 5.0)
local edgeNode = cc.Node:create()
edgeNode:setPosition(cc.p(size.width/2.0, size.height/2.0))
edgeNode:setPhysicsBody(body)
layer:addChild(edgeNode)
--单点触摸
local function touchBegan(touch, event)
local location = touch:getLocation()
self:addNewSpriteAtPosition(location)
return false
end
local listener = cc.EventListenerTouchOneByOne:create()
listener:setSwallowTouches(true)
listener:registerScriptHandler(touchBegan, cc.Handler.EVENT_TOUCH_BEGAN)
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(listener, layer)
--碰撞检测
local function onContactBegin(contact)
cclog("onContactBegin")
local spriteA = contact:getShapeA():getBody():getNode()
local spriteB = contact:getShapeB():getBody():getNode()
if spriteA and spriteA:getTag() == 1 and spriteB and spriteB:getTag() == 1 then
spriteA:setColor(cc.c3b(255, 255, 0))
spriteB:setColor(cc.c3b(255, 255, 0))
end
return true
end
local function onContactPreSolve(contact)
cclog("onContactPreSolve")
return true
end
local function onContactPostSolve(contact)
cclog("onContactPostSolve")
end
local function onContactSeperate(contact)
cclog("onContactSeperate")
local spriteA = contact:getShapeA():getBody():getNode()
local spriteB = contact:getShapeB():getBody():getNode()
if spriteA and spriteA:getTag() == 1 and spriteB and spriteB:getTag() == 1 then
spriteA:setColor(cc.c3b(255, 255, 255))
spriteB:setColor(cc.c3b(255, 255, 255))
end
end
local contactListener = cc.EventListenerPhysicsContact:create()
contactListener:registerScriptHandler(onContactBegin, cc.Handler.EVENT_PHYSICS_CONTACT_BEGIN)
contactListener:registerScriptHandler(onContactPreSolve, cc.Handler.EVENT_PHYSICS_CONTACT_PRESOLVE)
contactListener:registerScriptHandler(onContactPostSolve, cc.Handler.EVENT_PHYSICS_CONTACT_POSTSOLVE)
contactListener:registerScriptHandler(onContactSeperate, cc.Handler.EVENT_PHYSICS_CONTACT_SEPERATE)
cc.Director:getInstance():getEventDispatcher():addEventListenerWithSceneGraphPriority(contactListener, layer)
return layer
end
function GameScene:addNewSpriteAtPosition(pt)
local spriteA = cc.Sprite:create("Ball.png")
spriteA:setTag(1)
local bodyA = cc.PhysicsBody:createCircle(spriteA:getContentSize().width/2.0)
bodyA:setContactTestBitmask(0x1)
spriteA:setPhysicsBody(bodyA)
spriteA:setPosition(pt)
self.layer:addChild(spriteA)
local spriteB = cc.Sprite:create("Ball.png")
spriteB:setTag(1)
local bodyB = cc.PhysicsBody:createCircle(spriteB:getContentSize().width/2.0)
bodyB:setContactTestBitmask(0x1)
spriteB:setPhysicsBody(bodyB)
spriteB:setPosition(pt.x, pt.y - 120)
self.layer:addChild(spriteB)
local world = self:getScene():getScene():getPhysicsWorld()
local joint = cc.PhysicsJointDistance:construct(bodyA, bodyB, cc.p(0, 0), cc.p(0, spriteB:getContentSize().width / 2))
world:addJoint(joint)
end
return GameScene