Middle class problems

Now I am using the middle class LUA library after some problems, and I have a situation that I cannot understand.

Say I have my class: EDIT: Had a typo: here are the actual functions

require "middleclass" weaponCanon2 = class("weaponCanon2") function weaponCanon2:onWeaponCollision(event) if (event.phase == "began") then if (event.other.name ~= "ground") then self.canonBall.inAir = false end end end function weaponCanon2:initialize(atX, atY, inGroup) self.name = "some value" self.someObject:addEventListener("touch", **weaponCanon2.onWeaponCollision**) ... end 

When I do this, each variable, such as self.name in the above example, is now zero. I believe this is because my function:

 function weaponCanon2:onWeaponCollision(event) ... end 

Then setting the collision event variable, for example self.collisionEvent = weaponCanon2.onWeaponCollision, is not the same thing. I am not 100% sure what the difference is between: and. the operator is in LUA terms, but this gives me different problems.

Now another example: I have a reset function. The timer goes off and then calls the reset function. If I do this:

 timer.performWithDelay(100, weaponCanon2.resetShot, 1) 

Then, in 100 ms, he will call the weaponCAnon2.resetShot 1 time. When he does this, all my variables are self.name, etc. Equal to zero. Now, if I create my class:

 require("weaponCanon2") local canon = weaponCanon2:new("someName") canon:saveInstance(canon) 

and then back to my class file:

 function saveInstance(value) self.instance = value end 

Now I can use this timer, calling it like this:

 timer.performWithDelay(100, function() self.instance:resetShot(); end, 1) 

This will work without any of my member variables (self.name) equal to == equal to zero. Is there a better / easier way to do this when using your library or in LUA?

Sorry for being unclear. I am having problems thinking about this problem and explaining that it is very difficult.

Thanks for the help,

-d

+3
source share
2 answers

[EDIT 3] Well, I think I understand the problem now.

In lua, by doing this:

 function something:foo(bar, baz) 

The same as for this:

 function something.foo(self, bar, baz) 

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

 something:foo(bar, baz) 

":" automatically "fills" the self parameter with the value of something. This is equivalent to:

 something.foo(something, bar, baz) 

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

But Corona will only pass one parameter: event. You must trick the Crown into passing the parameter you want; A possible solution is to wrap your function in another function, for example:

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

Hope this clarifies the whole thing: ".

I made a Lua tutorial that explains this, and other things regarding Lua. Here:

http://github.com/kikito/lua_missions

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

In any case, I hope this helps.

Hello!

+4
source

You do not need to write wrappers to access yourself as an implicit first argument in Corona. To get yourself as an implicit first argument to a listener, you need to use table listeners instead of a function listener. Table listeners make an object (table) an 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 different ways to create listeners (the last 2 are equivalent and have 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 parameters (it a Lua shortcut). ... end myImage:addEventListener( "touch", myImage ) 
+1
source

All Articles