2013-04-20 1 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

많은 것들이 있지만 RAM 낭비가 아닙니다. –

답변

1

일부 improvment : 먼저 이미지를로드 (응용 프로그램 시작에 말) :

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

실제로'dtop' 등은 컴파일 타임에 알려지지 않았기 때문에'ImgFiles' 배열을 선언 할 수 없습니다. 여하튼, 나는 스프라이트를 움직일 때마다 디스크에서 파일을로드하는 것이 그리 만족스럽지 않기 때문에 OP가이 접근법을 내 대답과 결합하는 것을 고려할 수도 있다고 생각합니다. –

+0

감사합니다. 매우 도움이되었습니다. – user2296565

+0

@AndreasRejbrand : ImgFiles를 const가 아닌 배열로 변경하고 사용자 입력 처리를 시작하기 전에 프로그램 시작시 입력 할 수 있습니다. –