Lua 解包(self.fillColor)返回为;“无”;不管我怎么努力?
第一篇文章在这里,但长期使用他人的解决方案。这学期我参加了Lua编程课程,我们正在进行第一次作业。我的问题可能很容易回答,但对于一个从未使用过像Lua这样的语言的人来说,这让我非常恼火 游戏的基础是创建一个由彩色方块组成的棋盘,让用户触摸它们来选择它们。一接触,广场就变得更大,并保持更大。然后,如果下一个触摸的方块与第一个方块的颜色匹配,它们将消失/删除自己,然后一旦所有方块消失,游戏将重新开始。这是代码,删除了不相关的部分Lua 解包(self.fillColor)返回为;“无”;不管我怎么努力?,lua,coronasdk,Lua,Coronasdk,第一篇文章在这里,但长期使用他人的解决方案。这学期我参加了Lua编程课程,我们正在进行第一次作业。我的问题可能很容易回答,但对于一个从未使用过像Lua这样的语言的人来说,这让我非常恼火 游戏的基础是创建一个由彩色方块组成的棋盘,让用户触摸它们来选择它们。一接触,广场就变得更大,并保持更大。然后,如果下一个触摸的方块与第一个方块的颜色匹配,它们将消失/删除自己,然后一旦所有方块消失,游戏将重新开始。这是代码,删除了不相关的部分 -- Get screen dimensions in easier
-- Get screen dimensions in easier to reference variables
maxXValue = display.contentWidth;
maxYValue = display.contentHeight;
-- Set up table of boxes to play game with
-- May have a better way to do this...
gameBoard = {}
for i = 1, 16 do
if i == 1 then boxNum = display.newRect(0, 0, (0.25*maxXValue-5),
(0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 2 then boxNum = display.newRect((0.25*maxXValue), 0,
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 3 then boxNum = display.newRect((0.5*maxXValue), 0,
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 4 then boxNum = display.newRect((0.75*maxXValue), 0,
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 5 then boxNum = display.newRect(0, (0.25*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 6 then boxNum = display.newRect((0.25*maxXValue), (0.25*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 7 then boxNum = display.newRect((0.5*maxXValue), (0.25*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 8 then boxNum = display.newRect((0.75*maxXValue), ((0.25*maxYValue)),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 9 then boxNum = display.newRect(0, (0.5*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 10 then boxNum = display.newRect((0.25*maxXValue), (0.5*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 11 then boxNum = display.newRect((0.5*maxXValue), (0.5*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 12 then boxNum = display.newRect((0.75*maxXValue), (0.5*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 13 then boxNum = display.newRect(0, (0.75*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 14 then boxNum = display.newRect((0.25*maxXValue), (0.75*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 15 then boxNum = display.newRect((0.5*maxXValue), (0.75*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
elseif i == 16 then boxNum = display.newRect((0.75*maxXValue), (0.75*maxYValue),
(0.25*maxXValue-5), (0.25*maxYValue-5));
table.insert(gameBoard, boxNum);
end
end
--Irrelevant code here
local selected = {};
local function toucher (event)
local red, green, blue = unpack(self.fillColor); -- ERROR APPEARS HERE
table.insert(selected, self, red, green, blue)
event.target:scale(1.1, 1.1)
event.target:toFront();
if selected[2] == event.target then
if (selected[1].red == selected[2].red and selected[1].green == selected[2].green
and selected[1].blue == selected[2].blue) then
selected[1]:removeSelf();
selected[2]:removeSelf();
end
selected[1] = selected[2];
selected[2] = nil;
end
--[[Code to go here will tell the program to restart. Want to get a single iteration before
moving to this.]]
end
for i = 1, 16 do gameBoard[i]:addEventListener("touch", toucher);
end
在“toucher”函数中,我尝试使用unpack(self.fillColor)函数来获取选中的正方形的颜色,以便保存以备以后比较。根据我的研究,这是从物体中读出颜色的最简单方法之一。但是,当用户触摸正方形时,我得到以下错误:
main.lua:121:尝试索引全局“self”(一个nil值)
堆栈回溯:
main.lua:121:in函数我知道我的代码并不漂亮或者效率不高,但我真的只担心它能否正常工作。作业本周就要交了,几天来我一直在努力自己解决这个问题。提前谢谢你 该函数中没有对象
self
。所有事件侦听器都有一个事件参数,该参数具有一个target
属性,该属性引用调度事件的对象
在您的情况下,缺少一行来指定self
,例如:
local function toucher (event)
local self = event.target -- This line is missing.
local red, green, blue = unpack(self.fillColor)
但是,我从未听说过.fillColor
属性,因此我猜您是自己指定的,如果不是,请包装函数setFillColor
以保存颜色,如下所示:
function gameBoard[1]:saveFillColor(r, g, b, a) -- New function that saves the color and sets it.
self.fillColor = {r, g, b, a}
self:setFillColor(r, g, b, a)
end
self
仅在函数作为对象的一部分被调用时可用,例如gameBoard[1]:toucher()
使用:
可以阅读有关此的更多信息。该函数中没有对象self
。所有事件侦听器都有一个事件参数,该参数具有一个target
属性,该属性引用调度事件的对象
在您的情况下,缺少一行来指定self
,例如:
local function toucher (event)
local self = event.target -- This line is missing.
local red, green, blue = unpack(self.fillColor)
但是,我从未听说过.fillColor
属性,因此我猜您是自己指定的,如果不是,请包装函数setFillColor
以保存颜色,如下所示:
function gameBoard[1]:saveFillColor(r, g, b, a) -- New function that saves the color and sets it.
self.fillColor = {r, g, b, a}
self:setFillColor(r, g, b, a)
end
self
仅在函数作为对象的一部分被调用时可用,例如gameBoard[1]:toucher()
使用:
您可以阅读有关此的更多信息。不要忘记您的local
关键字。嗯,这显示了我对该语言有多么陌生。我的研究给我的印象是,self
和event.target
差不多<代码>事件。目标在该点使用时,会给出相同的错误。有没有一个合适的方法来获得你所知道的物体的颜色?实际上,我在另一个stackoverflow链接上找到了.fillColor
,但我现在似乎无法将其重新挖掘。在调用:setFillColor()
后,您应该自己设置.fillColor
。还有一个.fill
属性,但它是userdata,无法解包。我添加了一个包装函数,允许您将应用的颜色保存到.fillColor
属性。但是要小心,因为:setFillColor
接受1、2、3或4个参数,每个参数都可以做不同的事情:这应该是您所说的链接,正如您所看到的,您需要自己指定它:不要忘记您的本地
关键字。嗯,这表明我对该语言有多么陌生。我的研究给我的印象是,self
和event.target
差不多<代码>事件。目标在该点使用时,会给出相同的错误。有没有一个合适的方法来获得你所知道的物体的颜色?实际上,我在另一个stackoverflow链接上找到了.fillColor
,但我现在似乎无法将其重新挖掘。在调用:setFillColor()
后,您应该自己设置.fillColor
。还有一个.fill
属性,但它是userdata,无法解包。我添加了一个包装函数,允许您将应用的颜色保存到.fillColor
属性。但是要小心,因为:setFillColor
接受1、2、3或4个参数,并且每个参数可以做不同的事情:正如您所看到的,这应该是您所谈论的链接,您需要自己指定它: