首页 > 解决方案 > 带有可编辑框架帽的 Java 游戏循环

问题描述

我正在尝试在 java 中创建一个游戏循环,它有一个可以在游戏运行时设置的帧上限。我遇到的问题是我有一个 render() 函数和一个 update() 函数。只为 render() 和 update() 设置帧上限意味着当您更改帧上限时游戏逻辑的速度将会改变。知道如何在不影响游戏逻辑速度(更新())的情况下在游戏中设置帧上限吗?

标签: javaswingwhile-loopgame-loop

解决方案


如评论中所述:您可以创建两个线程,其中一个负责更新,另一个负责渲染。

尝试考虑适合您的需求和游戏的架构。您可以尝试以下方法:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Runner extends JPanel {

    private static final long serialVersionUID = -5029528072437981456L;

    private JFrame window;
    
    private Renderer renderer;

    public Runner() {
        setPreferredSize(new Dimension(WindowData.WIDTH, WindowData.HEIGHT));
        setFocusable(true);
        requestFocus();
        
        window = new JFrame(WindowData.TITLE);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(this);
        window.setResizable(false);
        window.pack();
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        
        renderer = new Renderer(getGraphics());
        renderer.start();
    }
    
    public static void main(String[] args) {
        new Runner();
    }
}

import java.awt.Graphics;

public class Renderer implements Runnable {
    
    private Graphics context;

    private Thread thread;
    private boolean running;

    public Renderer(Graphics context) {
        this.context = context;

        thread = new Thread(this, "Renderer");
        running = false;
    }

    public void start() {
        if (running)
            return;
        running = true;
        thread.start();
    }

    public void render() {
        context.clearRect(0, 0, WindowData.WIDTH, WindowData.HEIGHT);
        context.fillRect(50, 50, 100, 100);
    }

    public void run() {
        while (running) {
            render();

            // ** DO YOUR TIME CONTROL HERE ** \\
        }
    }
}

这段代码实际上会导致严重的性能问题,因为您无法控制渲染 ( repaint()) 时间。

但这只是一个演示,向您展示如何使用不同的线程。做你自己的架构。


推荐阅读