1

所以我在 Eclipse、Lua 和 Love2D 中遇到了一些相同的问题。

在这些情况下,我创建了一个表格,比如字体。它在main.lua。在fonts{}中,我创建这样的密钥对:

fontsize = 24
gFonts{
    ['smallFont'] = love.graphics.newFont('fontfile.ttf', fontsize)
}

然后我尝试稍后使用 Love2D's 获取字体的高度font.getHeight(self)。我这样做:

local fontSize = gFonts['smallFont'].getHeight(self)

但它不起作用。它告诉我getHeight期待一个字体,但我给它一个表格。这显然不是真的,因为getHeight:Font当我在gFonts['smallFont'].

因此,我尝试将 分配smallFont给一个名为msgFont并从中访问的变量getHeight。不,没有工作。我什至抹去了“自我”。没有修复。

我也试过love.graphics.getHeight(fontcodehere),它有点工作......但它抓住了整个窗口的高度,而不是字体。

我确实设法让它工作,但我不明白为什么这样工作以及为什么需要双字体参考。我用了:

local msgFont = gFonts['small']
local fontSize = msgFont.getHeight(gFonts['small'])

为什么这行得通?我理解的msgFont部分或将字体放在getHeight-分开......但是为什么它们需要一起使用?

是不是,

table['key'] == 'value'

?

为什么它返回一个表格而不是一个 Love2D 字体对象/注册表?我为什么要打电话

getHeight()并将其本身作为表格传递?

为什么我不能打电话

getHeight()并通过它自己?

如果这是一个愚蠢的问题,我很抱歉——我从未接受过正式的编程教育,我觉得这与我无法正确理解的范围有关。也许 self 不是指字体,而是指 getHeight?这是如何运作的?

4

2 回答 2

2

Lua 不提供面向对象的系统,但它提供了一种可选的语法,使使用起来更容易一些。

“方法”是一个带有传入表上下文的函数。这是一个意图问题。在所有其他方面,它是一个普通的功能。

可以function expression : identifier ( … )语法定义。如果是这样,则有一个名为 的隐式第一个形参self

可以expression : identifier ( … )语法调用。如果是这样,则将 的值expression作为第一个实际参数传递。

getHeight是一个需要上下文的函数。所以,

gFonts['small']:getHeight()

这与以下内容相同:

local msgFont = gFonts['small']
msgFont.getHeight(msgFont)

这实际上与您的相同:

local msgFont = gFonts['small']
local fontSize = msgFont.getHeight(gFonts['small'])

顺便说一句——因为 'small' 是一个有效的标识符,你可以这样写:

gFonts.small:getHeight()
于 2018-08-11T21:17:59.483 回答
1

正确的叫法是gFonts['smallFont']:getHeight()

于 2018-08-11T20:49:06.570 回答