0

我的 gideros 游戏中有 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)

它打印为零。

我提前感谢您的帮助。

问候,沃伦

4

2 回答 2

1

这不是答案(我会发表评论,但这奇怪地需要代表)。

您收到的错误是因为在 中,该字段中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
于 2014-07-18T11:17:54.480 回答
1

我明白了.. gideros 论坛上的某个人帮助了我,也感谢 Advert。

所以在我的 onMouseDown 事件中,我在一般事件上分配了 .letter。因此,创建一个本地 var 并在调度它之前为其分配事件,然后该变量保留我分配的字母。

希望这对将来的其他人有所帮助!

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

感谢所有回复。

于 2014-11-19T14:08:26.880 回答