你将学到什么#
你将写一个小小的BASIC程序,看着Scene Graph在程序明明正常运行的情况下依然保持空白,然后通过命名让每个对象出现。读完之后,你会明白为什么这棵树隐藏了程序构建出的大部分内容,以及如何选择它要显示什么。
开始之前#
- Engine是一个通过众筹解锁的模块。Inkwell、Vectra和PDF Studio是这三个免费模块。
- 不需要任何前置教程。下面的全部内容就是一段脚本。
- 把Scene Graph面板打开,放在视口旁边。它就是这个练习的重点所在。
步骤#
-
打开Engine,新建一个空场景,打开脚本编辑器。粘贴下面的代码,然后按下Play:
image = LoadImage("hero.png") sprite = CreateSprite(image) SpritePosition(sprite, 100.0, 120.0) CreatePointLight(1, 0.0, 5.0, 0.0, 10.0, 255, 255, 255) DO Sync() LOOP -
看一眼Scene Graph。精灵已经显示在屏幕上,灯光也亮着,但这棵树什么都没有显示。这不是一个bug,这就是本课的全部重点。
**提示:**面板会显示一个未命名对象的计数。这个数字,就是这棵树刻意没有列出的、属于你程序输出的那一部分。
-
给精灵命名。在
SpritePosition之后加上这一行,再按一次Play:SpriteName(sprite, "player")player出现在了树里。屏幕上没有其他任何变化:命名不会创建、移动或绘制任何东西。它只是发布。 -
也给灯光命名,用与这个想法一起出现的命令:
LightName(1, "sun")现在树里有两条记录了。点击其中一个:inspector会随之更新,就跟你手动摆放的对象一模一样。
-
添加粒子并给它命名,这样你就能看到,这条规则并不是只针对精灵的:
CreateParticles(1, 200.0, 200.0) ParticlesName(1, "smoke") -
现在删掉这三行命名代码,再按下Play。场景完全一样,树又空了,未命名计数也回到了三。
**警告:**名字不是id。
SpriteName(sprite, "player")给id存在sprite变量里的那个精灵打上了标签,但并不能让你之后用这个标签找到它。id才是你真正持有的句柄。
结果#
你可以决定自己的程序显示什么。一个prop、一盏灯和一个发射器,会以你选择的名字出现;而一个真实程序构建出的成百上千个技术性对象,则会留在视线之外。
为什么会有这条规则#
一个典型的BASIC程序会不停地创建对象:每颗子弹一个精灵,每一位分数一个文本,每一格地图一张图像。把它们全部列出来,用不了几秒Scene Graph就会变得无法阅读,而你真正关心的那三个对象则会被淹没在噪音里。
所以这棵树不会显示一切,也不会靠猜测去隐藏其余部分。它显示的是你命名过的东西,并且会把其余的计数出来,确保没有东西被悄无声息地藏起来。这个筛选标准是你定的,不是引擎定的。
哪些对象可以被命名#
| 命令 | 命名的对象 |
|---|---|
SpriteName(id, name) | 一个精灵 |
TextName(id, name) | 一个文本对象 |
ObjectName(id, name) | 一个3D对象 |
LightName(id, name) | 一盏点光源或方向光 |
ParticlesName(id, name) | 一个2D或3D的粒子发射器 |
声音、图像、memblock和字体在Scene Graph中没有对应的条目:它们是资源,不是场景对象,即便给它们命名,也不会在任何地方显示出来。