2012-08-17 10 views
0

程序檢測到左右箭頭鍵。如果按下這些鍵中的任何一個,那麼作爲GImage類實例的我的Knight對象會穿過一組字符串(這些字符串是我的Knight對象動畫的目錄路徑。)如何修復動畫(Java)需要幫助=]

我的代碼的問題是,我似乎無法用我想出的java代碼找到適當的流體動畫,當我按下箭頭鍵時,動畫循環快,然後慢下來,但當我擡起箭頭鍵並再次按下時,動畫仍然快速循環然後它會減慢。

每個運動動畫製作具有動畫的4幀。

下面是我使用 庫的引用

任何提示表示讚賞。

import java.awt.event.KeyEvent; 

import acm.graphics.GImage; 

import acm.program.GraphicsProgram; 



public class Castlevania extends GraphicsProgram { 



    public void init(){ 
     setGameBackground(); 
     knight = new Knight("knight anim/knightFaceLeft/knight1.png", 500, 500); 
     add(knight); 
     setSize(APPLICATION_WIDTH, APPLICATION_HEIGHT); 
     addKeyListeners(); 


    } 


    private void setGameBackground() { 
     // TODO Auto-generated method stub 
     gameBackgroundImage = new GImage("link sprites/zelda_background.png"); 
     add(gameBackgroundImage); 
    } 



    public void keyPressed(KeyEvent e){ 

     /* Knight's Movement 
     * 
     */ 
     int knightMovementKey = e.getKeyCode(); 
     if(knightMovementKey == KeyEvent.VK_LEFT) 
     { 

      this.xSpeed = 10; 
      ySpeed = 0; 


      knight.setImage(KnightFaceLeft[knightFrame]); 
      knight.move(-xSpeed, ySpeed); 

      knightFrame ++; 

      if(knightFrame >= KnightFaceLeft.length) 
      { 
       knightFrame = 0; 
      } 


     } 

     else if(knightMovementKey == KeyEvent.VK_RIGHT){ 

      knight.setImage(KnightFaceRight[knightFrame]); 
      knight.move(xSpeed,ySpeed); 
      knightFrame++; 

      this.xSpeed = 10; 
      ySpeed = 0; 

      if(knightFrame>=KnightFaceRight.length){ 

       knightFrame = 0; 
      } 

     } 
     knight.pause(DELAY); 
    } 

    private String[] KnightFaceLeft = {"knight anim/knightFaceLeft/knight1.png","knight anim/knightFaceLeft/knight2.png","knight anim/knightFaceLeft/knight3.png","knight anim/knightFaceLeft/knight4.png"}; //Add in as many images as you want for your animation 
    private String[] KnightFaceRight = {"knight anim/knightFaceRight/knight1.png","knight anim/knightFaceRight/knight2.png","knight anim/knightFaceRight/knight3.png","knight anim/knightFaceRight/knight4.png"}; 
    private GImage gameBackgroundImage; 
    private Knight knight; 
    private final int APPLICATION_WIDTH = 1200; 
    private final int APPLICATION_HEIGHT = 800; 
    private int knightFrame = 0; 
    private int xSpeed ; //the number of pixels to move in x 
    private int ySpeed = 0; //0 so you only move horiontally 
    private double DELAY = 35; 
} 

import acm.graphics.GImage.*; 

public class Knight extends GImage { 

       public Knight(String imageDirectory, double knight_Location_XCoord, double knight_Location_YCoord) { 
        super(imageDirectory,knight_Location_XCoord, knight_Location_YCoord); 
       } 
      } 
+0

我不知道爲什麼這是倒票;引用使用的API的+1;考慮改進可讀性的格式。 – trashgod 2012-08-17 05:06:52

回答

2

您致電pause()阻止event dispatch thread。在此情況下,請使用acm.util.SwingTimer在計時器的ActionListener中調整動畫。

+0

謝謝我會測試一下。謝謝你的提示! – Nicholas 2012-08-17 05:01:49