0

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

为了创建空间入侵者的浪潮,我想使用二维图像数组,其中图像从磁盘加载,然后显示在表单上,​​但我不确定如何将图像加载到数组中,然后将数组显示在形式。

当前的数组是:

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

如果您要编写图形动画,您可能不想直接在表单上进行。尝试四处移动可能会很棘手,特别是如果您想要流畅地制作动画并且不会出现大量闪烁和图形伪影。

最好使用渲染库。工作流程是这样的:

  • 在表单上创建渲染上下文。这是一个为图形动画运行提供表面的控件。
  • 将您的三个图像加载到内存中。
  • 创建一个对象数组来表示与怪物相关的游戏数据。(位置、运动方向和速度等)它可以是平面的或 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 个图像是相当浪费的。所以取而代之的是,使用间接。存储对图像的引用。并且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数组保存每个入侵者的状态。然后您将创建一个函数,将该状态呈现到画布上。
于 2013-03-17T20:16:50.497 回答