Lua 更改为在corona中显示对象位置

Lua 更改为在corona中显示对象位置,lua,coronasdk,moai,Lua,Coronasdk,Moai,我是编程新手,这个问题可能听起来很简单。 我已经创建了一个名为box的模块 box = {} m={} m.random = math.random function box:new(x,y) box.on=false local box = display.newRect(0,0,100,100) box:setFillColor(m.random(120,200),m.random(120,200),m.random(120,200)) box.x

我是编程新手,这个问题可能听起来很简单。 我已经创建了一个名为box的模块

box = {}
m={}
m.random = math.random

function box:new(x,y)
     box.on=false
     local box = display.newRect(0,0,100,100)
     box:setFillColor(m.random(120,200),m.random(120,200),m.random(120,200))
     box.x = x
     box.y = y
     box.type = "box"


     return box
end


return box
在my main.lua中,我想创建尽可能多的盒子,就像一个冒险游戏一样,我如何切换两个盒子的位置,例如,我单击其中一个,然后它被选中,只需单击另一个,它们就会相互改变位置。
提前谢谢我不知道科罗纳,但你所做的一般逻辑是:

  • 添加一个事件处理程序,允许您在单击框时进行检测
  • 添加一些跟踪所选框的方法
  • 单击框时:
    • 如果尚未选择任何框,请选择当前框
    • 如果以前选择了另一个框,请与当前框交换
    • 如果单击了已选定的框,则忽略(或关闭选定)

总体思路(不确定这是否是有效的Corona事件处理,但应该让您接近):


谢谢,有一个问题,为什么要将selected=nil放在函数之外?纯粹是为了说明我们正在创建该名称的全局名称,而不是在
框:touch
中偷偷创建它。更好的做法是将其本地化,以限制其范围(我现在将进行更改)。更好的做法是将其作为box类本身的属性(而不是box实例)。但是,您将box类和box实例命名为相同的名称,因此我必须对代码进行更多更改以实现该方法,并且我尝试将更改保持在最低限度。非常感谢。您知道如何使用“local select=nil”作为标志,我尝试将“box.on=false”作为标志和box属性,而不是“local selected=nil”,我对此有点困难。这有什么原因吗?是的,因为标志必须由所有box实例共享。你给每个box指定了自己的标志。你可以将标志放在box类中(你有
新的
方法),但考虑到您当前的代码,这将很难实现,因为您将类和实例命名为相同的名称。如果您将类重命名为Box,则可以使用
Box.on
。很清楚,我已将其另存为Box.lua as class Box={}m={}m.random=math.random函数Box:new(x,y)Box.on=false local Box=display.newRect(0,0100100)return Box end------然后在我的main.lua中创建了这样的实例------在main.lua中需要“Box.lua”box1=Box:new(23,55)box2=Box:new(44,66)---这就是你的意思吗?提前谢谢
box = {}
m={}
m.random = math.random

-- track the currently selected box
local selected = nil

function box:new(x,y)
     box.on=false
     local box = display.newRect(0,0,100,100)
     box:setFillColor(m.random(120,200),m.random(120,200),m.random(120,200))
     box.x = x
     box.y = y
     box.type = "box"
     function box:touch(event)
         if not selected then
             -- nothing is selected yet; select this box
             selected = self
             -- TODO: change this box in some way to visually indicate that it's selected
         elseif selected == self then
             -- we were clicked on a second time; we should probably clear the selection
             selected = nil
             -- TODO: remove visual indication of selection
         else
             -- swap positions with the previous selected box, then clear the selection
             self.x, self.y, selected.x, selected.y 
                 = selected.x, selected.y, self.x, self.y
             selected = nil
         end
     end
     return box
end