top of page

16. Customizable LCD による Sprite 描画

 アップデート 1.190 で実装された Customizable LCD では、これまでのテキスト表示に加え Sprite 描画も可能になり、LCD 画面のグラフィック機能が大幅に強化されました。ここでは、Customizable LCD を使った Sprite 描画の基本的な手順をご紹介します。


 

13-1. IMyTextSurfaceProvider オブジェクトの取得

 まず、描画する LCD 画面を持つブロックを IMyTextSurfaceProvider オブジェクトとして取得します。ただし、LCD 画面を持つすべてのブロックが IMyTextSurfaceProvider として取得できる訳ではありません。例えば、Medical Room は LCD 画面を持っていますが、この LCD にはアクセスできないようです。IMyTextSurfaceProvider として取得できるブロックとしては、CryoChamber, Cockpit, ProgrammableBlock, Projector (?) , LCD Panel があります。オブジェクトの取得は、通常と同じように GridTerminalSystem.GetBlockWithName などを使います。

 var tsp = GridTerminalSystem.GetBlockWithName("LCD Panel1") as IMyTextSfurfaceProvider;

 LCD Panel (IMyTextPanel) は、IMyTextSurfaceProvider ではないそうで、上の例のように IMyTextSurfaceProvider にキャストはできるのですが、次の例のようにすべての IMyTextSurfaceProvider オブジェクトを List に格納する場合、LCD Panel は List に含まれません。

List<IMyTextSurfaceProvider> blocks = new List<IMyTextSurfaceProvider>();
GridTerminalSystem.GetBlocksOfType<IMyTextSurfaceProvider>(blocks);
foreach (var block in blocks){
    var provider = block as IMyTextSurfaceProvider;
       ⁞
}

13-2. IMyTextSurface オブジェクトの取得

 次に、取得した IMyTextSurfaceProvider オブジェクトから IMyTextSurface を取得します。IMyTextSurfaceProvider オブジェクトが持っている描画可能な LCD 画面が 1 つとは限らず、コックピットなどのように 1 つのオブジェクトに複数の独立した LCD 画面を持つものもあります。このため、実際に描画を行う画面を IMyTextSurfaceProvider オブジェクトの GetSurface(int index) メソッドで以下のように取得します。

var tsp = GridTerminalSystem.GetBlockWithName("LCD Panel1") as IMyTextSfurfaceProvider;
IMyTextSurface surface = tsp.GetSurface(0);

 ちなみに、その IMyTextSurfaceProvider オブジェクトがいくつの画面 (IMyTextSurface) を持つかは、SurfaceCount プロパティーで調べられます。

var tsp = GridTerminalSystem.GetBlockWithName("Cockpit 1") as IMyTextSfurfaceProvider;
int count = tsp.SurfaceCount;

13-3. IMyTextSurface オブジェクトのプロパティー設定と取得

 取得した IMyTextSurface オブジェクトのプロパティーを設定します。スプライト描画をするために、以下の例ようにプロパティーを変更します。

IMyTextSurface surface = tsp.GetSurface(0);
surface.ContentType = ContentType.SCRIPT;
surface.Script = string.Empty;

 ContentType プロパティーは画面に描画するものの種類を指定します。ここではプログラムからスプライトを描画するため、ContentType.SCRIPT を設定します。Script プロパティーは現在実行中のスクリプトで、string.Empty を代入して初期化しておきます。また、描画画面のサイズは Vector2 オブジェクトである TextureSize プロパティーで取得できます。

13-4. MySprite オブジェクトの生成と設定

MySprite.CreateSprite メソッドで描画するスプライトを生成します。

MySprite sprite = MySprite.CreateSprite("SquareSimple", new Vector2(0, 0), new Vector2(1, 1));

 CreateSprite メソッドの第一引数は string 型の文字列でスプライト形状の種類を指定します。現時点で知る限り、この文字列として以下のものが指定可能です。
    

        • SquareSimple: 塗りつぶした四角形
        • SquareHollow: 枠線のみの四角形
        • Circle: 塗りつぶした円
        • CircleHollow: 枠線のみの円
        • SemiCircle: 塗りつぶした半円
        • Arrow: 矢印
        • Cross: ×マーク
        • Triangle: 塗りつぶした三角形
        • RightTriangle: 右向きの塗りつぶした三角形
        • Grid: 格子状パターン
        • Construction: 工事中マーク
        • Danger: 危険マーク
    
 第二引数は画面上での表示座標を表す Vector2 オブジェクトで、第三引数はスプライトのサイズを指定する Vector2 オブジェクトです。上の例では「画面上の座標 (0, 0) に 1x1 のサイズで塗りつぶした四角形」のスプライトを生成することになります。
 MySprite オブジェクトは、以下のように new 演算子でコンストラクターを呼び出すことでも生成できます。第一引数はスプライトの種類を表し、図形を描画する場合は SpriteType.TEXTURE を、テキストを描画する場合は SpriteType.TEXT を指定します。第二引数は上で列挙したスプライト形状の種類、第三引数はサイズ、最後は色の指定です。

var sprite = new MySprite(SpriteType.TEXTURE, "Circle", new Vector2(0, 0), new Color(255, 0, 0, 255));    

 また、テキストをスプライトとして生成したい場合は、次のように new 演算子でコンストラクターを呼べば生成できます。第一引数は、上と同じスプライトの種類、第二引数は表示するテキスト (string)、第三、第四、第五引数がそれぞれ表示位置 (Vector2)、サイズ (Vector2)、色 (Color) を表しこれら3つの引数は null に設定可能です。第六引数がフォントID (string)、第七引数が文字の配置 (TextAlignment) で最後がフォントサイズ (float) です。第四引数のサイズに Vector2 オブジェクトを指定しても表示内容には反映されないようです。   

var sprite = new MySprite(SpriteType.TEXT, "Customizable LCD", null, null, new Color(255, 0, 0, 255), "Arial", TextAlignment.LEFT, 2f);

 生成したスプライトオブジェクトの色や位置、サイズは、以下のようにプロパティーを設定すれば変更できます。

sprite.Color = new Color(255, 0, 0, 255);
sprite.Position = new Vector2(10, 10);
sprite.Size = new Vector2(5, 10);

13-5. MySpriteDrawFrame の生成とスプライト書き込み

 取得した IMyTextSurface オブジェクトの DrawFrame() メソッドを使い、MySpriteDrawFrame オブジェクトを生成します。生成した MySpriteDrawFrame オブジェクトに Add メソッドを使って、生成しておいた MySprite オブジェクトを追加します。この例では、using ステートメントを使っているので、このステートメントを抜けると自動的に frame を破棄してリソースを開放します。MySpriteDrawFrame オブジェクトに追加したスプライトはこの破棄のタイミングで surface に実際に描画されます。

using (var frame = surface.DrawFrame()){
    frame.Add(sprite);
}

 このように、オブジェクトが破棄されるタイミングで描画が実行されるので、using ステートメントを使わない場合は、Dispose() メソッドでリソースを開放すると描画が行われます。

var frame = surface.DrawFrame();
frame.Add(sprite);
frame.Dispose();

 以上が LCD を持つブロックへのスプライト描画の流れです。同じ IMyTextSurface オブジェクトに対し、上で紹介したスプライトの生成・更新、フレームの生成とスプライトの追加、フレームの破棄を連続して行えば、アニメーション表現も可能です。
 ここでは紹介していないメソッドとプロパティーがまだたくさんありますので、いろいろと試してみてはいかがでしょうか。

bottom of page