2013-05-03 4 views

ответ

-1

У FPSAnimator есть метод с именем .setFPS(). Он работает после того, как аниматор уже запущен. Вот link для вас.

EDIT:

Когда аниматор начинает не удается снова изменить FPS и некоторые методы, такие как this не работает или мой уровень кодирования не достаточно, чтобы использовать его.

Итак, здесь я дам вам небольшой пример Java о том, как сменить FPS после того, как вы сначала запустите Animator.

Допустим, у нас есть простая игра-змея с 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 ... Если мы изменим основной и класс, где основной метод, чтобы сделать аниматор кадров в секунду переменчивый каким-то триггером. Код, который я покажу, изменит его нажатием клавиш. Таким образом, он находится в ключе SnakeGameScenePressed @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

Если вы прочтете свою ссылку, вы увидите, что она будет генерировать исключение в тех случаях, когда аниматор уже запущен. «Броски: GLException - если аниматор уже запущен» Вам нужно остановить анимацию, чтобы изменить FPS, а затем начать снова – Horonchik

+0

Да, извинения за прочтение этого сообщения, я отредактирую свой ответ для лучшего решения. – rebuked

+0

Этот ответ намного сложнее, чем нужно. Вместо повторной инициализации аниматора просто остановите его, установите fps и перезапустите его. 'Animator.stop(); animator.setFPS (кадров в секунду); animator.start(); ' – Winder

Смежные вопросы