首页 > 解决方案 > Java Swing 图形口吃

问题描述

我对 Swing 还很陌生,我正在尝试制作一个简单的游戏,在当前阶段,你用 wasd 移动一个盒子,它面向鼠标光标。就这些功能而言,我没有任何问题。不幸的是,我遇到的问题是应用程序在执行很少的操作时会卡顿。

例如,如果我正在移动框,但光标仍然不动,则游戏开始严重卡顿。但是,如果我摆动光标,游戏运行良好。经过一番研究,该问题似乎与 Swing 的Component.repaint(). 但是,在实现了我对此的理解之后,口吃问题并没有改变。

我实现它的方式是让我的抽象基础 GameObject 类扩展 Component,游戏中显示的所有对象都是该类的后代。

在应用程序的主类 Game 类中,run 函数负责更新游戏中的对象。

        long lastTime = System.nanoTime();
        double amountOfTicks = 60.0;
        double ns = 1000000000 / amountOfTicks;
        double delta = 0;
        long timer = System.currentTimeMillis();
        int frames = 0;

        while (running) {
            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;
            while (delta >= 1) {
                tick();
                delta--;
            }
            if (running) {
                render();
            }
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("FPS: " + frames);
                frames = 0;
            }
        }
        stop();
    }

tick()andrender()函数调用处理程序,该处理程序处理所有对象。

    private void tick() {
        handler.tick();
    }

Handler 类,完成了我添加的重绘对象。我在调用对象的刻度和渲染函数后添加了重绘,但都没有任何重大影响。

public class Handler {

    LinkedList<GameObject> objects = new LinkedList<GameObject>();

    public void tick() {
        for (int i = 0; i < objects.size(); i++) {
            GameObject object = objects.get(i);

            object.tick();
            object.repaint();
        }
    }

    public void render(Graphics g) {
        for (int i = 0; i < objects.size(); i++) {
            GameObject object = objects.get(i);

            object.render(g);
            object.repaint();
        }
    }
}

因此,虽然这些更改似乎对我的程序中的口吃没有帮助,但其他一些事情却起到了作用——run 函数中的 print 语句,打印了一个简单的字符串。我无法终生思考这可能会如何影响任何事情,而且这当然不是永久解决方案,因此将不胜感激任何有关这种情况的建议

标签: javaswing

解决方案


推荐阅读