Событие Гидроса показывается как нулевое после срабатывания
У меня есть события Dispatched в моей игре. В чем я не уверен, так это в том, что когда я пытаюсь получить доступ к событию (объект сработал), он возвращает таблицу с длиной 0.
У меня есть класс письма, как показано ниже:
GridLetter = gideros.class(Sprite)
function GridLetter:init(letter)
self.image = Bitmap.new(Texture.new("GridLetters/"..letter.."Grid.png"))
self.image:setAnchorPoint(0.5, 0.5)
self.focus = false
self:updateVisualState(true)
self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
end
function GridLetter:onMouseDown(event)
if self:hitTestPoint(event.x, event.y) then
self.focus = true
self:dispatchEvent(Event.new("GridLetterDown"))
event:stopPropagation()
end
end
function GridLetter:updateVisualState(state)
if state then
self:addChild(self.image)
end
end
Код, который реализует этот класс ниже:
grid = Core.class(Sprite)
local letterArr = {"a","b","c","d","e","f","g","h","u","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"}
local gridboard = {{},{},{},{}}
local letterBoxArr = {{},{},{},{}}
local letterBox
function grid:init(params)
local widthOfSingle = (application:getContentWidth() / 4)
for rowCount = 1,4 do
for colCount = 1,4 do
rand = math.random(1, 26)
gridboard[rowCount][colCount] = letterArr[rand]
end
end
for rowCount = 1,4 do
for colCount = 1,4 do
letterBox = GridLetter.new(gridboard[rowCount][colCount])
letterBoxArr[rowCount][colCount] = {letterBoxItem=letterBox}
letterBoxArr[rowCount][colCount].letterBoxItem:setPosition(((widthOfSingle * colCount) - (widthOfSingle / 2)), 100 * rowCount)
letterBoxArr[rowCount][colCount].letterBoxItem.letter = gridboard[rowCount][colCount];
letterBoxArr[rowCount][colCount].letterBoxItem:addEventListener("GridLetterDown", LetterDown, self)
self:addChild(letterBoxArr[rowCount][colCount].letterBoxItem)
end
end
end
function LetterDown(event)
print(event.target.letter)
end
Когда я нажимаю на одно из этих изображений, событие запускается, и код выполняется под событием LetterDown, но при попытке получить доступ к параметру события возвращает:
grid.lua:32: attempt to index field 'target' (a nil value)
stack traceback:
grid.lua:32: in function <grid.lua:31>
GridLetter.lua:15: in function <GridLetter.lua:12>
Любая идея или обходные пути?
При замене:
print(event.target.letter)
в
print(event.x)
Это печатает ноль.
Я заранее ценю вашу помощь.
С уважением, Уоррен
2 ответа
Я понял... Кто-то на форумах гидроса помог мне, благодаря Advert.
Таким образом, в моем событии onMouseDown я назначил.letter для общего события. Таким образом, создавая локальную переменную и назначая ей событие перед отправкой, переменная сохраняет мое назначенное письмо.
Надеюсь, что это поможет другим в будущем!
function GridLetter:onMouseDown(event)
if self:hitTestPoint(event.x, event.y) then
self.focus = true
local e = Event.new("GridLetterDown")
e.letter = self.letter
self:dispatchEvent(e)
event:stopPropagation()
end
end
Спасибо за все ответы.
Это не ответ (я бы прокомментировал, но это, как ни странно, требует повторения).
Ошибка, которую вы получаете, потому что в event
нет ничего в target
поле.
Вы можете узнать, что находится в таблице, зацикливаясь на ней (или используя красивую табличную функцию печати, если glideros определяет один / вы определяете один самостоятельно):
for k, v in pairs(target) do print(k, v) end
Если вы не уверены, если target
будет существовать все время, вы также можете сделать что-то вроде этого:
print(not event.target and "event.target does not exist" or event.target.letter)
Вы можете прочитать о A and B or C
построить здесь: http://lua-users.org/wiki/TernaryOperator
Изменить: Предполагая, что событие, которое вы получаете, происходит с объектом GridLetter, вы не устанавливаете self.letter
ни к чему. Возможно, настройка поля поможет:
function GridLetter:init(letter)
self.letter = letter -- Forgot this?
self.image = Bitmap.new(Texture.new("GridLetters/"..letter.."Grid.png"))
self.image:setAnchorPoint(0.5, 0.5)
self.focus = false
self:updateVisualState(true)
self:addEventListener(Event.MOUSE_DOWN, self.onMouseDown, self)
end