проблемы среднего класса

Сейчас я использую библиотеку среднего класса 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

lua,corona,

3

Ответов: 2


"за" 4 "за" принято

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

В Луа, делая это:

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, который объясняет это и другие вещи, касающиеся Lua. Это здесь:

http://github.com/kikito/lua_missions

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

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

С уважением!


Вам не нужно писать оболочки, чтобы получить доступ к самому себе как неявный первый аргумент в 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 эквивалентны и имеют неявная самооценка) воспроизводится ниже:

-- 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 )
луна, корона,
Похожие вопросы