Class love2D中的驼峰遗传

Class love2D中的驼峰遗传,class,oop,lua,love2d,Class,Oop,Lua,Love2d,我正在尝试使用Lua中的hump库为löve 2D编码的游戏进行OOP。一切正常。然而,当我试图以下面的方式使用代码时,一个消息错误告诉我“self”是一个nill值。有人能告诉我我做错了什么吗 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

我正在尝试使用Lua中的hump库为löve 2D编码的游戏进行OOP。一切正常。然而,当我试图以下面的方式使用代码时,一个消息错误告诉我“self”是一个nill值。有人能告诉我我做错了什么吗


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

}

项目=类别{
init=函数(x,y,size)
self.x=x
self.y=y
self.size=size
self.dx=dx
self.dy=dy
self.dx2=dx2
self.dy2=dy2
结束;
更新=功能(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
结束;
colide=函数(球)

return math.sqrt((self.x-ball.x)^2+(self.y-ball.y)^2)隐式
self
参数在使用冒号语法声明时可用。例如:

Item=Class{}

function Item:init(x,y,size)
    self.x = x
    self.y = y
    -- ...
end
或者,您可以在现有代码中显式添加
self
参数。只需确保使用冒号语法调用它。

在给定代码段中

Item = Class{}
Item.init=function(x,y,size)
    self.x = x
end
self
nil
,因为您没有定义它

为了实现您想要的功能,您必须这样定义函数:

Item.init = function(self, x, y, size)
   self.x = x
end
就这样说吧

Item.init(Item, x, y, size)
然后,self等于该项,您可以对其编制索引,而不会出现错误

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

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

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

冒号语法用于定义方法,即 有一个隐含的额外参数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)

嗨,谢谢你的回答!冒号语法是什么意思?