Вначале я создаю новый FPSAnimator (drawable, FPS, true); Можно ли ускорить или замедлить (т. Е. Изменить FPS анимации) скорость анимации после запуска FPSAnimator?Изменение кадра в секунду FPSAnimator
ответ
У 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 и установит его как аниматор, снова запустит экземпляр аниматора.
Извините, если я переполняю, добавьте нерелевантные коды, сделайте описание и синтаксическую ошибку. Надеюсь, он вам поможет.
Если вы прочтете свою ссылку, вы увидите, что она будет генерировать исключение в тех случаях, когда аниматор уже запущен. «Броски: GLException - если аниматор уже запущен» Вам нужно остановить анимацию, чтобы изменить FPS, а затем начать снова – Horonchik
Да, извинения за прочтение этого сообщения, я отредактирую свой ответ для лучшего решения. – rebuked
Этот ответ намного сложнее, чем нужно. Вместо повторной инициализации аниматора просто остановите его, установите fps и перезапустите его. 'Animator.stop(); animator.setFPS (кадров в секунду); animator.start(); ' – Winder