0

我已经坚持了很长时间。

所以我正在使用某人的 AsciiPanel 库。它是一个库,当 AsciiPanel 添加到 JFrame 时,将创建一个带有 Ascii 图形的 80x24 旧式 Windows 命令行(用于 roguelikes 等)。

我正在尝试将 AsciiPanel 添加到 JFrame。

问题是,我认为我没有在任何地方创建 JFrame。我不想在任何奇怪的地方添加它并使代码在以后变得不可读/非常规,所以我决定在这里询问社区。这是代码:

package com.base.engine;


import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import com.base.game.Game;
import asciiPanel.AsciiPanel;


public class Main extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private static AsciiPanel asciiPanel;
    private static Game game;
    public boolean gameRunning = true;

    public Main() {
        initDisplay();
        initGame();
        gameLoop();
    }

    private void initDisplay() {
        asciiPanel = new AsciiPanel();
        add(asciiPanel);
        pack();
    }
    private static void initGame() {
        // TODO Auto-generated method stub
        game = new Game();
    }
    private void gameLoop() {
        while(gameRunning = true) {
            game.getInput();
            game.update();
            game.redraw();
        }   
    }

    void windowClosing(WindowEvent e) {
        gameRunning = false;
    }

    public static void main(String[] args) {
        Main game = new Main();
        game.setDefaultCloseOperation(EXIT_ON_CLOSE);
        game.setVisible(true);
    }
}

我还认为 gameLoop() 可能是搞砸了它,因为我认为在我添加它之前它工作得很好。

感谢您提供任何信息。

4

1 回答 1

3

你是对的,你的游戏循环阻塞了事件调度线程,阻止它处理重绘请求或传入事件。

根据您的需要,您最好使用javax.swing.Timer,SwingWorkerThread.

查看Swing 中的并发以获取更多详细信息

要记住的是,Swing 是单线程框架,这意味着所有 UI 组件的创建和更新都应该在 EDT 的上下文中发生。

同样,任何阻止 EDT 的操作都会阻止它更新 UI(或处理事件)

于 2013-06-28T21:29:41.223 回答