love2D中驼峰继承
Inheritance with hump in love2D
我正在尝试使用 Lua 中的 hump 库为一个用 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
}
谢谢和问候
隐式 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 equals Item 并且你可以索引它而不会出错。
为了让这更方便一点,我们可以使用一个叫做 Syntactic Sugar
的东西
一起来看看Lua5.3参考手册:
A call v:name(args)
is syntactic sugar for v.name(v,args)
, except that
v
is evaluated only once.
The colon syntax is used for defining methods, that is, functions that
have an implicit extra parameter self. Thus, the statement
function t.a.b.c:f (params) body end
is syntactic sugar for
t.a.b.c.f = function (self, params) body end
利用这些知识我们可以简单地写成:
function Item:init(x,y,size)
self.x = x
end
并这样称呼它:
Item:init(x,y)
我正在尝试使用 Lua 中的 hump 库为一个用 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
}
谢谢和问候
隐式 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 equals Item 并且你可以索引它而不会出错。
为了让这更方便一点,我们可以使用一个叫做 Syntactic Sugar
的东西一起来看看Lua5.3参考手册:
A call
v:name(args)
is syntactic sugar forv.name(v,args)
, except thatv
is evaluated only once.
The colon syntax is used for defining methods, that is, functions that have an implicit extra parameter self. Thus, the statement
function t.a.b.c:f (params) body end
is syntactic sugar for
t.a.b.c.f = function (self, params) body end
利用这些知识我们可以简单地写成:
function Item:init(x,y,size)
self.x = x
end
并这样称呼它:
Item:init(x,y)