Delphi 7 - 将TImage分配给TImage数组

时间:2016-04-16 19:09:06

标签: arrays delphi object delphi-7

我正在制作一个自定义战舰游戏,我有一个10x10的物体网格(TImage)。我需要在运行时更改其.picture属性,以便船只出现在视口上。我需要根据给定的坐标更改一个Picture属性,因此我创建了以下数组:

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

我尝试为它们分配一个像这样的TImage对象:

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

应该包含视口上所有TImage对象的链接(存在于Form pre-launch中),所以我可以像这样更改一个SampleTImage.Picture属性:

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

但这会引发访问冲突错误。

  

模块“Project2.exe”中地址0046CF10的访问冲突。阅读   地址00000628。

我已经做了一些预先发布这个问题的研究,但Stackoverflow上的每个人都问过类似的问题是在运行时创建对象,在我的例子中,所有TImage对象都是在运行前创建的,并且需要分配给一个双维数组,所以我可以更方便地更改属性。

如果不可能这样做,我真的希望看到任何可能的最佳解决方案。 :)

如果这个问题已被提出并且已经回答十几次,我感到非常抱歉。这种对象操作的东西我很新。

感谢您的时间! ;)

1 个答案:

答案 0 :(得分:1)

我建议您使用TImageList存储图片,并根据需要使用TImages在屏幕上显示这些图片。
确保图像是透明的。如果您不想在代码中旋转图像,可以在ImageList中复制图像。

如果将对象存储在数组中,请注意该数组以零(或垃圾)开头 这就是你得到错误的原因。

如果您想使用数组,请使用以下内容:

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作为精灵,但对于经典战舰游戏中的战舰等慢速(非?)移动物体,我猜这很好。
请注意,图像不会重叠,您的图像列表中只有正方形的船只 图像列表中的一个图像必须是一个“空”位图,其中只有一个内部带有透明色的矩形。如果里面没有战舰,你可以指定一个矩形。

显然你需要做一些关于电网状态的簿记 你把它记录下来了。

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

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

如果你有gridrect,那么你不需要图像,你可以直接在表格的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}
祝你好运。