Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 解包(self.fillColor)返回为;“无”;不管我怎么努力?_Lua_Coronasdk - Fatal编程技术网

Lua 解包(self.fillColor)返回为;“无”;不管我怎么努力?

Lua 解包(self.fillColor)返回为;“无”;不管我怎么努力?,lua,coronasdk,Lua,Coronasdk,第一篇文章在这里,但长期使用他人的解决方案。这学期我参加了Lua编程课程,我们正在进行第一次作业。我的问题可能很容易回答,但对于一个从未使用过像Lua这样的语言的人来说,这让我非常恼火 游戏的基础是创建一个由彩色方块组成的棋盘,让用户触摸它们来选择它们。一接触,广场就变得更大,并保持更大。然后,如果下一个触摸的方块与第一个方块的颜色匹配,它们将消失/删除自己,然后一旦所有方块消失,游戏将重新开始。这是代码,删除了不相关的部分 -- Get screen dimensions in easier

第一篇文章在这里,但长期使用他人的解决方案。这学期我参加了Lua编程课程,我们正在进行第一次作业。我的问题可能很容易回答,但对于一个从未使用过像Lua这样的语言的人来说,这让我非常恼火

游戏的基础是创建一个由彩色方块组成的棋盘,让用户触摸它们来选择它们。一接触,广场就变得更大,并保持更大。然后,如果下一个触摸的方块与第一个方块的颜色匹配,它们将消失/删除自己,然后一旦所有方块消失,游戏将重新开始。这是代码,删除了不相关的部分

-- 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函数 ?:在功能中<?:169>

我已经读过self和event.target对象是如何工作的,但是当我尝试取消引用它们的名称(打印为“nil”)以外的任何内容时,它们都会给出相同的错误。我觉得我可能错误地理解了一个非常简单的范围界定概念。其他使用event.target和self的操作,比如resize和toFront()操作,工作得很好,所以我不太明白为什么获取对象的属性不起作用


我知道我的代码并不漂亮或者效率不高,但我真的只担心它能否正常工作。作业本周就要交了,几天来我一直在努力自己解决这个问题。提前谢谢你

该函数中没有对象
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个参数,并且每个参数可以做不同的事情:正如您所看到的,这应该是您所谈论的链接,您需要自己指定它: