PR

イベント処理

Cocos Code IDEとLua言語を使ったサンプルコードと例文集です。

タッチイベント処理をする

タッチイベントのサンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を下記のサンプルコードと書き換えます。 実行して画面をタッチ(クリック)すると座標位置がログに表示されます。

function GameScene.create()
    local scene = GameScene.new()

    -- タッチイベントで呼ばれる関数
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()
        print(string.format("location = %0.2f, %0.2f", location.x, location.y)) -- この行は確認のためログに表示するためのもので、必要ありません。
        return true -- beganはtrueを返すようにする
    end

    local function onTouchMoved(touch, event)
    end

    local function onTouchEnded(touch, event)
    end

    -- タッチイベントの登録
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )
    listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED )
    listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED )

    local eventDispatcher = scene:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, scene)

    return scene
end

タッチイベントでスプライトがタッチされているかを調べる

onTouchBegan関数内などでcc.rectContainsPoint関数を使ってタッチされた座標がスプライトの矩形内にあるかどうかを調べます。

local location = touch:getLocation()
if cc.rectContainsPoint(sprite:getBoundingBox(), location) then
    -- スプライトがタップされた
end

スケジューリング処理をする

一定時間ごとあるいは毎フレームごとに処理を呼び出します。時間は必ずしも正確ではないので、呼び出し先では前回からの経過時間をチェックするようにします。

スケジューリング処理のサンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を下記のサンプルコードと書き換えます。

function GameScene.create()
    local scene = GameScene.new()

    local function func(dt)
        print(string.format("%f", dt)) -- dtには前回の呼び出しからの経過時間が入ります。
    end

    local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(func, 5, false)

    return scene
end

updateの代わりの関数

C++でCocos2d-xを使うときのupdateの代わりの関数を用意する方法です。サンプルプログラムの関数名がtickなので、それにならっています。

local function tick(dt)

end
-- 毎フレームtickを呼び出す
local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false)
-- 使い終わったら登録を解除する
-- cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)

スケジューリングの解除

必要がなくなった時や、ノードのexitイベントなどでスケジュールを解除するようにします。

cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)

ノードのイベント処理をする

C++でのonExitやonEnterTransitionDidFinishのようなイベント処理を行います。

ノードのイベント処理のサンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を下記のサンプルコードと書き換えます。 実行するとシーン遷移後と終了時にログが表示されます。

function GameScene.create()
    local scene = GameScene.new()

    local function onNodeEvent(event)
        if "enterTransitionFinish" == event then
            -- シーン遷移後に行う処理
            print("enterTransitionFinish")
        end
        if "exit" == event then
            -- 終了時の処理
            print("exit")
        end
    end

    scene:registerScriptHandler(onNodeEvent)

    return scene
end

イベントハンドラの解除

unregisterScriptHandler()メソッドでイベントハンドラの登録を解除することができます。

scene:unregisterScriptHandler()
Copyright(C) 2014 - 2015 「Cocos Code IDEとLua言語でゲームを作る」逆引き辞典for Lua All rights Reserved.