在前面三个教程中,我们介绍了许多与本游戏没有直接关系的代码。这些代码都可以独立于该游戏使用,这也是为什么我将其称为engine
代码,即使这些代码并不能真正意义上构成一个游戏引擎。随着我们游戏开发进度的推进,我将持续不断地添加属于该类别的代码,这些代码可以在多个游戏中复用。如果要说你从这一些系列教程中可以抽离出什么可重用的内容,那么这些代码绝对符合,随着时间的推移,这些代码对我而言也越来越实用。
马上我们就将进入游戏本身的开发,在继续进行下一部分教程之前,你需要熟悉之前教程里介绍的一些概念,因此让我们进行更多的练习。
-
在
Area
类中创建一个getGameObjects
函数,其功能如下:-- Get all game objects of the Enemy class all_enemies = area:getGameObjects(function(e) if e:is(Enemy) then return true end end) -- Get all game objects with over 50 HP healthy_objects = area:getGameObjects(function(e) if e.hp and e.hp >= 50 then return true end end)
它接受一个函数作为参数,该函数接受一个游戏对象作为参数,执行某些测试逻辑,最终返回测试结果(
true
或false
)。如果测试结果为真,则将该游戏对象添加到结果列表中,最终将结果列表返回。 -
思考:
a
、b
、c
、d
、e
、f
和g
值分别是多少?a = 1 and 2 b = nil and 2 c = 3 or 4 d = 4 or false e = nil or 4 f = (4 > 3) and 1 or 2 g = (3 > 4) and 1 or 2
-
创建一个名为
printAll
的函数,该函数接收位置数量的参数,并将它们全部打印到控制台。例如:printAll(1, 2, 3)
将打印 1,2 和 3 到控制台,printAll(1, 2, 3, 4, 5, 6, 7, 8, 9)
将打印 1 ~ 9 到控制台。 -
与上一个练习类似,创建一个名为
printText
的函数,该函数接收未知数量的字符串,将它们全部连接成一个字符串,并打印到控制台。 -
思考:如何触发垃圾回收?
-
思考:如何显示 Lua 程序当前使用了多少内存?
-
思考:如何主动触发一个错误来终止程序执行,并打印一个自定义错误信息?
-
创建一个名为
Rectangle
的类,该类在其创建的位置绘制一个给定长宽的矩形。在屏幕上的随机位置创建 10 个随机宽高的Rectangle
实例。当按下d
键时,应随机删除一个矩形实例。当剩余的实例数为 0 时,应重新在屏幕的随机位置创建 10 个随机宽高的实例。 -
创建一个名为
Circle
的类,该类在其创建的位置绘制一个给定半径的圆。在屏幕上的随机位置间隔 0.25 秒创建 10 个随机半径的Circle
实例,创建完所有实例后(即 2.5 秒后),每 [0.5, 1] 秒(即 0.5 ~ 1 之间的随机数,包含 0.5 和 1)删除一个随机实例。当删除所有实例后,重复创建 10 个实例的过程,并重复删除它们,这个过程将永远重复下去。 -
在
Area
类中创建一个queryCircleArea
函数,其功能如下:-- Get all objects of class 'Enemy' and 'Projectile' in a circle of 50 radius around point 100, 100 objects = area:queryCircleArea(100, 100, 50, {'Enemy', 'Projectile'})
它接收一个位置
x
、y
和一个半径radius
,以及一个包含目标类名称的字符串列表。然后它将返回以x
、y
为中心的半径为radius
的圆内所有属于这些类的对象实例。 -
在
Area
类中创建一个getClosestGameObject
函数,其功能如下:-- Get the closest object of class 'Enemy' in a circle of 50 radius around point 100, 100 closest_object = area:getClosestObject(100, 100, 50, {'Enemy'})
它接收和
queryCircleArea
相同的参数,不过它只返回离圆心最近的那个实例。 -
思考:在调用对象方法之前,如何检查该对象上是否存在对应方法?以及在使用对象字段之前,如何判断该对线包含对应字段?
-
思考:仅使用一个
for
循环,如何将一个表的内容写入另一个表?