Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

middleclass problems

Tags:

lua

coronasdk

I'm using the LUA middleclass library now after some problems and I have a situation that I can't seem to figure out.

Say I have my class: EDIT: Had a typo: here is 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, every variable such as self.name in the above example is now nil. I believe this to be because my function is:

function weaponCanon2:onWeaponCollision(event)
   ...
end

Then setting a collision event varible like self.collisionEvent = weaponCanon2.onWeaponCollision is not the same thing. I am not 100% sure what the difference between the : and . operator is in terms of LUA but these give me different problems.

Now another example is that I have a reset function. A timer goes off and then calls a reset function. If I do this:

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

Then in 100ms it will call weaponCAnon2.resetShot 1 time. When it does this all my self.name etc variables are nil. Now if I create my class:

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

then back in my class file I have:

function saveInstance(value)
   self.instance = value
end

Now I can use this timer by calling it like so:

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

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

Sorry for being unclear I'm having trouble wrapping my mind around this problem and explaining it is being very difficult.

Thanks for the help,

-d

like image 894
David Nelson Avatar asked Jul 20 '26 02:07

David Nelson


1 Answers

[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!

like image 117
kikito Avatar answered Jul 21 '26 16:07

kikito



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!