Manuals
Manuals




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的构建块由什么组成。阅读本手册后,请继续阅读定位手册消息传递手册。编辑器中还提供了一套教程,可以帮助您快速上手。

Building blocks

您可以使用三种基本类型的构建块来构建Defold游戏:

Collection
集合是用于构建游戏结构的文件。在集合中,您可以构建游戏对象和其他集合的层次结构。它们通常用于构建游戏关卡、敌人群体或由多个游戏对象组成的角色。
Game object
游戏对象是具有ID、位置、旋转和缩放的容器。它用于容纳组件。它们通常用于创建玩家角色、子弹、游戏规则系统或关卡加载器。
Component
组件是放置在游戏对象中的实体,为游戏对象提供视觉、听觉和/或逻辑表示。它们通常用于创建角色精灵、脚本文件、添加音效或添加粒子效果。

集合

集合是包含游戏对象和其他集合的树形结构。集合总是存储在文件中。

当Defold引擎启动时,它会加载一个在game.project设置文件中指定的_引导集合_。引导集合通常命名为”main.collection”,但您可以自由使用任何您喜欢的名称。

集合可以包含游戏对象和其他集合(通过引用子集合文件),可以任意深度嵌套。下面是一个名为”main.collection”的文件示例。它包含一个游戏对象(ID为”can”)和一个子集合(ID为”bean”)。子集合又包含两个游戏对象:”bean”和”shield”。

Collection

请注意,ID为”bean”的子集合存储在自己的文件中,名为”/main/bean.collection”,仅在”main.collection”中被引用:

Bean 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(作为文件引用添加)。

组件

组件用于赋予游戏对象特定的表达和/或功能。组件必须包含在游戏对象内部,并受包含该组件的游戏对象的位置、旋转和缩放的影响:

Components

许多组件具有可在运行时操作的特定属性,并且有特定于组件类型的函数可用于在运行时与它们交互:

-- 禁用 "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(添加为文件引用)。

在大多数情况下,原地创建组件是最有意义的,但以下组件类型必须先创建为单独的资源文件,然后才能通过引用添加到游戏对象:

  • 脚本 (Script)
  • 图形用户界面 (GUI)
  • 粒子效果 (Particle FX)
  • 瓦片地图 (Tile Map)

可用组件列表详见 组件概述.

就地添加或通过引用添加的对象

当您创建集合、游戏对象或组件_文件_时,您创建的是我们所说的原型(在其他引擎中也称为”预制件”或”蓝图”)。这只是在项目文件结构中添加了一个文件,并没有在运行的游戏中添加任何内容。要添加基于原型文件的集合、游戏对象或组件的实例,您需要在其中一个集合文件中添加它的实例。

您可以在大纲视图中看到对象实例基于哪个文件。”main.collection”文件包含三个基于文件的实例:

  1. “bean”子集合。
  2. “bean”子集合中”bean”游戏对象中的”bean”脚本组件。
  3. “can”游戏对象中的”can”脚本组件。

Instance

当您有多个游戏对象或集合的实例并希望更改所有实例时,创建原型文件的好处就变得明显:

GO instances

通过更改原型文件,任何使用该文件的实例都将立即更新。

GO changing prototype

这里原型文件的精灵图像被更改,所有使用该文件的实例立即更新:

GO instances updated

创建游戏对象的父子关系

在集合文件中,您可以构建游戏对象的层次结构,使一个或多个游戏对象成为单个父游戏对象的子对象。只需简单地拖动一个游戏对象并将其放置到另一个游戏对象上,被拖动的游戏对象就成为目标游戏对象的子对象:

Childing game objects

对象父子层次结构是一种动态关系,影响对象如何响应变换。在编辑器和运行时,应用于对象的任何变换(移动、旋转或缩放)都会依次应用于对象的子对象:

Child transform

相反,子对象的平移是在父对象的局部空间中完成的。在编辑器中,您可以通过选择Edit ▸ World Space(默认)或Edit ▸ Local Space来选择在局部空间或世界空间中编辑子游戏对象。

也可以在运行时通过向对象发送set_parent消息来更改对象的父级。

local parent = go.get_id("bean")
msg.post("child_bean", "set_parent", { parent_id = parent })

一个常见的误解是,当游戏对象成为父子层次结构的一部分时,它在集合层次结构中的位置会发生变化。然而,这是两个非常不同的概念。父子层次结构动态地改变场景图,允许对象在视觉上相互附加。决定游戏对象地址的唯一因素是它在集合层次结构中的位置。地址在对象的整个生命周期中是静态的。