This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Defold设计的核心是几个非常重要的概念,掌握这些概念至关重要。本手册解释了Defold的构建块由什么组成。阅读本手册后,请继续阅读定位手册和消息传递手册。编辑器中还提供了一套教程,可以帮助您快速上手。
您可以使用三种基本类型的构建块来构建Defold游戏:
集合是包含游戏对象和其他集合的树形结构。集合总是存储在文件中。
当Defold引擎启动时,它会加载一个在game.project设置文件中指定的_引导集合_。引导集合通常命名为”main.collection”,但您可以自由使用任何您喜欢的名称。
集合可以包含游戏对象和其他集合(通过引用子集合文件),可以任意深度嵌套。下面是一个名为”main.collection”的文件示例。它包含一个游戏对象(ID为”can”)和一个子集合(ID为”bean”)。子集合又包含两个游戏对象:”bean”和”shield”。
请注意,ID为”bean”的子集合存储在自己的文件中,名为”/main/bean.collection”,仅在”main.collection”中被引用:
您无法对集合本身进行寻址,因为没有与”main”和”bean”集合对应的运行时对象。但是,您有时需要使用集合的标识作为游戏对象_路径_的一部分(详细信息请参阅定位手册):
-- file: can.script
-- 获取"bean"集合中"bean"游戏对象的位置
local pos = go.get_position("bean/bean")
集合总是作为对集合文件的引用添加到另一个集合中:
在Outline视图中右键单击集合并选择Add Collection File。
游戏对象是在游戏执行期间各自具有独立生命周期的简单对象。游戏对象具有位置、旋转和缩放,每个属性都可以在运行时进行操作和动画处理。
-- 为"can"游戏对象的X位置设置动画
go.animate("can", "position.x", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_LINEAR, 1.0)
游戏对象可以空着使用(例如作为位置标记),但通常配备各种组件,如精灵、声音、脚本、模型、工厂等。游戏对象要么在编辑器中创建,放置在集合文件中,要么在运行时通过_factory_组件动态生成。
游戏对象可以直接添加到集合中,或者作为对游戏对象文件的引用添加到集合中:
在Outline视图中右键单击集合并选择Add Game Object(就地添加)或Add Game Object File(作为文件引用添加)。
组件用于赋予游戏对象特定的表达和/或功能。组件必须包含在游戏对象内部,并受包含该组件的游戏对象的位置、旋转和缩放的影响:
许多组件具有可在运行时操作的特定属性,并且有特定于组件类型的函数可用于在运行时与它们交互:
-- 禁用 "can" 的 "body" 精灵
msg.post("can#body", "disable")
-- 1 秒后在 "bean" 上播放 "hoohoo" 声音
sound.play("bean#hoohoo", { delay = 1, gain = 0.5 } )
组件可以直接添加到游戏对象中,也可以作为组件文件的引用添加到游戏对象:
在 Outline 视图中右键点击游戏对象,然后选择 Add Component(原地添加)或 Add Component File(添加为文件引用)。
在大多数情况下,原地创建组件是最有意义的,但以下组件类型必须先创建为单独的资源文件,然后才能通过引用添加到游戏对象:
可用组件列表详见 组件概述.
当您创建集合、游戏对象或组件_文件_时,您创建的是我们所说的原型(在其他引擎中也称为”预制件”或”蓝图”)。这只是在项目文件结构中添加了一个文件,并没有在运行的游戏中添加任何内容。要添加基于原型文件的集合、游戏对象或组件的实例,您需要在其中一个集合文件中添加它的实例。
您可以在大纲视图中看到对象实例基于哪个文件。”main.collection”文件包含三个基于文件的实例:
当您有多个游戏对象或集合的实例并希望更改所有实例时,创建原型文件的好处就变得明显:
通过更改原型文件,任何使用该文件的实例都将立即更新。
这里原型文件的精灵图像被更改,所有使用该文件的实例立即更新:
在集合文件中,您可以构建游戏对象的层次结构,使一个或多个游戏对象成为单个父游戏对象的子对象。只需简单地拖动一个游戏对象并将其放置到另一个游戏对象上,被拖动的游戏对象就成为目标游戏对象的子对象:
对象父子层次结构是一种动态关系,影响对象如何响应变换。在编辑器和运行时,应用于对象的任何变换(移动、旋转或缩放)都会依次应用于对象的子对象:
相反,子对象的平移是在父对象的局部空间中完成的。在编辑器中,您可以通过选择Edit ▸ World Space(默认)或Edit ▸ Local Space来选择在局部空间或世界空间中编辑子游戏对象。
也可以在运行时通过向对象发送set_parent
消息来更改对象的父级。
local parent = go.get_id("bean")
msg.post("child_bean", "set_parent", { parent_id = parent })
一个常见的误解是,当游戏对象成为父子层次结构的一部分时,它在集合层次结构中的位置会发生变化。然而,这是两个非常不同的概念。父子层次结构动态地改变场景图,允许对象在视觉上相互附加。决定游戏对象地址的唯一因素是它在集合层次结构中的位置。地址在对象的整个生命周期中是静态的。
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB