Coronaでのカスタムイベントの実装方法です。
ついでに、カスタムイベントを通じて異なるモジュール間での値の受け渡しも実装してみます。
カスタムイベントの定義
まずはそのイベントの定義から。
event/testevent.lua
module( "TestEvent" , package.seeall )
MOVE_START = "TestEvent.MOVE_START";
MOVE_FINISH = "TestEvent.MOVE_FINISH";
function new( _name , _data )
local evt = {};
evt.name = _name;
evt.data = _data;
return evt;
end;
1行目module()
の第一引数で文字列指定しておくと、一度requireしておけば
他モジュールからも永続的に使用出来るようになります。(逆に消し方がよく解りませんが)
イベントの値"TestEvent.MOVE_START"
はどんな文字列でも大丈夫ですが、他のカスタムイベントと重複しないよう注意が必要です。
使用サンプル
main.lua
require( "event.testevent" );
local img_mover = require( "imgmover" );
local function eventTrace( event )
print( event.name );
print( event.data.x );
print( event.data.y );
end;
Runtime:addEventListener( TestEvent.MOVE_START , eventTrace );
Runtime:addEventListener( TestEvent.MOVE_FINISH , eventTrace );
img_mover.moveStart();
imgmover.lua
module(..., package.seeall)
local img = display.newImage( "image.png" );
img.x , img.y = 100 , 100;
local function moveFinish()
local evt = TestEvent.new( TestEvent.MOVE_FINISH , { x=img.x , y=img.y } );
Runtime:dispatchEvent( evt );
end;
function moveStart()
local evt = TestEvent.new( TestEvent.MOVE_START , { x=img.x , y=img.y } );
Runtime:dispatchEvent( evt );
transition.to( img, { time=500, x=200 , y=200 , onComplete=moveFinish } );
end;
結果1(起動時)
TestEvent.MOVE_START
100
100
結果2(0.5秒後)
TestEvent.MOVE_FINISH
200
200
画像をx=100,y=100から0.5秒掛けて200,200に移動させるサンプルです。
動き出した瞬間と移動終了時にそれぞれイベントを発射し、main.lua側に伝達します。
こんな感じで、異なるモジュール間でイベントと値の送受信を簡単に行なうことが出来ますが
規模が大きくなるとカオスになってくるので必要に応じてで。
あと不要になったイベントリスナーはRuntime:removeEventListener
で消すのを忘れずに。