axmol/CC_LUA_ENGINE_README.mdown

5.6 KiB

Cocos2d-x *NEW* Lua Engine README

Main features

  • Support autorelease CCObject object.
  • Call Lua function from C++ (local, global, closure), avoid memory leaks.
  • Add CCNode:setPosition(x, y), CCNode::getPosition() huge performance boost.
  • Remove needless class and functions from tolua++ .pkg files, improved performance.
  • CCMenuItem script callback.
  • CCNode onEnter/onExit events handler.
  • CCLayer touch & multi-touches events handler.
  • Build-in Lua modules: cjson, luasocket.

Changes

  • [del] remove old script support from all
  • [add] ccConfig.h, define CC_LUA_ENGINE_ENABLED, CC_LUA_ENGINE_DEBUG macro
  • [add] CCPlatformMacros.h, define LUALOG macro
  • [add] CCObject::m_uLuaID used for Lua VM tracking C++ object
  • [add] CCObject::~CCObject() call CCLuaEngine::removeCCObjectByID()
  • [add] CCNode add some methods for fast read/write position
    const CCPoint& getPositionLua(void);
    void getPosition(float* x, float* y);
    float getPositionX(void);
    float getPositionY(void);
    void setPositionX(float x);
    void setPositionY(float y);
    void setPosition(float x, float y);
    void setPositionInPixels(float x, float y);
  • [add] CCNode::getChildrenCount() for Lua
  • [add] CCNode::registerScriptHandler() enable onEnter/onExit event script callback
  • [add] CCNode::unregisterScriptHandler()
  • [add] CCMenuItem::registerScriptHandler()
  • [add] CCMenuItem::unregisterScriptHandler()
  • [add] CCMenuItem::activate() default implements call script callback if exist
  • [add] CCMenuItem::m_uScriptHandlerFuncID save Lua function reference
  • [add] CCLayer::m_uScriptHandlerFuncID save Lua function reference
  • [add] ccTouchBegan(), ccTouchMoved(), ccTouchEnded(), ccTouchCancelled(), ccTouchesBegan(), ccTouchesMoved(), ccTouchesEnded(), ccTouchesCancelled() default implements are used to call script callback if exist
  • [add] CCLayer::registerScriptTouchHandler()
  • [add] CCLayer::unregisterScriptTouchHandler()
  • [add] CCTimer::timerWithScriptFuncID()
  • [add] CCTimer::initWithScriptFuncID()
  • [add] CCTimer::m_uScriptFuncID
  • [add] CCScheduler::scheduleScriptFunc()
  • [add] CCScheduler::unscheduleScriptEntry()
  • [add] CCScheduler::m_pScriptEntries
  • [add] add Lua module: cjson, luasocket

How to use

CCNode onEnter/onExit events handler

CCNode:registerScriptHandler() register callback function for onEnter/onExit events。Callback function auto unregister after onExit() called.

local function createScene()
    local scene = CCScene:node()

    

    local function sceneEventHandler(eventType)
        if eventType == kCCNodeOnEnter then
            if scene.onEnter then scene:onEnter() end
        else
            if scene.onExit then scene:onExit() end
        end
    end

    scene:registerScriptHandler(sceneEventHandler)

    return scene
end

local scene = createScene()
function scene:onEnter()
    print("on scene enter")
end
fucntion scene:onExit()
    print("on scene exit")
end

CCDirector:sharedDirector():runWithScene(scene)

Touch and multi-touches events handler

local function onTouch(eventType, x, y)
    -- eventType is CCTOUCHBEGAN, CCTOUCHMOVED,
    -- CCTOUCHENDED or CCTOUCHCANCELLED
    -- x, y is touch position (use cocos2d-x/OpenGL coordinate)
end

local function onTouches(eventType, touches)
    -- touches is x1, y1, x2, y2, x3, y3, ...
    for i = 1, #touches, 2 do
        local x, y = touches[i], touches[i + 1]
        print(x, y)
    end
end

local layer = CCLayer:node()

-- enable touch events callback
layer:registerScriptTouchHandler(onTouch, false)  -- for single touch
OR
layer:registerScriptTouchHandler(onTouches, true) -- for multi-touches

-- remove touch events callback
layer:unregisterScriptTouchHandler()

Schedule callback

scheduler module:

module("scheduler", package.seeall)

scheduler = CCScheduler:sharedScheduler()

function enterFrame(listener, isPaused)
    return scheduler:scheduleScriptFunc(listener, 0, isPaused or false)
end

function schedule(listener, interval, isPaused)
    return scheduler:scheduleScriptFunc(listener, interval, isPaused or false)
end

function unschedule(handle)
    scheduler:unscheduleScriptEntry(handle)
end
remove = unschedule

function performWithDelay(time, listener)
    local handle
    handle = scheduler:scheduleScriptFunc(function()
        scheduler:unscheduleScriptEntry(handle)
        listener()
    end, time, false)
    return handle
end

use:

require("scheduler")

local handle -- save script callback ID

-- schedule every frame update
local frameCount = 0
local function onEnterFrame(dt)
    -- dt is float number
    frameCount = frameCount + 1
    if frameCount >= 60 then
        -- unschedule callback
        scheduler.unschedule(handle)
    end
end

handle = scheduler.enterFrame(onEnterFrame)

-- print message after delay
scheduler.performWithDelay(0.5, function()
    print("delay 0.5 second")
end)

Create menu

local function onPlayButtonTap()
    print("PLAY NOW")
end

local button = CCMenuItemSprite:itemFromNormalImage("playButton.png", "playButton.png")
button:setPosition(100, 200)
button:registerScriptHandler(onPlayButtonTap)

local menu = CCMenu:node()
menu:addChild(button)
scene:addChild(menu)

TODO

  • When C++ object deleted, remove Lua userdata
  • Improvement tolua_isusertype()