Событие Гидроса показывается как нулевое после срабатывания

У меня есть события 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
Другие вопросы по тегам