0

私は現在、古典的なゲームであるスペース インベーダーの独自のバージョンを作成している A-Level Computing プロジェクトを行っています。

スペースインベーダーの波を作成するには、画像をディスクからロードしてフォームに表示する画像の 2D 配列を使用したいのですが、画像を配列にロードしてから配列を表示する方法がわかりません。形。

現在の配列は次のとおりです。

ImagePaths:array [1..3] of string =('SpaceInvader1.jpg', 'SpaceInvader2.jpg', 'SpaceInvader3.jpg'); 

Wave:array[1..11, 1..5] of TImage; x,y:integer; 

私が知りたいのは、画像を配列要素にロードするにはどうすればよいですか? たとえば、'SpaceInvader1.jpg' を配列要素 [1,1] にロードするにはどうすればよいですか?

どんな助けでも大歓迎です。

4

2 に答える 2

2

グラフィカル アニメーションをコーディングする場合は、おそらくフォーム上で直接実行したくないでしょう。特にスムーズにアニメートし、ちらつきやグラフィカルなアーティファクトをあまり発生させたくない場合は、物事を動かそうとするのが難しい場合があります。

レンダリング ライブラリを使用することをお勧めします。ワークフローは次のようになります。

  • フォームにレンダリング コンテキストを作成します。これは、グラフィカル アニメーションを実行するためのサーフェスを提供するコントロールです。
  • 3 つのイメージをメモリに読み込みます。
  • モンスターに関連付けられたゲーム データを表すオブジェクトの配列を作成します。(位置、移動方向、速度など) 平面でも 2D でもどちらでも構いません。
  • 次のようなレンダリング ループを設定します。
    • 配列内の各モンスターについて、その位置に引きます。
    • プレイヤーの船とすべての発射体を描画します。
    • 衝突をチェックし、適切に処理します。
    • プレーヤーの入力を確認し、適切に処理します。

Pascal Game Developmentのフォーラムでは、Delphi のレンダリング ライブラリに関する多くの情報を見つけることができます。

于 2013-03-17T18:59:21.760 に答える
2

次の宣言があります。

ImagePaths:array [1..3] of string =(
  'SpaceInvader1.jpg', 
  'SpaceInvader2.jpg', 
  'SpaceInvader3.jpg'
); 
Wave: array[1..11, 1..5] of TImage; 

画像の配列を作成する方法を知りたいです。3枚で足りる画像を55枚作るのはかなりもったいないです。その代わりに、間接参照を使用してください。画像への参照を保存します。AndTImageはビジュアル コンポーネントであるため、スプライトには適していません。

次のように画像を配列に保持します。

Sprites: array [1..3] of TBitmap;

そして、それを移入

JPEGImage := TJPEGImage.Create;
try
  for i := 1 to 3 do 
  begin
    JPEGImage.LoadFromFile(ImagePaths[i]);
    Sprites[i] := TBitmap.Create;
    Sprites[i].Assign(JPEGImage);
  end;
finally
  JPEGImage.Free;
end;

次に、Wave次のように配列に入力します。たとえば、次のようになります。

Wave: array[1..11, 1..5] of TBitmap; 
....
for i := 1 to 11 do
  for j := 1 to 5 do
    Wave[i,j] := Sprites[1];// or whichever sprite you want

もちろん、スプライトは配列よりも実際の名前の方が適している場合があります。


その他のコメント:

  1. JPEG は、ゲーム スプライトの形式としては不適切です。損失のある形式です。GIF や PNG と同様に、プレーンな Windows ビットマップで問題ありません。
  2. 私はむしろ、画像を埋め込みリソースとして見たいと思っています。その後、実行可能ファイルをスタンドアロンにすることができます。
  3. Wavesまた、配列が各侵入者の状態を保持しているのを見たいと思います。そして、その状態をキャンバスにレンダリングする関数を作成します。
于 2013-03-17T20:16:50.497 に答える