2013-04-20 40 views
0

標題是不好的,所以我會解釋:Delphi7的,如何檢查的TImage存在的畫面

嗨,我創建了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; 

我認爲我使用的代碼是可怕的,因爲如果我按下了一個鍵而不是一次,它將重新加載圖像,並且只要我繼續按下相同的鍵,就會繼續這樣做,這樣浪費了內存。我能做些什麼呢? 感謝

+0

這很多東西,但不是浪費內存。 – 2013-04-20 23:53:50

回答

1

一些改良效果:首先加載全部圖像(在應用程序啓動,說):

var 
    bmCarLeft, bmCarRight, bmCarUp, bmCarDown: TBitmap; 

... 

bmCarLeft := TBitmap.Create; 
bmCarLeft.LoadFromFile(dleft); 
... 

,然後你可以做

Image6.Picture.Assign(bmCarSomething) 
每次你需要改變它的時候

1

確實有很多方法可以做到這一點。
經典的方式:
一個圖片與您的項目(車)的所有狀態,並使用Canvas.CopyRect()方法從一個到另一個繪製適當的圖像;
另一種方法:
將所有「精靈」加載到TImageList並使用TImageList.Draw()方法。
依此類推。
主要思想:使用目標圖片的Canvas屬性並在其上繪製你想要的東西。

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; 
+0

實際上,你將無法聲明'ImgFiles'數組,因爲'dtop'等在編譯時是不知道的。無論如何,我認爲OP可能會考慮將這種方法與我的答案結合起來,因爲每次移動精靈時從磁盤加載文件都不是很令人滿意。 – 2013-04-21 11:14:37

+0

謝謝你,你一直很有幫助 – user2296565 2013-04-21 13:18:50

+0

@AndreasRejbrand:在開始處理用戶輸入之前,你可以將'ImgFiles'改成一個非const數組並在程序啓動時填入它。 – 2013-04-21 15:49:45