java - 如何让我的游戏变慢(降低 FPS)?

标签 java timer

所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。

我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗?

所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。

我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗?

public class Gamepanel extends JPanel implements Runnable, KeyListener {


    private static final long serialVersionUID = 1L;

    public static final int WIDTH = 500, HEIGHT = 500;

    private Thread thread;

    private boolean running;

    private boolean right = false, left = false, up = false, down= false;

    private BodyPart b;
    private ArrayList<BodyPart> snake;

    private Apple apple;
    private ArrayList<Apple> apples;

    private Random r;

    private int xCoor = 10, yCoor = 10, size = 1;
    private int ticks = 0;


    public Gamepanel(){
        setFocusable(true);

        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        addKeyListener(this);

        snake = new ArrayList<BodyPart>();
        apples = new ArrayList<Apple>();

        r = new Random();

        start();

    }

    public void start () {
        running = true;
        thread = new Thread(this);
        thread.start();

    }


    public void stop() {
        running = false;
        try {
            thread.join();
        } catch(InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public void tick() {


        if(snake.size()==0) {
            b= new BodyPart(xCoor, yCoor, 10);
            snake.add(b);
        }
        ticks++;
        if(ticks > 250000) {

            if(right) xCoor++;
            if(left) xCoor--;
            if(up) yCoor--;
            if(down) yCoor++;

            ticks = 0;

            b = new BodyPart(xCoor, yCoor, 10);
            snake.add(b);

            if(snake.size() > size) {
                snake.remove(0);
            }
        }
        if(apples.size()==0) {
            int xCoor = r.nextInt(49);
            int yCoor = r.nextInt(49);

            apple = new Apple(xCoor,yCoor,10);
            apples.add(apple);
        }
        for(int i = 0; i < apples.size(); i++) {
            if(xCoor == apples.get(i).getxCoor() && yCoor == apples.get(i).getyCoor()) {
                size++;
                apples.remove(i);
                i++;

            }
        }

        //COLLISION ON SNAKE BODY
        for (int i = 0; i < snake.size(); i++) {
            if(xCoor == snake.get(i).getxCoor() && yCoor == snake.get(i).getyCoor()) {
                if(i != snake.size() - 1) {
                    System.out.print("Game Over");
                    stop();
                }

        }

        //COLLISION ON BORDER
        if(xCoor < 0 || xCoor > 49 || yCoor < 0 || yCoor > 49) {
            System.out.print("Game Over" + '\n');
            System.out.println("Your Score is: " + snake.size());
            stop();
        }
        }
    }
    public void paint(Graphics g) {
        g.clearRect(0, 0, WIDTH, HEIGHT);

        g.setColor(Color.BLACK);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        for (int i=0; i< WIDTH/10; i++) {
            g.drawLine(i * 10, 0, i * 10, HEIGHT);
        }
        for (int i=0; i< HEIGHT/10; i++) {
            g.drawLine(0, i * 10, HEIGHT, i * 10);
        }
        for (int i = 0; i< snake.size(); i++) {
            snake.get(i).draw(g);

        }
        for (int i = 0; i< apples.size(); i++) {
            apples.get(i).draw(g);
        }

    }

    @Override
    public void run() {

        while(running) {

            tick();
            repaint();

        }

    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }


    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if(key == KeyEvent.VK_D && !left) {
            right = true;
            up = false;
            down=false;

        }
        if(key == KeyEvent.VK_A && !right) {
            left = true;
            up = false;
            down = false;

        }
        if(key == KeyEvent.VK_W && !down) {
            up=true;
            left=false;
            right=false;

        }
        if(key == KeyEvent.VK_S && !up) {
            down=true;
            left=false;
            right=false;

        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }


}

最佳答案

您的代码的问题是,现在,游戏速度在不同的机器上不会相同,因为有些计算机可能会更快地执行您的代码,而有些计算机可能会执行得更慢。

如果您希望游戏在每台计算机上以相同的速度执行,您需要为您的蛇定义某种速度(每秒单位),然后在游戏循环中根据上一帧耗时更新您的蛇位置(最后一次调用tick方法)

// snake speed
double speed = 1.0; // units per second

// in game loop (your tick method)
position = speed * deltaTime;

现在你的位置不再取决于游戏帧率。在较快的设备上,游戏会更频繁地更新蛇的位置,但 deltaTime 以及 position 的变化都会更小,另一方面,在较慢的设备上,tick 方法的调用频率会降低但deltaTime会更高

关于java - 如何让我的游戏变慢(降低 FPS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56859741/

相关文章:

java - 在 TextField 中选择一个词

java - Android 来电通知 - 单击时停止计时器

c# - .Net (C#) Enum 重写为 java

Java : implementing a template interface several time (with different class parameter)

java - Hibernate IN/ANY 与 Criteria 中的自定义转换器

Android - 使用 Timer 和 TimerTask 控制任务?

javascript - Nodejs 中 setInterval 的问题

Android TimerTask 不总是被调用(主要是在手机没有被调试时不被调用)

javascript - 如何在点击时启动计时器?

java - 使用 functional-java 将闭包添加到 Java 生产项目有多安全?