BG をドット単位にスクロール



Map Data を TEXT FILE から入力します。
BG(Back Ground) をドット単位にスクロールします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

TEXT FILE から入力する

  1. 背景画像を作成するツール(Mapedit)を使うと Map Chip の並びデータを TEXT FILE に保存することが出来ます。
    説明は 前田稔の超初心者のプログラム入門 から 「C++ Windows 入門」を参照して下さい。
    これを二次元配列の初期値として設定するのは、データ量が多いこともあり、結構手間がかかります。
    そこで、TEXT 形式の FILE からデータを入力して二次元配列に格納するメソッドを BG Class に追加しました。
  2. ファイルの入出力を行うときは using で System.IO; を設定して下さい。
    namespace Main の最初に BG Object Class を定義します。
    using System.IO;    //File 入力のとき必要です
    
    namespace Main
    {
        #region ★BG(Back Ground) Object Class
        public class BG
        {
            //BG(Back Ground) Object Class を定義する
        }
        #endregion
    
  3. class Game1 の最初に次の領域を宣言して下さい。
    myTexture; が BG に使用するマップチップ画像です。
    BG bg; が Back Ground Object Class の定義です。
    map = new int[30, 40] は BG を構成する MapChip の並び情報を格納する二次元配列です。
    scroll は、この後で説明する BG のスクロール値を格納する領域です。
            Texture2D   myTexture;     // 描画に使用するテクスチャ
            BG          bg;            // Back Ground Class
            int[,]      map = new int[30, 40];
            Vector2     scroll = new Vector2(0, 0);
        
  4. LoadContent() メソッドで画像をロードして、BG Object Class を初期化します。
    Map.png がマップチップの画像です。
    BG(myTexture,16) の 16 はマップチップのサイズです。
    bg.GetTxt("C:\\data\\test\\Map.txt",map); で二次元配列 map に Map.txt から並びデータを格納します。
    Map.txt はフルパスで指定するか、またはカレントディレクトリ(実行プログラムと同じフォルダー)に置いて下さい。
                // TODO: use this.Content to load your game content here
                myTexture = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\Map.png");
                bg = new BG(myTexture, 16);
                bg.GetTxt("C:\\data\\test\\Map.txt",map);
        
  5. 後は Mapchip を組み合わせて背景を作成 と同じです。

BG をドット単位にスクロール

  1. ゲームではウインドウの何十倍もの背景画像を使用して、スクロールしながらプレイすることが良くあります。
    一枚の画像のスクロールは簡単なのですが、マップチップを並べた BG をドット単位にスクロールするのは一苦労です。
    そこで BG Object Class にドット単位でスクロールするメソッドを追加しました。
    またウインドウの任意の座標(矩形領域)を指定して、BG を描画できるようになっています。
  2. scroll がドット単位で BG のスクロール値を設定する領域で、初期値としてゼロを格納しています。
    Vector2 scroll = new Vector2(0, 0);
  3. Update() メソッドで矢印キーを検出してスクロール値を制御します。
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // TODO: Add your update logic here
                KeyboardState keyState = Keyboard.GetState();
                if (keyState.IsKeyDown(Keys.Left))  scroll.X -= 1;
                if (keyState.IsKeyDown(Keys.Right)) scroll.X += 1;
                if (keyState.IsKeyDown(Keys.Up))    scroll.Y -= 1;
                if (keyState.IsKeyDown(Keys.Down))  scroll.Y += 1;
                if (scroll.X < 0) scroll.X = 0;
                if (scroll.Y < 0) scroll.Y = 0;
        
  4. Draw() メソッドで Map Chip を描画します。
    new Rectangle(60,100,600,400) が BG を描画する矩形領域で、scroll がスクロール情報です。
    scroll.X で横方向の、scroll.Y で縦方向のスクロール値を、ドットを単位として設定します。
                // TODO: Add your drawing code here
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
                bg.Draw(spriteBatch, map, new Rectangle(60,100,600,400), scroll);
                spriteBatch.End();
        

【演習】

  1. 適当なキャラクタの画像を調達してきて BG をスクロールしながら動かしてみて下さい。
    キャラクタの位置と BG のスクロールには、代表的な二種類の方法があります。
  2. キャラクタを画面の中央に置いて、BG をスクロールする。
    1. キャラクタを画面の中央に表示して、前後左右の動きに合わせて BG をスクロールします。
    2. 背景画像の端に近づいて、BG がスクロール出来なくなったら、キャラクタの座標を移動します。
    3. BG がその方向にスクロール出来なくなり、キャラクタが画面の端に来たら行き止まりです。
  3. キャラクタがウインドウの端にきたら BG をスクロールする。
    1. キャラクタを前後左右の動きに合わせて移動します。
    2. キャラクタがウインドウの端にきたら背景画像のスクロールを始めます。
    3. キャラクタがウインドウの端に来て、その方向にスクロール出来なくなったら行き止まりです。

超初心者の方のためにソースコードを掲載します。 (^_^;)
ソースコード抜粋

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(XNA(C#) game program)