如何将图像加载到2D数组元素中?

时间:2013-03-17 18:48:29

标签: arrays delphi multidimensional-array pascal timage

我正在做我的A-Level Computing项目,我正在制作我自己版本的经典游戏Space Invaders。

要创建空间入侵者的浪潮,我想使用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]?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果您要对图形动画进行编码,您可能不希望直接在表单上进行编码。试图移动东西可能很棘手,特别是如果你想要平滑地制作动画而不是获得大量的闪烁和图形工件。

最好使用渲染库。工作流程如下:

  • 在表单上创建渲染上下文。这是一个控件,可以为运行的图形动画提供表面。
  • 将三张图片加载到内存中。
  • 创建一个对象数组,以表示与怪物关联的游戏数据。 (位置,移动方向和速度等)它可以是平面或2D,无论哪种效果更好。
  • 设置一个如下所示的渲染循环:
    • 对于阵列中的每个怪物,将其绘制在其位置。
    • 画出玩家的船和所有射弹。
    • 检查碰撞并妥善处理。
    • 检查玩家输入并妥善处理。

您可以在Pascal Game Development的论坛中找到有关Delphi渲染库的大量信息。

答案 1 :(得分:2)

您有以下声明:

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

您想知道如何填充图像数组。当3个就足够时,创建55个图像是非常浪费的。所以不要那样,使用间接。存储对图像的引用。 TImage是一个可视组件,因此不适合精灵。

我会将图像保存在这样的数组中:

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是一种糟糕的游戏精灵格式。这是一种有损格式。一个普通的Windows位图就可以了,就像GIF或PNG一样。
  2. 我更愿意将图片视为嵌入资源。那么你的可执行文件可以独立存在。
  3. 我还希望看到你的Waves数组保持每个入侵者的状态。然后你将创建一个将该状态呈现在画布上的函数。