我正在尝试使用ComputerCraft在Lua中创建一个易于使用的按钮API,我遇到了一些麻烦。当我这样做时:
os.loadAPI("button")
action=function()
term.clear()
term.setCursorPos(1,1)
print("Hello!")
end
button.newButton("B1",5,5,20,10)
button.drawButton("B1",colors.orange,colors.white)
button.onClick("B1",action,true)
没有任何事情发生,甚至没有画出颜色。我已经完成了测试,当我将colors.white这样的东西存储为变量时,然后打印变量,它返回颜色的数字代码,它来自颜色API。这就是我所拥有的:
--to use the newButton function, do this:
--button.newButton(exampleButton)
--to use onClick function, create a variable like this:
--exampleFunc=function()
--(code)
--end
--Then call onClick with the same variable:
--button.onClick(exampleButton,exampleFunc)
buttons={}
xPos=0
yPos=0
function removeButton(buttonName)
for key, fields in pairs(buttons) do
if key == buttonName then
table.remove(button,buttonName)
else
print("ERROR: button name not available")
end
end
end
function onClick(buttonName,action,boolean)
for key, fields in pairs(buttons) do
if boolean then
testClick(action)
end
end
end
function drawSeparateButton(x,y,w,h,outLineColor,fillColor)
if key == buttonName then
x=buttons[buttonName]["x"]
y=buttons[buttonName]["y"]
w=buttons[buttonName]["w"]
h=buttons[buttonName]["h"]
paintutils.drawBox(x,y,x+(w-1),y+(h-1),outLineColor)
paintutils.drawFilledBox(x+1,y+1,x+(w-2),y+(h-2),fillColor)
end
end
function testClick(action)
for key, fields in ipairs(buttons) do
x=buttons[buttonName]["x"]
y=buttons[buttonName]["y"]
w=buttons[buttonName]["w"]
h=buttons[buttonName]["h"]
x2=x+(w-1)
y2=y+(h-1)
button,xPos,yPos=os.pullEvent("mouse_click")
if xPos>=x and xPos<=x2 and yPos>=y and yPos<=y2 then
action()
end
end
end
function newButton(buttonName,X,Y,W,H)
buttons[buttonName] = {x=X,y=Y,w=W,h=H}
end
function drawButton(buttonName,outLineColor,fillColor)
for key, fields in ipairs(buttons) do
if key == buttonName then
x=buttons[buttonName]["x"]
y=buttons[buttonName]["y"]
w=buttons[buttonName]["w"]
h=buttons[buttonName]["h"]
x2=x+w-1
y2=y+h-1
x3=x+1
y3=y+1
x4=x+w-2
y4=y+h-2
paintutils.drawBox(x,y,x2,y2,outLineColor)
paintutils.drawFilledBox(x3,y3,x4,y4,fillColor)
elseif key ~= buttonName then
print("Button name not availabel")
end
end
end
我只需要能够在变量中存储类似colors.white的颜色,并将其作为colors.white返回,而不是颜色代码。我还需要能够检查单击了哪个按钮,并在单击其中一个按钮时运行用户指定的功能。
答案 0 :(得分:1)
我将浏览您的原型代码并指出我看到的一些错误,并尝试回答您的问题。我假设您要将表中的键值设置为数组并从外部访问。
对问题的快速简短回答是,您可以在表格中存储表格,并通过键或索引访问它们。但是,我要做的设计更改是将.txt
存储为每个按钮表的成员,以将其与特定按钮相关联。
示例:
exampleFunc
表具有键值结构,其中键可以是字符串或数字。根据密钥的数据类型,有多种方法可以使用密钥访问阵列。
例如,我们可以写buttons = {}
buttons.playButton = {x=0, y=0, w=10, h=10, func=function() return end}
buttons.quitButton = {x=0, y=30, w=10, h=10, func=function() return end}
...
buttons.quitButton.x = 10
buttons.playButton.func()
或buttons.quitButton.x = 10
或buttons["quitButton"].x = 10
,而不是写buttons["quitButton"]["x"] = 10
。
This page是了解Lua桌子的一个很好的起点。
根据this page,buttons.quitButton["x"] = 10
正在阻止,您只能检查每次点击鼠标是否单击了一个按钮。考虑循环遍历os.pullEvent()
表并检查每个按钮以查看鼠标是否在其矩形范围内。找到鼠标单击的按钮后,可以调用其buttons
成员。虽然我们仍在讨论此方法,但func
循环完全没必要。
while true do
您可能来自Python背景,其中语句function removeButton(buttonName)
for buttonName in pairs(button) do
...
function newButton(buttonName)
state=true
for buttonName in pairs(buttons) do
...
存在,但Lua没有此类声明。您使用的if element in list
循环遍历列表中的每个成员。您也没有捕获pairs()函数返回的所有变量。对此的修复将类似于以下内容:
for
当您指function buttonFunction(buttonName)
for key, fields in pairs(buttons) do
if key == buttonName then
...
end
end
时,有多个实例引用变量button
。