Love2d从青铜到王者第八篇:Love2d之多个文件和作用域范围

Posted 森明帮大于黑虎帮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Love2d从青铜到王者第八篇:Love2d之多个文件和作用域范围相关的知识,希望对你有一定的参考价值。

系列文章目录


文章目录


前言


🍇一、多个文件(Multiple files )

1️⃣.多个文件(Multiple files )

  • 有了多个文件,我们的代码看起来更有条理,也更容易导航。创建一个名为“example.lua”。确保它与新的空文件夹在同一个文件夹中“main.lua”
  • 在这个文件中,创建一个变量。我会把“–! file:”在代码块的顶部,以明确你必须把代码放在哪个文件中。这只针对本文章,没有任何用处。如果一个代码块在以后的教程中没有这个,它要么在“main.lua”中,要么在前面提到的文件中。
--! file: example.lua
name="Blank"

  • 现在在“main.lua”print(name),当你运行游戏时,你会看到name等于nil
function  love.load()
end

function love.update(dt)
    
end

function love.draw()
    love.graphics.print(name,200,100)
end

  • 这是因为我们必须先加载文件。我们这样用require,将文件名作为字符串作为第一个参数传递。
--! file: main.lua
--Leave out the .lua
-- No need for love.load or whatever
function  love.load()
    require("example")
end

function love.update(dt)
    
end

function love.draw()
    love.graphics.print(name,200,100)
end

  • 我们不添加".lua "的后缀名,因为"lua "为我们做了这个。
  • 您也可以将文件放在子目录中,但在这种情况下,请确保包含完整的路径。
--With require we use . instead of /
require("path.to.example")
  • 当你print(name),在我们加载之后example.lua,你应该看到它说100

  • age在这种情况下,我们称之为全局变量(或者一个全局的简称)。这是一个变量,我们可以在项目的任何地方使用。与全局变量相反的是局部变量(或者当地的简称)。您可以通过编写以下内容来创建一个局部变量local在变量名前面。

  • 现在运行游戏看看100是什么nil又来了。这是因为它的范围只限于当前love.load()函数

function  love.load()
    require("example")
    loacl age=100
end

function love.update(dt)
    
end

function love.draw()
    love.graphics.print(name,200,100)
    love.graphics.print(age,200,200)
end

🍈二、作用域范围(Scope)

  • 局部变量限于它们的作用域。在这种情况下Blank,这个作用域范围是文件example.lua。这意味着Blank可以在该文件中的任何地方使用,但不能在其他文件中使用。
--! file: main.lua
--Leave out the .lua
-- No need for love.load or whatever
function  love.load()
    require("example")
    font=love.graphics.newFont(30)
    local age=100
end

function love.update(dt)
    
end

function love.draw()
    love.graphics.setFont(font)
    love.graphics.print(name,200,100)
    love.graphics.print(age,200,200)
end

  • age存在nil,因为我们在它的范围之外打印它。
  • 函数的参数就像局部变量。只存在于函数内部。
  • 要真正理解作用域是如何工作的,请看下面的代码:
function love.load()
    font=love.graphics.newFont(30)
    test = 10
    --print(test)
    --Output: 10
    require("example")
end


function love.update(dt)
end

function some_function(test)
    if true 
    then
        local test = 40
        love.graphics.print(test,100,50)
        --Output: 40
    end
    love.graphics.print(test,100,100)
    --Output: 30
end

function love.draw()
    love.graphics.setFont(font)
    love.graphics.print(name,100,150)
    love.graphics.print(test,100,200)
    some_function(30)
    love.graphics.print(test,100,250)
end

  • 如果你运行游戏,它应该打印:40,30,Black, 10,10。让我们一步一步地看看这段代码。
  • 首先我们要创建test变量在main.lua,但在我们打印之前,我们require(example.lua)
  • example.lua我们创建一个局部变量test,这不会影响中的全局变量在main.lua。也就是说,我们赋予这个局部变量的值并没有赋予全局变量。
  • 我们创建了一个函数名为 some_function(test)),然后调用那个函数。
  • 在函数内部,参数test不会影响我们之前创建的局部变量。
  • if语句中,我们创建了另一个局部变量名为test,这不会影响参数test
  • 第一次printif语句中,是40。在我们打印的if语句之后test现在是30,这是我们传递的参数。参数test没有受到testif语句中。在if语句中,局部变量优先于参数。
  • 在函数之外,我们还打印test。这次是10。这test创建于开始时example.lua没有受到test在函数内部。
  • 最后我们打印testmain.lua,现在是10。全局变量不受内部局部变量的影响example.lua
  • 我对每一个的范围进行了可视化test为了更清楚地说明:
  • 创建局部变量时,不必马上赋值。
