middleclass problems

﹥>﹥吖頭↗ 提交于 2019-12-04 13:16:22

[EDIT 3] Ok I think I understand the problem now.

In lua, making this:

function something:foo(bar, baz)

Is the same as making this:

function something.foo(self, bar, baz)

In other words: the ':' operator simply adds a "phantom" self parameter. Similarly, when you do invoke a function with it:

something:foo(bar, baz)

The ':' is automatically "filling in" the self parameter with the value of something. It's equivalent to:

something.foo(something, bar, baz)

In short: weaponCanon2.onWeaponCollision takes two parameters in reality: self and event.

But Corona will only pass it one parameter: event. You have to trick Corona into passing the parameter you want; A possible solution is wrapping your function into another function, like this:

self.someObject:addEventListener("touch", function(event) self:onWeaponCollision(event) end)

I hope this clarifies the whole ":" thing.

I have done a Lua tutorial that explains this, and other things, regarding Lua. It's here:

http://github.com/kikito/lua_missions

It's interactive; you learn Lua while programming in Lua. There's a chapter explaining the ':' operator (inside tables_and_functions). It also explains what a "closure" is, as well as other things.

In any case, I hope this helps.

Regards!

You don't need to write wrappers to get access to the self as an implicit first argument in Corona. To get self as an implicit first argument to the listener, you need to use table listeners instead of a function listener. Table listeners make the object (table) the actual listener instead of a function.

See http://developer.anscamobile.com/content/events-and-listeners#Function_vs_Table_Listeners

Also see the "Defining event listeners" section of http://blog.anscamobile.com/2011/06/the-corona-event-model-explained/ which discusses the different ways to create listeners (the last 2 are equivalent and have the implicit self arg) reproduced below:

-- METHOD 1:

local function touchListener( event )
    ...
end

myImage:addEventListener( "touch", touchListener )

----------------------------------------------------------------------

-- METHOD 2:

local function touchListener( self, event )

    -- In this example, "self" is the same as event.target
    ...
end

-- Notice the difference in assigning the event:
myImage.touch = touchListener
myImage:addEventListener( "touch", myImage )

----------------------------------------------------------------------

-- METHOD 3:

function myImage:touch( event )

    -- Same as assigning a function to the .touch property of myImage
    -- This time, "self" exists, but does not need to be defined in
    -- the function's parameters (it's a Lua shortcut).
    ...
end

myImage:addEventListener( "touch", myImage )
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!