2013-05-03 38 views

回答

-1

FPSAnimator有一個名爲.setFPS()的方法。它在動畫師已經啓動後有效。這裏是你的link

編輯:

當動畫開始,不可能再改變FPS和一些方法,例如this不工作或我的編碼的水平是不夠的,使用它。

所以在這裏,我將給你一個關於如何改變FPS後的小Java例子,第一個啓動動畫師。讓我們假設我們有一個簡單的蛇遊戲與OpenGL(libjogl),你的主要方法是;

public static void main(String[] args) { 

    GLCanvas canvas = new GLCanvas(); 

    Frame frame = new Frame("Snake"); 
    frame.setSize(500, 500); 
    frame.add(canvas); 
    frame.setVisible(true); 

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e){ 
      System.exit(0); 
     } 
    }); 
    Animator animator = new FPSAnimator(canvas, fps); 
    SnakeGameScene scene = new SnakeGameScene(animator); 

    canvas.requestFocus(); 
    canvas.addGLEventListener(scene); 
    canvas.addKeyListener(scene); 
    animator.start(); 
} 

這裏,你有你的框架,帆布的WindowListener,動畫,事情OpenGL的動畫,在這種情況下,SnakeGameScene ......如果我們改變了主類,其中主要的方法是,使動畫FPS多變通過一些觸發器。我將顯示的代碼將通過按鍵進行更改。因此,它在SnakeGameScene的keyPressed @Overrides中。

@Override 
public void keyPressed(KeyEvent k) { 
    int keyCode = k. getKeyCode(); 
    try{ 
     if(this.lockKeyAfterPressed){ 
      switch(keyCode){ 
      case KeyEvent.VK_UP: 
       this.snake.setDirection(Direction.UP); 
       lockKeyAfterPressed =false; 
       break; 
      case KeyEvent.VK_DOWN: 
       this.snake.setDirection(Direction.DOWN); 
       lockKeyAfterPressed =false; 
       break; 
      case KeyEvent.VK_LEFT: 
       this.snake.setDirection(Direction.LEFT); 
       lockKeyAfterPressed =false; 
       break; 
      case KeyEvent.VK_RIGHT: 
       this.snake.setDirection(Direction.RIGHT); 
       lockKeyAfterPressed =false; 
       break; 
      case KeyEvent.VK_Z: // n1 
       Application.increaseFPS(); 
       break; 
      case KeyEvent.VK_X://n2 
       Application.decreaseFPS(); 
       break; 
      } 
     } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

在這一部分中,有關案件是後兩種情況下,n1和n2。當按下相應的按鍵時,可以增加或減少。但正如我上面所說的,我們需要先停下動畫師。所以我們把主要的課改爲下面的課。

public class Application { 

private static int fps = 1; 
private static Animator animator; 
private static GLCanvas canvas; 

public static void setAnimator(Animator animator){Application.animator = animator;} 
public static int getFps() {return fps;} 
public static void setFps(int fps) {Application.fps = fps;} 
public static void increaseFPS(){ 
    animator.stop(); 
    setFps((getFps()+1)); 
    Application.updateAnimator(); 
} 

public static void decreaseFPS(){ 
    animator.stop(); 
    setFps((getFps()-1)); 
    if(getFps() <1){setFps(1);} 
    Application.updateAnimator(); 
} 

private static void updateAnimator(){ 
    Application.setAnimator(new FPSAnimator(canvas, fps)); 
    animator.start(); 
} 

public static void main(String[] args) { 

    canvas = new GLCanvas(); 
    Frame frame = new Frame("Snake"); 
    frame.setSize(500, 500);frame.add(canvas); 
    frame.setVisible(true); 

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e){ 
      System.exit(0); 
     } 
    }); 
    animator = new FPSAnimator(canvas, fps); 
    SnakeGameScene scene = new SnakeGameScene(animator); 
    canvas.requestFocus(); 
    canvas.addGLEventListener(scene); 
    canvas.addKeyListener(scene); 
    animator.start(); 
    } 
} 

在這裏,您不要在主要方法中創建Canvas,animator和Fps,它們必須位於類中。當按下相應的按鍵時,系統將停止動畫製作者,然後用更新的fps創建一個新的動畫製作者並將其設置爲動畫製作者,然後再次啓動動畫製作者實例。

對不起,如果我矯枉過正,添加不相關的代碼,使描述和語法錯誤。 希望它可以幫助你。

+0

如果你會閱讀你的鏈接,你會發現它會在Animator已經啓動的情況下拋出異常。 「拋出: GLException - 如果動畫師已經啓動」 您需要停止動畫師更改FPS並再次開始 – Horonchik 2013-07-26 12:42:04

+0

是的,對於錯過閱讀的道歉,我會編輯我的答案以獲得更好的解決方案。 – rebuked 2013-07-26 16:23:59

+0

這個答案比它需要的更復雜。不要重新初始化動畫製作者,而應該停止設置fps並重新啓動它。 'animator.stop(); animator.setFPS(FPS); animator.start();' – Winder 2017-09-17 21:21:16