一开始,我创建了一个新的 FPSAnimator(drawable,FPS,true); FPSAnimator启动后是否可以加快或减慢(即改变动画的FPS)动画速度?
1 回答
FPSAnimator 有一个名为 .setFPS() 的方法。它在动画师已经启动后工作。这是给你的链接。
编辑:
当 Animator 启动时,无法再次更改 FPS,并且某些方法(例如此方法不起作用)或我的编码水平不足以使用它。
所以在这里我将给你一个小的 Java 例子,告诉你如何在你第一次启动 Animator 后改变 FPS。
假设我们有一个简单的 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();
}
在这里你有你的框架,Canvas WindowListener,Animator,OpenGL 动画,在这种情况下它是 SnakeGameScene ... 我将展示的代码将通过按键来改变它。因此,它在 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();
}
}
在这里,您不要在 main 方法中创建 Canvas、animator 和 Fps,它们必须在 Class 中。当按下相应的键时,系统将停止动画制作器,然后创建一个更新了 fps 的新动画制作器并将其设置为动画制作器,再次启动动画制作器实例。
对不起,如果我矫枉过正,添加不相关的代码,使描述和语法错误。希望它可以帮助你。