更改FPSAnimator的每秒帧数
问题描述:
开始时,我创建了一个新的FPSAnimator(drawable,FPS,true); FPSAnimator启动后,可以加速或减速(即更改动画的FPS)动画速度吗?更改FPSAnimator的每秒帧数
答
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创建一个新的动画制作者并将其设置为动画制作者,然后再次启动动画制作者实例。
对不起,如果我矫枉过正,添加不相关的代码,使描述和语法错误。 希望它可以帮助你。
如果你会阅读你的链接,你会发现它会在Animator已经启动的情况下抛出异常。 “抛出: GLException - 如果动画师已经启动” 您需要停止动画师更改FPS并再次开始 – Horonchik 2013-07-26 12:42:04
是的,对于错过阅读的道歉,我会编辑我的答案以获得更好的解决方案。 – rebuked 2013-07-26 16:23:59
这个答案比它需要的更复杂。不要重新初始化动画制作者,而应该停止设置fps并重新启动它。 'animator.stop(); animator.setFPS(FPS); animator.start();' – Winder 2017-09-17 21:21:16