我正在制作一个自定义战舰游戏,我有一个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对象都是在运行前创建的,并且需要分配给一个双维数组,所以我可以更方便地更改属性。
如果不可能这样做,我真的希望看到任何可能的最佳解决方案。 :)
如果这个问题已被提出并且已经回答十几次,我感到非常抱歉。这种对象操作的东西我很新。
感谢您的时间! ;)
答案 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}
祝你好运。