【问题标题】:Inheritance with hump in love2Dlove2D中带驼峰的继承
【发布时间】:2020-03-11 20:20:48
【问题描述】:

我正在尝试使用 Lua 中的驼峰库为 löve 2D 编码的游戏进行 OOP。一切正常。但是,当我尝试以下面的方式使用我的代码时,一条消息错误告诉我“self”是一个空值。谁能告诉我我做错了什么?


Item=Class{

  init=function(x,y,size)
    self.x=x
    self.y=y
    self.size=size

    self.dx=dx
    self.dy=dy
    self.dx2=dx2
    self.dy2=dy2
  end;

  update=function(dt)
    self.dx=self.dx+self.dx2
    self.x=self.x+self.dx*dt
    self.dy=self.dy+self.dy2
    self.y=self.y+self.dy*dt
  end;

  coliide=function(ball)
    return math.sqrt((self.x-ball.x)^2+(self.y-ball.y)^2)<self.size
  end;

  reset=function()
    self.x=love.graphics.getWidth()/2
    self.y=love.graphics.getHeight()/2
    self.dy=0
    self.dx=0
    self.dy2=0
    self.dx2=0
  end

}

谢谢和问候

【问题讨论】:

    标签: class oop lua love2d


    【解决方案1】:

    在给定的sn-p中

    Item = Class{}
    Item.init=function(x,y,size)
        self.x = x
    end
    

    selfnil,因为你没有定义它。

    为了做你想做的事,你必须像这样定义函数:

    Item.init = function(self, x, y, size)
       self.x = x
    end
    

    然后这样称呼它

    Item.init(Item, x, y, size)
    

    然后 self 等于 Item ,你可以索引它而不会出错。

    为了更方便,我们可以使用Syntactic Sugar

    让我们看看 Lua 5.3 参考手册:

    3.4.10 - Function Calls

    调用v:name(args)v.name(v,args) 的语法糖,除了 v 只计算一次。

    3.4.11 - Function Definitions

    冒号语法用于定义方法,即函数 有一个隐含的额外参数 self。因此,声明

     function t.a.b.c:f (params) body end 
    

    是语法糖

     t.a.b.c.f = function (self, params) body end
    

    利用这些知识,我们可以简单地编写:

    function Item:init(x,y,size)
      self.x = x
    end
    

    然后这样称呼它:

    Item:init(x,y)
    

    【讨论】:

      【解决方案2】:

      隐式self 参数在使用冒号语法声明时可用于函数。例如:

      Item=Class{}
      
      function Item:init(x,y,size)
          self.x = x
          self.y = y
          -- ...
      end
      

      或者,您可以在现有代码中显式添加 self 参数。只需确保使用冒号语法调用它即可。

      【讨论】:

      • 您好,感谢您的回答!冒号语法是什么意思?
      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2013-09-29
      • 1970-01-01
      • 2021-09-24
      相关资源
      最近更新 更多