触摸Lua的Draw Library Basics

时间:2016-04-17 02:12:56

标签: random lua draw

警告:此问题仅适用于已购买并了解Draw Library的Touch Lua用户。

请参阅本问题的底部部分以查看完整的程序。我在开始时使用的小部件是该计划的一部分(NUMPAD.LUA)

好的,现在提问:

•使用"。"在" b"之间和" x"?或者" b"并且"画"?等...

•表格如何设置按钮?请超级具体?

•为什么会出现" +"," *"和"(j-1)"在第7和第8行?

•那里的高度和宽度是多少?我以为只有x和y。

function createButtons()
   buttons = { }
   local c = 1
   for i = 1, 4 do
      for j = 1, 3 do
         local b = { }
         b.x = 80 + 60 * (j-1)
         b.y = 160 + 60 * (i-1)
         b.width = 40
         b.height = 40
         b.color = draw.blue
         b.draw = drawButton
         b.action = digitAction
         buttons[c] = b
         c = c + 1
      end
   end
   buttons[1].title = '7'
   buttons[2].title = '8'
   buttons[3].title = '9'
   buttons[4].title = '4'
   buttons[5].title = '5'
   buttons[6].title = '6'
   buttons[7].title = '1'
   buttons[8].title = '2'
   buttons[9].title = '3'
   buttons[10].title = '0'
   buttons[11].title = '.'
   buttons[11].action = dotAction
   buttons[12].title = 'C'
   buttons[12].color = draw.orange
   buttons[12].action = clearAction
end

最后,引用整个程序...... •点击按钮时按钮是如何知道的?具体来说,代码行是什么以及它是如何工作的? (我对轨道接触有一个非常微弱的理解btw)

function digitAction(button)
   if string.len(display.title) < 16 then
  sys.alert('tock')
  if display.started then
     display.title = display.title .. button.title
  else
     if button.title ~= '0' then
        display.title = button.title
        display.started = true
     end
  end
   else
  sys.alert('tink')
   end
end

function dotAction(button)
   if string.find(display.title, '.', 1, true) then
  sys.alert('tink')
   else
  display.title = display.title .. '.'
  display.started = true
  sys.alert('tock')
   end
end

function clearAction(button)
   sys.alert('tock')
   display.title = '0'
   display.started= false
end

function createDisplay()
   display = { }
   display.x = 60
   display.y = 100
   display.width = 200
   display.height = 40
   display.title = '0'
   display.color = draw.red
   display.started = false
end

function createButtons()
   buttons = { }
   local c = 1
   for i = 1, 4 do
  for j = 1, 3 do
     local b = { }
     b.x = 80 + 60 * (j-1)
     b.y = 160 + 60 * (i-1)
     b.width = 40
     b.height = 40
     b.color = draw.blue
     b.draw = drawButton
     b.action = digitAction
     buttons[c] = b
     c = c + 1
  end
   end
   buttons[1].title = '7'
   buttons[2].title = '8'
   buttons[3].title = '9'
   buttons[4].title = '4'
   buttons[5].title = '5'
   buttons[6].title = '6'
   buttons[7].title = '1'
   buttons[8].title = '2'
   buttons[9].title = '3'
   buttons[10].title = '0'
   buttons[11].title = '.'
   buttons[11].action = dotAction
   buttons[12].title = 'C'
   buttons[12].color = draw.orange
   buttons[12].action = clearAction
end

function drawDisplay()
   draw.setfont('Helvetica', 20)
   draw.setlinestyle(2, 'butt')
   local x1, y1 = display.x, display.y
   local x2, y2 = x1 + display.width, y1 + display.height
   draw.roundedrect(x1, y1, x2, y2, 10, display.color)
   local w, h = draw.stringsize(display.title)
   local x = x2 - 10 - w
   local y = y1 + (display.height - h)/2
   draw.string(display.title, x, y, draw.black)
end