local age
age = 19

🍉三、返回值(Returning a value)

  • 如果您在文件的顶部作用域添加return语句(因此不在任何函数中),当您使用require来加载文件。
  • 比如说:
--! file: example.lua
local test = 99
return test
--! file: main.lua
local hello = require "example"
print(hello)
--Ouput: 99

🍊四、什么时候使用局部变量为什么(When and why locals)

  • 一个对象也可以有函数。像这样为一个对象创建一个函数:
    最佳实践是始终使用局部变量,这有多种原因。首先,lua访问本地比访问全局更快。现在这是一个非常小的差异,可能不会大于0.000001秒,但是当你使用很多全局变量时,它会很快增加。
  • 另一个原因是,使用全局变量,你更容易出错。您可能会在不同的位置意外地使用同一个变量两次,在位置1将变量更改为某个值,而在位置2使用该值是没有意义的。如果你打算只在某个范围内使用一个变量,那么就让它成为局部变量。
  • 在前一篇文章中,我们制作了一个创建矩形的函数。在这个函数中,我们可以将变量rect因为我们只在函数中使用它。我们仍然在函数外部使用那个矩形,但是我们从表中访问它 listOfRectangle我们把它加进去。
  • 我们不制造listOfRectangle因为我们在多个函数中使用它。
function love.load()
    listOfRectangles = 
end

function createRect()
    local rect = 
    rect.x = 100
    rect.y = 100
    rect.width = 70
    rect.height = 90
    rect.speed = 100

    -- Put the new rectangle in the list
    table.insert(listOfRectangles, rect)
end
  • 尽管我们仍然可以通过在love. load功能。
-- By declaring it here we can access it everywhere in this file.
local listOfRectangles = 

function love.load()
    -- It's empty so we could remove this function now
end
  • 那么,有没有可以使用全局变量的时候呢?人们对此褒贬不一。有些人会告诉你永远不要使用全局变量。我会告诉你,当你在多个文件中需要全局变量时,使用全局变量是没问题的,尤其是作为一个初学者。类似于如何love是一个全局变量。只要记住本地人更快。
  • 请注意,在整个教程中我使用了很多全局变量,但这是为了使代码更小,更容易解释。

🍑五、总结

  • 随着require我们可以加载其他lua文件。当你创建一个变量时,你可以在所有文件中使用它。除非你创建一个局部变量,这个变量被限制在它的作用域内。局部变量不会影响其作用域外同名的变量。总是尝试使用局部变量而不是全局变量,因为它们更快。

🍋总结

以上就是今天要讲的内容,本文仅仅简单介绍了Love2d之多个文件和作用域范围,介绍了love2d的全局变量和局部变量的作用域范围,与博主的lua语言文章结合更好的理解love2d的编码,如果你是一名独立游戏开发者,或者一位对游戏开发有着深厚兴趣,但是又对于unity3d,ue4等这些对于新手而言不太友好的引擎而头疼的开发者;那么现在,你可以试试Love2D。Love2D是一款基于Lua编写的轻量级游戏框架,尽管官方称呼其为引擎,但实际上它只能称得上是一个框架,因为他并没有一套全面完整的解决方案。不过,这款框架上手及其容易,是学习游戏开发的初学者入门的一个良好选择。

以上是关于Love2d从青铜到王者第八篇:Love2d之多个文件和作用域范围的主要内容,如果未能解决你的问题,请参考以下文章

Love2d从青铜到王者第七篇:Love2d之对象

Love2d从青铜到王者第十三篇:Love2d之游戏:射击敌人(Game: Shoot the enemy)

Love2d从青铜到王者第十五篇:Love2d之角度和距离(Angles and distance)

Love2d从青铜到王者第十一篇:Love2d之图像(Images)

Love2d从青铜到王者第五篇:Love2d之if语句

Love2d从青铜到王者第十二篇:Love2d之碰撞检测(Detecting collision)