标题很糟糕所以我会解释:
嗨,我创建了4张图片,其中角色(游戏角色,汽车)看向不同的方向,每次按箭头键(向上看向上看,向下看向下看,左看向左看,向右看看右边),这是代码:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var path,dleft,dright,dtop,dbot:string;
begin
path:=paramstr(0);
dleft:=extractfilepath(path)+'Images\Pacman_Left.bmp';
dright:=extractfilepath(path)+'Images\Pacman_Right.bmp';
dtop:=extractfilepath(path)+'Images\Pacman_Top.bmp';
dbot:=extractfilepath(path)+'Images\Pacman_Bot.bmp';
case Key of
VK_UP:
begin
image6.Picture.LoadFromFile(dtop);
image6.Top := image6.Top - 10;
end;
VK_DOWN:
begin
image6.Picture.LoadFromFile(dbot);
image6.Top := image6.Top + 10;
end;
VK_LEFT:
begin
image6.Picture.LoadFromFile(dleft);
image6.Left := image6.Left - 10;
end;
VK_RIGHT:
begin
image6.Picture.LoadFromFile(dright);
image6.Left := image6.Left + 10;
end;
end;
end;
我认为我使用的代码非常糟糕,因为如果我按下一个键不止一次,它会重新加载图像,只要我按下相同的键就会继续这样做,这样浪费了ram 。我该怎么办? 感谢
答案 0 :(得分:1)
一些改进:首先加载所有图像(例如,在应用程序启动时):
var
bmCarLeft, bmCarRight, bmCarUp, bmCarDown: TBitmap;
...
bmCarLeft := TBitmap.Create;
bmCarLeft.LoadFromFile(dleft);
...
然后你可以做
Image6.Picture.Assign(bmCarSomething)
每次你需要改变它。
答案 1 :(得分:1)
有很多方法可以做到这一点
经典方式:
一张包含物品(汽车)所有状态的图片,并使用Canvas.CopyRect()方法从一个到另一个绘制适当的图像;
另一种方式:
将所有“精灵”加载到TImageList并使用TImageList.Draw()方法
等等。
主要思想:使用目标图片的Canvas属性并在其上绘制您想要的内容。
答案 2 :(得分:1)
从长远来看,改变管理图像的方式是最好的,但在短期内,最简单的解决方案是跟踪当前加载的图像,这样您只能在实际需要时加载新图像,例如:
type
eWhichImage = (imgUp, imgDown, imgLeft, imgRight);
const
ImgFiles: array[eWhichImage] of string = (dtop, dbot, dleft, dright);
procedure TMyForm.ImageNeeded(const Img: eWhichImage);
begin
if image6.Tag <> Ord(Img) then
begin
image6.Picture.LoadFromFile(ImgFiles[Img]);
image6.Tag := Ord(Img);
end;
end;
case Key of
VK_UP:
begin
ImageNeeded(imgUp);
image6.Top := image6.Top - 10;
end;
VK_DOWN:
begin
ImageNeeded(imgDown);
image6.Top := image6.Top + 10;
end;
VK_LEFT:
begin
ImageNeeded(imgLeft);
image6.Left := image6.Left - 10;
end;
VK_RIGHT:
begin
ImageNeeded(imgRight);
image6.Left := image6.Left + 10;
end;
end;