Lua_物理引擎

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值