java - 为什么我的Java代码没有限制这些数字?

标签 java youtube

目前,我的代码产生的滴答声数量有问题。目前,我正在按照视频游戏指南进行操作,用于更新逻辑的滴答声数量要比帧数都高到60时才成倍增长。这是YouTube视频
https://www.youtube.com/watch?v=VE7ezYCTPe4&t=1358s
任何建议将不胜感激。谢谢高级!

package game;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;

import javax.swing.JFrame;

public class game extends Canvas implements Runnable {

private static final long serialVersionUID = 1L;

public static final int WIDTH = 160;
public static final int HEIGHT = WIDTH / 12 * 9;
public static final int SCALE = 3;
public static final String NAME = "Game";

private JFrame frame;

public boolean running = false;

public game() {
    setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

    frame = new JFrame(NAME);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    frame.add(this,BorderLayout.CENTER);
    frame.pack();

    frame.setResizable(false);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

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

}

public synchronized void stop() {
    running = false;

}

public void run() {
    long lastTime = System.nanoTime();
    double nsPerTick = 1000000000 / 60D;

    int ticks = 0;
    int frames = 0;

    long lastTimer = System.currentTimeMillis();
    double delta = 0;

    while (running) {
        long now = System.nanoTime();
        delta += (now - lastTimer) / nsPerTick;
        lastTime = now;
        boolean shouldRender = false;

        while(delta >= 1){
            ticks++;
            tick();
            render();
            delta -= 1;
            shouldRender = true;
        }

        if (shouldRender) {
            frames++;
            render();
            }

        try {
        Thread.sleep(2);
    } catch(InterruptedException e) {
        e.printStackTrace();
    }

        if (System.currentTimeMillis() - lastTimer >= 1000){
            lastTimer += 1000;
            System.out.println(ticks + " ticks, " + frames + " frames");
            frames = 0;
            ticks = 0;
        }
    }


}

public void tick() {
    //updates the logic of the game.

}

public void render() {
    //prints out what the logic says to print out
}

public static void main(String[] args){
    new game().start();
}

}

最佳答案

while(delta >= 1){循环中,您实际上增加了刻度线。给定一个完美的系统,该增量应该约为16666667ns,因此每个增量中您可能有16666667个滴答。我对您的教程很好奇,因为通常您会在系统(例如物理)中而不是在循环中使用增量。滴答应该是一个游戏循环,而增量则用于物理计算等。如果您需要有关Java游戏开发的资源,我强烈建议您查看https://www.lwjgl.org/,更不用说在博客上写很多文章了话题。

关于java - 为什么我的Java代码没有限制这些数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40825623/

相关文章:

java - 从 JSoup 中的 html 中删除 <div> 标签

java - 在 PHP 脚本中包含 Java 类

java - 设计: Best way to solve this?

video - 如何在 GitHub wiki 页面上嵌入 YouTube 视频?

objective-c - 如何获取 Youtube channel 中显示的所有视频缩略图和信息?

java - 向MYSQL表中插入用户记录

java - 将 JFrame 置于其他之上

javascript - 修改正则表达式以允许其他 url

javascript - 在网站上嵌入最新的 YouTube 视频?

youtube - 将YouTube视频划分为不同的超链接?