All tutorials

プログラムが作るものに名前を付ける

Beginner 10 min engine

プログラムは100個のオブジェクトを作成しても、そのどれもScene Graphには表示しないことがあります。名前を付けることでオブジェクトが表示されるようになり、この仕組みはスプライト、テキスト、3Dオブジェクト、ライト、パーティクルのすべてで機能します。

学べること#

短いBASICプログラムを書き、明らかに動作しているのにScene Graphが空のままであることを確認したうえで、名前を付けることで各オブジェクトを表示させます。読み終える頃には、ツリーがプログラムの生成物のほとんどを隠す理由と、何を表示させるかを自分で選ぶ方法がわかります。

始める前に#

  • Engineは支援が必要なモジュールです。InkwellVectraPDF Studioが無料の3モジュールです。
  • 事前のチュートリアルは不要です。以下はすべて1本のスクリプトで完結します。
  • 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を見てみましょう。スプライトは画面に表示され、ライトも点灯していますが、ツリーには何も表示されません。これはバグではなく、この演習全体の要点です。

    ヒント: パネルには名前のないオブジェクトの数が表示されます。その数字が、ツリーがあえて一覧に載せなかった、あなたのプログラムの出力です。

  3. スプライトに名前を付けます。SpritePositionの後に1行追加して、もう一度Playを押します。

    SpriteName(sprite, "プレイヤー")
    

    プレイヤーがツリーに現れます。画面上では他に何も変わっていません。名前を付けることは、作成することでも、動かすことでも、描画することでもありません。公開する行為です。

  4. このアイデアとともに追加されたコマンドで、ライトにも名前を付けます。

    LightName(1, "太陽")
    

    これで項目は2つになりました。どちらかをクリックすると、手で配置したオブジェクトのときとまったく同じように、インスペクターが追従します。

  5. パーティクルを追加して名前を付け、このルールがスプライトだけの話ではないことを確認しましょう。

    CreateParticles(1, 200.0, 200.0)
    ParticlesName(1, "煙")
    
  6. では、名前付けの3行を削除してPlayを押してみます。シーンはまったく同じですが、ツリーは再び空になり、名前のないオブジェクトの数は3に戻ります。

    警告: 名前はIDではありません。SpriteName(sprite, "プレイヤー")spriteというIDを持つスプライトにラベルを付けるだけで、後からそのラベルで検索できるようにするものではありません。IDが、変わらず自分の手がかりです。

結果#

プログラムが何を表示するかを、自分で決められるようになりました。選んだ名前のもとに、プロップ、ライト、エミッターが表示され、実際のプログラムが作る何百もの技術的なオブジェクトは表に出てきません。

このルールがある理由#

典型的なBASICプログラムは、絶え間なくオブジェクトを作り続けます。弾丸ごとのスプライト、スコアの桁ごとのテキスト、タイルごとの画像です。そのすべてを一覧表示すれば、Scene Graphは数秒で読めなくなり、本当に気にかけている3つのオブジェクトはノイズの中に埋もれてしまいます。

そのためツリーは、すべてを表示したり、当て推量で残りを隠したりはしません。あなたが名前を付けたものを表示し、それ以外は数えることで、何も静かに消えてしまわないようにします。このフィルターはエンジンのものではなく、あなたのものです。

名前を付けられるオブジェクト#

コマンド名前を付けられるもの
SpriteName(id, name)スプライト
TextName(id, name)テキストオブジェクト
ObjectName(id, name)3Dオブジェクト
LightName(id, name)ポイントライトまたはディレクショナルライト
ParticlesName(id, name)パーティクルエミッター(2Dまたは3D)

サウンド、画像、メモリブロック、フォントには、Scene Graphに対応する行がありません。それらはシーンオブジェクトではなくリソースであり、名前を付けたところで、どこにも何も表示されません。

さらに進むには#