проблемы среднего класса - PullRequest
3 голосов
/ 16 июня 2011

Я сейчас использую библиотеку среднего класса LUA после некоторых проблем, и у меня возникла ситуация, которую я не могу понять.

Скажем, у меня есть класс: РЕДАКТИРОВАТЬ: Опечатка: вот фактические функции

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

Когда я делаю это, каждая переменная, такая как self.name в приведенном выше примере, теперь равна nil. Я считаю, что это потому, что моя функция:

function weaponCanon2:onWeaponCollision(event)
   ...
end

Тогда установка переменной события столкновения, например, self.collisionEvent = armsCanon2.onWeaponCollision - это не одно и то же. Я не уверен на 100% в чем разница между: и. оператор с точки зрения LUA, но это доставляет мне другие проблемы.

Теперь еще один пример - у меня есть функция сброса. Таймер выключается, а затем вызывает функцию сброса. Если я сделаю это:

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

Затем через 100 мс он вызовет WeaponCnon2.resetShot 1 раз. Когда это происходит, все мои переменные self.name и т. Д. Равны нулю. Теперь, если я создам свой класс:

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

затем обратно в файл моего класса:

function saveInstance(value)
   self.instance = value
end

Теперь я могу использовать этот таймер, называя его так:

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

Это сработает, и ни одна из моих переменных-членов (self.name) не будет == до нуля. Есть ли лучший / более простой способ сделать это при использовании вашей библиотеки или в LUA?

Извините за непонятность. У меня проблемы с тем, чтобы обдумать эту проблему и объяснить, что это очень сложно.

Спасибо за помощь,

-d

Ответы [ 2 ]

4 голосов
/ 16 июня 2011

[РЕДАКТИРОВАТЬ 3] Хорошо, я думаю, что теперь я понимаю проблему.

В lua, сделать это:

function something:foo(bar, baz)

То же самое, что сделать это:

function something.foo(self, bar, baz)

Другими словами: оператор ':' просто добавляет собственный параметр "фантом".Точно так же, когда вы вызываете функцию с ней:

something:foo(bar, baz)

':' автоматически «заполняет» параметр self значением чего-либо.Это эквивалентно:

something.foo(something, bar, baz)

Короче говоря: WeaponCanon2.onWeaponCollision в действительности принимает два параметра: себя и событие.

Но Corona передаст ему только один параметр: событие.Вы должны обманом заставить Corona передать нужный параметр;Возможное решение - обернуть вашу функцию в другую функцию, например:

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

Надеюсь, это прояснит всю вещь ":".

Я сделал учебник по Lua, который объясняет это,и другие вещи, касающиеся Луа.Это здесь:

http://github.com/kikito/lua_missions

Это интерактивно;вы изучаете Lua во время программирования на Lua.Там есть глава, объясняющая оператор ':' (внутри tables_and_functions).Это также объясняет, что такое «закрытие», а также другие вещи.

В любом случае, я надеюсь, что это поможет.

С уважением!

1 голос
/ 16 октября 2011

Вам не нужно писать оболочки, чтобы получить доступ к самому себе как к неявному первому аргументу в Corona. Чтобы получить self как неявный первый аргумент для слушателя, вам нужно использовать табличные слушатели вместо слушателя функции. Слушатели таблиц делают объект (таблицу) фактическим слушателем вместо функции.

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

Также см. Раздел «Определение прослушивателей событий» в http://blog.anscamobile.com/2011/06/the-corona-event-model-explained/, в котором рассматриваются различные способы создания прослушивателей (последние 2 эквивалентны и имеют неявный аргумент self), приведенный ниже:

-- 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 )
...