WisdomSoft - for your serial experiences.

背景のクリア

ゲーム画面の表示先である GraphicsDevice オブジェクトをクリアし、現在のゲーム画面を指定した色で塗りつぶします。

色の表現

GraphicsDeviceManager クラスのインスタンスを生成することで、ゲームに GraphicsDevice オブジェクトが提供されます。このオブジェクトを使って、画像や 3D モデルなどを描画できるようになりますが、この場では描画の準備として、ゲーム画面を特定の色で塗りつぶす方法を説明します。

前述したように、ゲーム画面の描画は主に Draw() メソッド内で行います。もちろん、GraphicsDevice オブジェクトが有効であれば Draw() メソッド以外の場所からでも描画できますが、ゲームループの性質上、Draw() メソッドの中で描画することが望ましいでしょう。

ゲーム画面を指定の色で塗りつぶすには Clear() メソッドを使います。このメソッドは、GraphicsDevice オブジェクトに設定されている現在の描画領域を指定された色で塗りつぶします。

GraphicsDevice クラス Clear() メソッド
public void Clear (Color color)

color パラメータには、画面を塗りつぶす色を指定します。

コード1
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new TestGame()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;

    public TestGame()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Red);
        base.Draw(gameTime);
    }
}
実行結果
コード1 実行結果

コード1は Draw() メソッド内で Clear() メソッドを呼び出し、背景を赤色で塗りつぶしています。赤色は、Color 構造体の静的な Red プロパティから取得していますが、明示的に Color オブジェクトをインスタンス化しても構いません。

Color color = new Color(0xFF, 0, 0);

上記の方法でも、Red プロパティと同じ赤色の Color オブジェクトが得られます。

実行結果を見れば、Clear() によってゲーム画面が赤色に塗りつぶされていることを確認できます。当然、Clear() メソッドに渡す色を変更することで、自由な色で背景をクリアできます。

このプログラムでは Clear() メソッド以降、ゲーム画面に何も描画していないので Draw() メソッドで何度も繰り返し塗りつぶすことに大きな意味を感じないかもしれません。しかし、この後の処理でゲーム画面に画像や 3D モデルを描画し 1 フレームを構築することになるので、前のフレームで描画した内容を、毎回 Clear() メソッドで消さなければなりません。

背景色アニメーション

Update() メソッドと Draw() メソッドが繰り返し呼び出される性質を利用して、Update() メソッド内で少しずつ値を変化させることでアニメーションを実現できます。この場では、背景色となる色要素を変数にし、Update() メソッドで少しずつ値を加えたり、減らしたりします。これによって、Update() メソッドが呼び出されるたびに少しずつ背景色が変化します。

この方法を応用し、描画する画像の座標などに適用することで、キャラクターを動かすといったアニメーションを実現できます。 

コード2
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

public class TestGame : Game
{
    public static void Main(string[] args)
    {
        using (Game game = new TestGame()) game.Run();
    }

    private GraphicsDeviceManager graphicsDeviceManager;
    private Color color = new Color(0, 0, 0);
    private int ci = 0;
    private bool isInc = true;

    public TestGame()
    {
        graphicsDeviceManager = new GraphicsDeviceManager(this);
    }
    
    protected override void Update(GameTime gameTime)
    {
        ci += isInc ? 1 : -1;
        if (ci == 255) isInc = false;
        else if (ci == 0) isInc = true;

        color = new Color(ci, ci, ci);
        
        base.Update(gameTime);
    }
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(color);
        base.Draw(gameTime);
    }
}
実行結果

コード2は、整数型の ci フィールドを用意し、Update() メソッドで ci フィールドの値から Color オブジェクトを生成して color フィールドに保存しています。この Color オブジェクトは Draw() メソッド内で背景をクリアするために用いられます。Draw() メソッドは、コード1と同じく Clear() メソッドで背景をクリアしているだけです。しかし、color フィールドの値が Update() メソッドが呼び出されるたびに更新され続けるため、背景色はフレーム毎に少しずつ変化していきます。