Demo 6

DGC のヘルプを見た人は解るかもしれないが、現時点でのヘルプはまだ完全ではない。たとえば DGCSpriteMgr のヘルプなどを見ると、このように書いてある。

THIS COMPONENT WILL BE FULLY DOCUMENTED IN A LATER RELEASE. PLEASE REFER TO THE SOURCE CODE FOR MORE INFORMATION

つまり「ヘルプはまだ出来てないから、デモプログラムを見てね」と書いてあるのである。文章だけの説明があって、「例」が無いヘルプも困るが、もう少し何とかして欲しい。もちろん、今後のバージョンでは追加されていくはずである。さて、今回のデモプログラムには新しいコンポーネントは出てこない。主に「Sprites.AddRaceCar」の説明のためにある。

procedure TForm1.DGCScreen1Initialize(Sender: TObject);
begin
     //Add car animation
     DGCSpriteMgr1.Animations.Add('car', True);
     with DGCSpriteMgr1.Animations[0] do
     begin
          SetFrames(0, 100, [0]);
          SetFrames(2, 100, [1]);
          SetFrames(4, 100, [2]);
          SetFrames(6, 100, [3]);
          SetFrames(8, 100, [4]);
          SetFrames(10, 100, [5]);
          SetFrames(12, 100, [6]);
          SetFrames(14, 100, [7]);
          SetFrames(16, 100, [8]);
          SetFrames(18, 100, [9]);
          SetFrames(20, 100, [10]);
          SetFrames(22, 100, [11]);
          SetFrames(24, 100, [12]);
          SetFrames(26, 100, [13]);
          SetFrames(28, 100, [14]);
          SetFrames(30, 100, [15]);
     end;
ここは、今回のメインであるレースカーのアニメーションを定義している。SpriteMgr は最大で 32 方向のイメージをアニメーションに関連付けられるが、今回はそのうちの 16 方向にイメージを割り当てている。AddRaceCar で追加されたスプライトは DGCSpriteMgr がその動作を管理していて、移動方向も 32 方向に固定になるようだ。使われていない方向のフレームに来た場合はどうするのかというと、単にイメージが変更されないだけの様子。ただし移動は指定した方向(0-31)となる。

またこのほかにも、カーソルキーにより方向を変えたり、[ctrl] キーがアクセル、[sift] キーがブレーキなど、全て自動で入力判定などをやってくれている。このような例は他のスプライトタイプにも当てはまるが(Player8 など)、それぞれのスプライトは Automatic プロパティを持っており、これが False の場合は勝手には動かなくなる。ハンドルやアクセルやブレーキに使っているキーに関しても、DGCSpriteMgr の KeyFire1 、KeyFire2 、KeyLeft 、KeyRight のようなプロパティを変更することで、自分の気に入ったキーに割り当てを変更できる。

  //Add car sprite
  DGCSpriteMgr1.Sprites.AddRaceCar(0, 320, 360, 8, 4, 0);
  with DGCSpriteMgr1.Sprites[0] as TDGCRaceCar do
  begin
    AllActions := laStopInside;
    Handling := 50; //try changing this value < 50 = better handling
                    //Also try changing Acceleration/Decelleration
  end;
コーンのスプライトに関する部分は飛ばして、ここはレースカーのスプライトの定義部分である。Handling というプロパティがあるが、これを変更することによってハンドルの効き具合が変わるようになっている。AllActions の値も設定しているが、実は今回のデモではまったく関係が無い。

procedure TForm1.DGCScreen1Flip(Sender: TObject);
var
   sx, sy, n: Integer;
begin
     //Draw background image
     DGCScreen1.Back.Draw(0, 0, DGCScreen1.Images[16], False);

     //Update the sprites but save car x, y in case hit side of track
     with DGCSpriteMgr1.Sprites[0] do
     begin
          sx := x;
          sy := y;
          DGCSpriteMgr1.Update;
          if DGCScreen1.Back.CollisionTest(0, 0, DGCScreen1.Images[Frame],
              X, Y, True) then
          begin
               X := sx;
               Y := sy;
               Speed := 0;
          end;
      end;
ここで注目すべきところは、スプライトの衝突判定である。道路の縁との衝突も、CollisionTest を使ってやっている。1画面に収まるようなコースなら、このような方法も実にお手軽で良い。コースのイメージも、スプライトと同じ様に DGCImageLib に収まっているので中を見て確認しておいて欲しい。方法は、DGCImageLib の Images プロパティのところにある「・・・」をクリックすれば良い。

今回は解説する部分が少ないのでもう少し、このデモの道路の色を変更する方法を説明しておこう。上の方法でイメージを見ることが出来たら、まず「Save Library」を押す。ここでは「Demo6」とでもしてセーブしておく。次にイメージライブラリエディタを立ち上げ、今セーブした「Demo6.iml」を開いて、「Edit Image Library Palette」ボタンを押す。そこで、一番左上の色を(今はグレーになっているはず)ダブルクリックして、好きな色に変更する。「Save Image Library」ボタンを押して、上書きセーブをする。もう一度 DGCImageLib の Images プロパティの「・・・」から、「Open Library」を選らんで、「Demo6.iml」をロードする。デルファイで実行する。

以上で Demo 6 の説明を終わる。このプログラムを改造して、ラップタイムを計るようにすれば、もうそれでゲームの完成である。

もどる