2009-03-07 9 views
0

저는 제 자신이 게임 프로그래밍을 가르치고있는 쓰레기 팩맨 게임에서 팩맨 캐릭터의 유명한 개폐 애니메이션을 보여 주려고합니다.더블 버퍼링을 사용하여 Java에서 Pacman의 입/닫기 애니메이션을 표시하는 방법은 무엇입니까?

내가하고있는 것은 열린 입 이미지를 그려 넣은 다음 닫힌 입 이미지를 똑같은 (x/y) 위치에 다시 그리는 것입니다. 그러나 이것은 효과가 없으며 닫힌 입 애니메이션을 항상 보았습니다.

이것을 루프에 넣으면 시스템이 정지되고 입이 벌어지는 이미지가 깜박 거리며 이미지가 교체되는 것을 볼 수 없습니다.

필자는 두 이미지가 올바르게 올바르게로드되었는지 테스트했습니다. 당신은 두 이미지 사이에 잠이

public void beginGame() //Called from engine.java 
{ 
    isRunning=true; 
    repaint(); 
    pacman.startAnim(); 
} 

public void startAnim() //In different class, pacman.java 
{ 
    Image orig; 
    while (engine.isRunning) 
    { 
     orig=this.getCurrentImg(); 
     draw(engine.getGraphics()); 
     this.setCurrImg(currImg2); 
     this.draw(engine.getGraphics()); 
     this.setCurrImg(orig); 
     this.draw(engine.getGraphics()); 
     try 
     { 
      Thread.sleep(100); 
     } 
     catch (InterruptedException e) {} 
    } 
} 

public void draw(Graphics g) //Called from engine.paint() 
{ 
    g.drawImage(getCurrentImg(), getX(), 
      getY(), engine); 
} 

답변

3

:

여기의 애플릿에서 때 더블 클릭이라는 내 startAnim() 기능입니다. 그렇지 않으면 마지막으로 그린 ​​그림 만 볼 수 있습니다.

예 : 이 같은

while(running) 
{ 
    image 1 
    draw 
    sleep 
    image 2 
    draw 
    sleep 
} 

뭔가 : sfossen 말했듯이

public void startAnim() //In different class, pacman.java 
{ 
          final int cnt = 2; 
    Image[] imgs = new Image[ cnt ]; 
    int   step = 0; 

    imgs[ 0 ] = closedMouthImage; 
    imgs[ 1 ] = openMouthImage; 

      while (engine.isRunning) 
      { 
       this.setCurrImg(imgs[ step ]); 
        draw(engine.getGraphics()); 
       step = (step + 1) % cnt; 
        try 
        { 
           Thread.sleep(100); 
        } 
        catch (InterruptedException e) {} 
      } 
} 
+0

나는 이미 아무 것도하지 않는거야? thread.sleep를 사용하고 있습니까? –

+0

각 변경 사이에 한 번씩 두 개의 스레드가 필요합니다. 지금 당신은 이미지를 바꾸고, 끌고, 변경하고, 끌고, 자려고합니다. – sfossen

2

, 당신은 이미지를 그리기 사이에 지연이 필요합니다.

몇 가지 다른 사항을 고려해야합니다.

  • 부드러운 애니메이션의 경우 "입으로 열림"및 "입으로 닫힌"이미지 이상이 필요할 수 있습니다. 2 ~ 3 개의 중간 이미지가 필요합니다.
  • 리소스 관리를 쉽게하려면 모든 애니메이션 프레임을 하나의 와이드 이미지로 묶어서 "필름 스트립"처럼 보이게 할 수 있습니다. 그런 다음 프레임을 그리려면 관심있는 프레임에 대해 (x, y) 오프셋을 사용하십시오.
  • 마지막으로 프로그램의 기본 루프를 돌 때마다 모든 프레임을 그릴 경우 Pac-Man은 당신이 그를 움직일 때마다 완전한 충만을하십시오. 메인 루프를 통해 매번 프레임 하나를 그리는 것과 변수를 사용하여 현재 프레임을 추적하는 것에 대해 생각해야합니다.

예 (의사)

frameWidth = 32 
frameIndex = 0 
while(running) { 
    // Draw just the frame of your animation that you want 
    drawImage(pacmanX, pacmanY, filmStrip, frameIndex * frameWidth, 0, frameWidth, frameHeight) 
    frameIndex = (frameIndex + 1) % frameCount 

    // Update position of pacman & ghosts 
    // Update sound effects, score indicators, etc. 
} 
+0

저는 이미 자고 있지만 팩맨은 전혀 업데이트하지 않습니다 ... –