@Soin08,
I use ‘custom’ events extensively in my apps and games. Here is my approach (very simple):
First, I have shortcut code to make writing event code faster (I simply run this before my game code loads):
local getTimer = system.getTimer local pairs = \_G.pairs \_G.listen = function( name, listener ) Runtime:addEventListener( name, listener ) end \_G.ignore = function( name, listener ) Runtime:removeEventListener( name, listener ) end \_G.post = function( name, params, debuglvl ) local params = params or {} local event = { name = name } for k,v in pairs( params ) do event[k] = v end if( not event.time ) then event.time = getTimer() end Runtime:dispatchEvent( event ) end
Second, I use it like this:
local function onChangeColor( self, event ) -- Dummy code for this example: self:setFillColor( unpack(event.color) ) for k, v in pairs(event) do print(k,v) end end ... local tmp = display.newCircle( ... ) tmp.onChangeColor = onChangeColor listen( "onChangeColor", tmp ) ... post( "onChangeColor", { color = {1,1,0} } ) -- Circle changes to YELLOW ... post( "onChangeColor", { color = {0,1,1} } ) -- Circle changes to CYAN ignore( "onChangeColor", tmp ) -- Stop listening for event post( "onChangeColor", { color = {1,1,1} } ) -- Circle stays CYAN since it isn't listening.
Finally, removing the object kills the listener automatically so this code is safe and easy to work with.
Note: I usually have cleanup code in my listeners however for extra safety like this:
-- Safer listener local function onChangeColor( self, event ) if( self.removeSelf == nil) then -- Not a display object any more, probably got deleted/removed ignore( "onChangeColor", self ) end -- Dummy code for this example: self:setFillColor( unpack(event.color) ) for k, v in pairs(event) do print(k,v) end end