Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
luaoop类的多个实例被忽略,为什么?_Oop_Lua - Fatal编程技术网

luaoop类的多个实例被忽略,为什么?

luaoop类的多个实例被忽略,为什么?,oop,lua,Oop,Lua,我有一个叫做Edit的类 function Edit:new(x,y,w,h,text,fnt) o = {} setmetatable(o,EditMt) self.__index = self self.x = x or 0 self.y = y or 0 self.width = w or 10 self.height = h or 10 self.text = text or "" self.ac

我有一个叫做Edit的类

function Edit:new(x,y,w,h,text,fnt)
    o = {}
    setmetatable(o,EditMt)
    self.__index = self
    self.x = x or 0
    self.y = y or 0
    self.width = w or 10
    self.height = h or 10
    self.text = text or ""
    self.active = false
    self.font = fnt or font
    self.yo = -(self.height - self.font:getHeight()) / 2
    return o
end
该类有一个名为DrawMake with Löve2d的函数

function Edit:draw(  )
    if self.active then
        love.graphics.setColor(255,255,255,255)
     love.graphics.rectangle("fill",self.x,self.y,self.width,self.height)
        love.graphics.setColor(0,0,0,255)
        love.graphics.printf(self.text,self.font,self.x,self.y,self.width, "center",0,1,1,0,self.yo)
    else 
        love.graphics.setColor(255,255,255,255)
        love.graphics.rectangle("line",self.x,self.y,self.width,self.height)
        love.graphics.printf(self.text,self.font,self.x,self.y,self.width, "center",0,1,1,0,self.yo)
    end
end
在我的主要作品中,我创作了两部

edit1 = Edit:new(10,10,60,50,"1")
edit2 = Edit:new(80,10,60,50,"2")
并在回调中绘制它们

function love.draw( )
    edit1:draw()
    edit2:draw()
end

但它只画了edit2?如果我在draw中切换位置,它仍然只会绘制edit2,但是如果我在main中创建位置时切换位置,它现在只绘制edit1?

这是初学者在Lua中使用OOP时最常见的错误

您正在将所有这些值分配给正在编辑的self。但如果您想更改实例,则需要将它们分配给o

否则,每次调用Edit.new都将覆盖这些值

第二个问题是您的实例o是全局的。你需要它是本地的!或者每次都将覆盖实例

 function Edit:new (x,y,w,h,text,fnt)
      local o = {}   
      setmetatable(o, self)
      self.__index = self
      o.x = x or 0
      o.y = y or 0 
      -- and so forth
      return o
    end
请阅读以下内容:


这是初学者在Lua中使用OOP时最常见的错误

您正在将所有这些值分配给正在编辑的self。但如果您想更改实例,则需要将它们分配给o

否则,每次调用Edit.new都将覆盖这些值

第二个问题是您的实例o是全局的。你需要它是本地的!或者每次都将覆盖实例

 function Edit:new (x,y,w,h,text,fnt)
      local o = {}   
      setmetatable(o, self)
      self.__index = self
      o.x = x or 0
      o.y = y or 0 
      -- and so forth
      return o
    end
请阅读以下内容:


您启动的对象不太正确

在新函数中,你启动你的对象,而在这个函数中,你的自我是你的可变形的

创建全局对象o的另一个问题

因此,您的新功能必须是:

函数编辑:newx,y,w,h,text,fnt 局部o={} 赛尔夫 self.\uuu索引=self o、 x=x或0 o、 y=y或0 o、 宽度=w或10 o、 高度=h或10 o、 text=文本或 o、 活动=错误 o、 font=fnt或font o、 yo=-o.height-o.font:getHeight/2 返回o 终止
您启动的对象不太正确

在新函数中,你启动你的对象,而在这个函数中,你的自我是你的可变形的

创建全局对象o的另一个问题

因此,您的新功能必须是:

函数编辑:newx,y,w,h,text,fnt 局部o={} 赛尔夫 self.\uuu索引=self o、 x=x或0 o、 y=y或0 o、 宽度=w或10 o、 高度=h或10 o、 text=文本或 o、 活动=错误 o、 font=fnt或font o、 yo=-o.height-o.font:getHeight/2 返回o 终止