function drawButton(b)
   draw.setfont('Helvetica', 18)
   draw.setlinestyle(2, 'butt')
   local x1, y1 = b.x, b.y
   local x2, y2 = x1+b.width, y1+b.height
   draw.roundedrect(x1, y1, x2, y2, 10, b.color)

   local w, h = draw.stringsize(b.title)
   local x = b.x + (b.width - w)/2
   local y = b.y + (b.height - h)/2
   draw.string(b.title, x, y, draw.black)

end

function drawButtons()
   for i = 1, #buttons do
  buttons[i].draw(buttons[i])
   end
end

function lookupButton(x, y)
   for i = 1, #buttons do
  local b = buttons[i]
  if x > b.x and x < b.x+b.width and y > b.y and y < b.y+b.height then
     return b
  end
   end
   return nil
end

function drawScreen()
   draw.beginframe()
   draw.clear()
   drawDisplay()
   drawButtons()
   draw.endframe()
end

function touchBegan(x, y)
   local b = lookupButton(x, y)
   if b then
  b.action(b)
   end
end

function touchMoved(x, y)
end

function touchEnded(x, y)
end

function init()
   draw.setscreen(1)
   draw.settitle('Num Pad')
   draw.clear()
   draw.tracktouches (touchBegan, touchMoved, touchEnded)

   createButtons()
   createDisplay()
end

function mainloop()
   while true do
  draw.doevents()
  drawScreen()
  draw.sleep(30)
   end
end

function main()
   init()
   mainloop()
end

-- start program
main()

非常感谢您提供的任何帮助!我知道这是很多问题,但这些知识确实可以帮助推动我前进!

2 个答案:

答案 0 :(得分:2)

  

警告:此问题仅适用于已购买的Touch Lua用户   并了解绘图库

从什么时候开始购买东西来回答编程问题?无论如何,你所有的问题都是关于绝对的Lua基础知识。

  

“。”的用途是什么? “b”和“x”之间?还是“b”和“画画”?等...

点运算符用于索引表成员。因此,b.x会为您提供属于表"x"中的密钥b的值。它为b["x"]的语法糖。

  

表格如何设置按钮?请超级具体?

createButtons函数创建一个空表,并使用存储各种按钮属性的表b表示的按钮填充它。

  

为什么第7和第8行有“+”,“*”和“(j-1)”?

因为该程序的作者想要添加和增加。这里计算坐标b.xb.y。使用(j-1)是因为j从1开始,但他需要从0开始进行此计算。 2 for循环将创建4行按钮,每行包含3个按钮,因为x坐标取决于参数j,而y取决于参数i。

  

那里的高度和宽度是多少?我以为只有x   和y。

按钮需要尺寸,而不仅仅是位置。由于b在for循环中被创建为局部变量,因此在此处设置其所有属性。它们可能会在以后更改。

  

点击按钮时按钮是如何知道的?具体是什么   代码行以及它是如何工作的?

您的主循环将在每个周期调用draw.doevents()。所以在某些时候会有一个事件会导致touchBegan被调用。 按钮本身不知道它被点击了。函数touchBegan(x,y)将通过调用lookupButton(x,y)来搜索其中一个按钮是否被x,y命中并调用其动作函数。 action是dotAction,digitAction或clearAction之一。因此,如果点击数字按钮,将调用digitAction(),例如。

帮自己一个忙,读一本关于Lua的书或者至少做一个Lua教程。潜入第三方图书馆。如果您不知道如何索引最常见的Lua类型或者+和*是算术运算符,那么您将很难理解代码,并且不会以任何方式提高效率。

答案 1 :(得分:1)

该程序特别使用表来表示按钮,这样做是为了使其更易于管理。高度和宽度是一样的。如果您不熟悉绘图库,那么查看这样的代码只会让您感到困惑。你的大多数问题实际上都是关于OOP的。

此问题也许现在不适合Stack Overflow。如果你想要帮助/关于这个主题的小教程随时可以在Touch Lua论坛上告诉我,我的用户名是warspyking,但是你需要修改或删除这个问题。