更改FPSAnimator的每秒帧数

时间:2013-05-03 14:49:27

标签: jogl

一开始,我创建了一个新的FPSAnimator(drawable,FPS,true); FPSAnimator开始后,是否有可能加快或减慢(即改变动画的FPS)动画速度?

1 个答案:

答案 0 :(得分:-1)

FPSAnimator有一个名为.setFPS()的方法。它在动画师已经启动后起作用。以下是您的link

编辑:

当Animator启动时,无法再次更改FPS,某些方法(如this)无效或我的编码级别不足以使用它。

所以在这里,我将给你一个关于如何在第一次启动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 ...如果我们改变主方法和主方法所在的类,通过一些触发器使animator 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();
    }
}

这里,你不在main方法中创建Canvas,animator和Fps,它们必须在Class中。当按下相应的键时,系统将停止动画制作者,然后创建一个具有更新的fps的新动画师并将其设置为动画师,再次启动动画制作者实例。

很抱歉,如果我过度使用,添加不相关的代码,说明和语法错误。 希望它可以帮到你。