我目前正在做我的A-Level计算项目,为此我正在制作我自己版本的经典游戏《太空入侵者》。
创建空间入侵者的波,我想使用图像的二维数组,其中的图像是从磁盘加载,然后在表单上显示,但我不确定如何加载图像到数组,然后在表单上显示数组。
当前数组为:
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]?
如果您要编写图形动画,您可能不希望直接在表单上进行。尝试移动物体可能会很棘手,特别是如果你想让动画流畅,而不是得到很多闪烁和图形伪影。
最好使用渲染库。工作流程是这样的:
- 在表单上创建呈现上下文。这是一个控件,它提供了图形动画运行的表面。
- 将你的三张图片加载到内存中
- 创建一个对象数组来表示与怪物相关的游戏数据。(位置,移动方向和速度等)可以是平面的,也可以是2D的,以你的喜好为准。
- 设置一个像这样的渲染循环:
- 对于数组中的每个怪物,在其位置绘制。
- 绘制玩家的飞船和所有的投射物。
检查碰撞并适当处理。 - 检查玩家输入并适当处理。
你可以在Pascal Game Development的论坛中找到大量关于Delphi渲染库的信息。
您有以下声明:
ImagePaths:array [1..3] of string =(
'SpaceInvader1.jpg',
'SpaceInvader2.jpg',
'SpaceInvader3.jpg'
);
Wave: array[1..11, 1..5] of TImage;
您想知道如何填充图像数组。创建55个图像是相当浪费的,而3个就足够了。所以不要那样,用间接的方式。存储对图像的引用。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
当然你的精灵使用一个真实的名字可能比使用一个数组要好。
其他注释:
- JPEG是一种糟糕的游戏精灵格式。这是一种有损格式。一个普通的Windows位图就可以了,GIF或PNG也可以。
- 我更愿意看到图像嵌入资源。然后你的可执行文件可以独立运行。
- 我也宁愿看到你的
Waves
数组持有每个入侵者的状态。然后你会创建一个函数,将状态渲染到画布上。