【问题标题】:Changing to display object position in corona更改以在电晕中显示对象位置
【发布时间】:2012-09-12 08:00:45
【问题描述】:

我是编程新手,这个问题可能听起来很简单。 我创建了一个对象作为一个名为 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

在我的 main.lua 中,我想创建尽可能多的盒子,就像冒险游戏一样,我如何切换两个盒子的位置,例如我点击其中一个,然后它被选中,然后我只需点击另一个,他们互相改变位置。 提前致谢

【问题讨论】:

    标签: lua coronasdk moai


    【解决方案1】:

    我不知道 Corona,但你所做的一般逻辑是这样的:

    • 添加一个事件处理程序,允许您检测何时单击了框。
    • 添加一些跟踪选定框的方法。
    • 单击框时:
      • 如果还没有选择框,则选择当前框
      • 如果之前选择了另一个框,则与当前框交换
      • 如果已选择的框被点击,忽略(或关闭选择)

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

    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
    

    【讨论】:

    • 谢谢,一个问题,为什么你把 selected = nil 放在函数之外?
    • 纯粹出于文档目的,以表明我们正在创建一个具有该名称的全局名称,而不是在box:touch 中偷偷地创建它。最好将其设为本地,以限制其范围(我现在将进行更改)。更好的是它是盒子类本身的一个属性(不是盒子instances)。但是,您将您的盒子 class 和您的盒子 instances 命名为相同的东西,因此我必须对您的代码进行更多更改才能实现该方法,而我正在尝试尽量减少更改。
    • 非常感谢。您知道如何使用“local selected = nil”作为标志,我尝试将“box.on = false”作为标志和框属性,而不是“local选择=nil",我对此有一点困难。有什么理由吗?
    • 是的,因为标志必须由所有盒子实例共享。你给每个盒子它自己的标志。您可以将标志放在框 class 中(您有 new 方法),但是考虑到您当前的代码,这将很难,因为您命名了类和实例相同。如果将类重命名为 Box,则可以使用 Box.on
    • 为了清楚起见,我已将其保存为 Box.lua 类 Box = {} m={} m.random = math.random function Box:new(x,y) Box.on =false local Box = display.newRect(0,0,100,100) return Box end ------然后在我的main.lua中我创建了这样的实例---in main.lua require"Box.lua" box1=Box: new(23,55) box2=Box:new(44,66) ---这是你的意思吗?提前谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2015-01-30
    • 2019-01-04
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多