开发者

middleclass problems

I'm using the LUA middleclass library now after som开发者_运维问答e 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


[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 )
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