在love2D中使用hump进行继承

我试着在Lua中使用hump库进行面向对象编程,以便为代码编写löve 2D游戏。一切都运行得很好。但是,当我像下面这样尝试运行我的代码时,一个错误消息告诉我"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

}

谢谢!

点赞
用户5675002
用户5675002

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

Item=Class{}

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

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

2019-11-15 16:37:24
用户2858170
用户2858170

在给定的代码片段中,

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,你可以在没有错误的情况下对其进行索引。

为了使这更加方便,我们可以使用称为 “语法糖” 的东西。

让我们来看一下 Lua 5.3 参考手册:

3.4.10 - 函数调用

一个调用v:name(args)v.name(v,args)的语法糖,除了v只会被求值一次。

3.4.11 - 函数定义

冒号语法用于定义方法,即具有隐式额外参数 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)
2019-11-15 18:15:54