All tutorials

为你的程序创建的对象命名

Beginner 10 min engine

一个程序可以创建上百个对象,却在Scene Graph里一个都不显示。命名,正是让某个对象出现的动作,它对sprite、text、3D对象、灯光和粒子都同样适用。

你将学到什么#

你将写一个小小的BASIC程序,看着Scene Graph在程序明明正常运行的情况下依然保持空白,然后通过命名让每个对象出现。读完之后,你会明白为什么这棵树隐藏了程序构建出的大部分内容,以及如何选择它要显示什么。

开始之前#

  • Engine是一个通过众筹解锁的模块。InkwellVectraPDF Studio是这三个免费模块。
  • 不需要任何前置教程。下面的全部内容就是一段脚本。
  • Scene Graph面板打开,放在视口旁边。它就是这个练习的重点所在。

步骤#

  1. 打开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
    
  2. 看一眼Scene Graph。精灵已经显示在屏幕上,灯光也亮着,但这棵树什么都没有显示。这不是一个bug,这就是本课的全部重点。

    **提示:**面板会显示一个未命名对象的计数。这个数字,就是这棵树刻意没有列出的、属于你程序输出的那一部分。

  3. 给精灵命名。在SpritePosition之后加上这一行,再按一次Play

    SpriteName(sprite, "player")
    

    player出现在了树里。屏幕上没有其他任何变化:命名不会创建、移动或绘制任何东西。它只是发布。

  4. 也给灯光命名,用与这个想法一起出现的命令:

    LightName(1, "sun")
    

    现在树里有两条记录了。点击其中一个:inspector会随之更新,就跟你手动摆放的对象一模一样。

  5. 添加粒子并给它命名,这样你就能看到,这条规则并不是只针对精灵的:

    CreateParticles(1, 200.0, 200.0)
    ParticlesName(1, "smoke")
    
  6. 现在删掉这三行命名代码,再按下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中没有对应的条目:它们是资源,不是场景对象,即便给它们命名,也不会在任何地方显示出来。

进一步探索#