Corona SDK - вызов метода экземпляра или метода класса из eventListener - PullRequest
4 голосов
/ 01 апреля 2012

У меня есть класс Foo (ну, псевдокласс), настроенный следующим образом:

--in foo.lua
Foo = {}

--constructor
function Foo:new(x, y)
  --the new instance
  local foo = display.newImage("foo.png")
  -- set some instance vars
  foo.x = x
  foo.y = y
  foo.name = 'foo'    

  --instance method
  function foo:speak()
    print("I am an instance and my name is " .. self.name)
  end

  --another instance method 
  function foo:moveLeft()
    self.x = self.x - 1
  end

  function foo:drag(event)
    self.x = event.x
    self.y = event.y  
  end

  foo:addEventListener("touch", drag)

  return foo
end

--class method
function Foo:speak()
  print("I am the class Foo")
end

return Foo

Я хочу, чтобы прослушиватель событий объекта foo вызывал foo: перетаскивать тот же экземпляр,Однако я не могу понять, как: в данный момент он вызывает локальную функцию «drag» в моем main.lua, которую я затем передаю обратно экземпляру.Могу ли я вызвать метод экземпляра непосредственно из слушателя?Я читаю о слушателях здесь http://developer.anscamobile.com/reference/index/objectaddeventlistener, но я немного растерялся: /

спасибо, макс.

Ответы [ 2 ]

5 голосов
/ 17 апреля 2012

В Corona есть 2 различных типа прослушивателей событий, прослушиватели функций и прослушиватели таблиц . Упоминаемая вами локальная функция работает, потому что эта функция вызывается непосредственно при срабатывании события. Corona не поддерживает передачу табличных функций, поэтому передача в этом случае не будет работать.

Чтобы это работало, вам нужно использовать прослушиватель таблиц следующим образом:

function foo:touch(event)
  self.x = event.x
  self.y = event.y  
end

foo:addEventListener("touch", foo)

Это работает, потому что слушатель события будет пытаться вызвать функцию в таблице foo с тем же именем, что и у события - в этом примере "touch".

Если вам нужно сохранить имя функции в виде перетаскивания, вы можете обойти это ограничение, добавив его после определения функции:

player.touch = player.drag

Это в основном перенаправляет сенсорный вызов на функцию перетаскивания.

3 голосов
/ 03 апреля 2012

У меня была похожая проблема со слушателями событий.Я решил это примерно так:

foo:addEventListener("touch", function(e) { self:drag(e); });

Я использую Средний класс для программирования ООП в Lua (что я действительно рекомендую) ... поэтому я не уверен, будет ли этоработать по вашему сценарию.Надеюсь, это поможет.

...