2016-04-16 6 views
-1

私はカスタムの戦艦ゲームを作っています。オブジェクトの10x10グリッド(TImage)があります。船がビューポートに表示されるように、実行時に.Pictureプロパティを変更する必要があります。私は与えられた座標に応じて1つの画像のプロパティを変更する必要があるので、私は次の配列を作成しました:Delphi 7 - TImageをTImageの配列に割り当てる

image: array[1..10,1..10] of TImage; 

をし、私は彼らにこのようなTImageのオブジェクトに割り当てることを試みた:

player1.image[1,1] := player1.bcvrA1; 

なっています(フォーム発射前には存在し)、ビューポート上のすべてのTImageのオブジェクトへのリンクが含まれてするので、私はこのように自分のSampleTImage.Pictureプロパティを変更することができます。

image[x,y].Picture.LoadFromFile(SamleFile); 

をしかし、これは、ACCがスローされますエスエーション違反エラー。

モジュール 'Project2.exe'のアドレス0046CF10のアクセス違反です。 アドレス00000628.

の読む私はこの質問を-投稿前研究のビットを行っているが、同様の質問をStackOverflowの上の誰もが、すべてのTImageのオブジェクトは、事前に作成された私の場合には、実行時にオブジェクトを作成し、 -runtimeであり、二次元配列に割り当てられるようになっているので、プロパティをより便利に変更できます。

このようにすることができない場合、私は本当に可能な最適解を見たいと思います。 :)

この質問に既に質問があり、何十回も返信されてしまった場合は、すみません。私はオブジェクトの操作のもののこの種のかなり新しいです。

ありがとうございました! ;)

+0

それを実装するのは間違った方法です。コントロールを使用してゲームの俳優をペイントしないでください。ペイント方法、ペイントボックスなどを使用してください。 –

+0

右かどうかにかかわらずアプローチ。これは、正確に何が起こっているかを私たちに伝えるための小さなコードです。そして、私はDelphi 7をしばらく使っていませんが、 'image [x、y] .Picture:= 'C:\\ SampleFolder \ SampleFile.jpg';'という行はコンパイルされていないと確信しています。適切な[MCVE](http://stackoverflow.com/help/mcve)を提供してください –

+0

@DalijaPrasnikar申し訳ありませんが、私は自分のスレッドをしていたときに、コードの間違った部分をコピーしました。 –

答えて

1

画像を保存し、必要に応じてTImagesを使用して画像を表示するには、TImageListを使用することをお勧めします。
画像が透明であることを確認してください。コード内で回転させたくない場合は、イメージリスト内のイメージを複製できます。

オブジェクトを配列に格納する場合は、配列がゼロ(またはガベージ)を開始することに注意してください。
そのため、エラーが発生しています。

あなたは、配列を使用したい場合は、このようなものを使用する:で戦艦のようなオブジェクトを移動

procedure TForm1.CreateForm(Sender: TObject); 
begin 
    //Init array here, no action needed, because all object members are zero to start with. 
end; 

procedure TForm1.AddShip(Location: TPoint; ImageIndex: integer); 
var 
    x,y: integer; 
    NewImage: TImage; 
    Bitmap: TBitmap; 
begin 
    x:= Location.x; y:= Location.y; 
    if ImageArray[X, Y] = nil then begin 
    NewImage:= TImage.Create(Self); 
    NewImage.Parent:= Panel1; 
    NewImage.Transparent:= true; 
    NewImage.Left:= x * GridSize; 
    NewImage.Top:= y * GridSize; 
    ImageArray[x,y]:= NewImage; 
    end; 
    if ImageList1.GetBitmap(ImageIndex, Bitmap) then begin 
    ImageArray[x,y].Picture.Assign(Bitmap); 
    end else raise Exception.Create(Format('Cannot find an image with index %d in %s',[ImageIndex,'ImageList1'])); 
end; 

通常、私は、ゲーム内でのスプライトとしてTImagesを使用しないことをお勧めするが、遅いため(非?)私はそれが大丈夫だと思う古典的な戦艦ゲーム。
イメージは重複しないことに注意してください。イメージリストには、船の正方形のタイルがあります。
イメージリスト内のイメージの1つは、内部に透明な色の四角形の「空の」ビットマップでなければなりません。内部に戦艦がない場合、これをrectに割り当てます。

明らかに、グリッドのステータスに関するいくつかの簿記を行う必要があります。
これをレコードに入れます。あなたはgridrectを持っている場合は

TGridRect = record 
    shiptype: TShiptype; 
    orientation: THorizontalOrVertical; 
    shipsection: integer; 
    HiddenFromEnemy: boolean; 
end; 

TGrid = array[0..9,0..9] of TGridRect; 

、その後、あなたが画像を必要としない、あなただけのフォームのOnPaintイベントで直接描画することができます。

procedure TForm1.Paint(Sender: TObject); 
var 
    GridRect: TGridRect; 
    Bitmap: TBitmap; 
    ImageIndex: integer; 
begin 
    for x:= 0 to 9 do begin 
    for y:= 0 to 9 do begin 
     GridRect:= Grid[x,y]; 
     ImageIndex:= Ord(GridRect.ShipType) * NumberOfParts 
        + GridRect.ShipSection * (Ord(GridRect.Orientation)+1); 
     Bitmap:= TBitmap.Create; 
     try 
     ImageList1.GetBitmap(ImageIndex, Bitmap); 
     Panel1.Canvas.Draw(x*GridSize, y*GridSize, Bitmap); 
     finally 
     Bitmap.Free; 
     end; 
    end; {for y} 
    end; {for x} 

幸運。

+0

ありがとう、これはまさにGoogleで見つけられていないものです!今私はそれを浸すことを試み始める:)再びありがとう! –

関連する問題