java改变面板视野

标签 java swing 2d

我正在尝试创建一个简单的 Java 2D 物理游戏,当前遇到的问题是我无法想出一种方法,可以在飞船四处移动时将摄像机置于飞船的中心。

我将船舶模型作为面板中的组件 Universe这是在框架 main 中。当前面板显示 (0, 0) 中的像素。至(1000, 1000)

我想要发生的是,如果船向右移动 10 个像素,那么面板将显示 (10, 0) 中的像素。至(1010, 1000) ,跟随船,但在框架中保持刚性。

或者也许有更好的方法来达到类似的效果。

这是我相信的相关部分:

public class Main extends JFrame {

    public static void main(String[] args) {
        M = new Main(1000, 1000);

    }

    public Main(int width, int height) {
        boardWidth = width;
        boardHeight = height;
        FRAMERATE = 60;
        setSize(boardWidth, boardHeight);
        setTitle("space");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        createUniverse();
        createShip();
        runThreads();
    }

    private void createUniverse() {
        U = new Universe();
        U.setLayout(new BorderLayout());
        add(U, BorderLayout.CENTER);
    }

    private void createShip() {
        U.createShip();
    }

    private void runThreads() {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5);
        long lengthOfFrame = (long) (1000 / FRAMERATE);
        executor.scheduleAtFixedRate(new Input(U.getShip(), FRAMERATE), 0L, lengthOfFrame, TimeUnit.MILLISECONDS);
        executor.scheduleAtFixedRate(new UpdatePhysics(U.getObjects(), FRAMERATE), 0L, lengthOfFrame, TimeUnit.MILLISECONDS);
        executor.scheduleAtFixedRate(new RepaintFrame(this), 0L, lengthOfFrame, TimeUnit.MILLISECONDS);
        this.addKeyListener(new UserInput());
    }
}

那就是 JFrame持有此面板:

public class Universe extends JPanel {

    public Universe() {
        setSize(Main.boardWidth, Main.boardHeight);
        setBackground(Color.BLACK);
        setVisible(true);
    }

    public void createShip() {
        ship = new Ship(new double[]{getWidth() / 2, getHeight() / 2});
        shipM = new ShipModel(ship);
        _objects = new MassiveObject[1];
        _objects[0] = ship;
        add(shipM, BorderLayout.CENTER);
    }
}

ShipModel只是一个由几个多边形表示的 Java 组件。

框架是用Main中的线绘制的。基本上只是调用 Main.repaint()反复。

我认为这就是所有相关的内容。我对链接不好,以前从未发布过。

最佳答案

我的建议是走一条不同的路线,或者至少走一条稍微不同的路线。

您绝对不希望从图片中检索像素并每帧绘制新像素(您将每帧绘制像素,但每次刻度获取像素都会减慢您的速度)

您可以完全加载背景图像(您可能已经从抽象描述中执行了此操作),然后根据按下的按钮移动该背景图像的位置。船总是被渲染在中间。 (背景图像的边缘是这个问题变得棘手的地方——这是一个需要解决的另一个挑战)

还可以选择将背景图像分割成图 block 并相应地移动它们。

我已经完成了上述两项操作,并且由于我希望背景图像非常大,因此只有在我以编程方式将其分割成图 block 、将其存储在内存中并根据位置渲染每个图 block 后,它才会平滑地移动。

就像我说的,如果你想让你的宇宙飞船移动到边缘,边缘就会变得棘手。如果您只是在背景图像后面显示无限的黑色,并且您不介意显示它,那么您可以保持相同的物理效果,并且只有一半的屏幕显示背景图像。

总结一下,只需相应地移动框架/面板内的背景图像即可。

您的问题不是很清楚,并且链接到您的代码在 Stack Overflow 上并不是很好的做法(最好使用反引号将相关代码片段包含在您的帖子中,如下所示:

这是代码,我用反引号将其括起来

如果它很长,它就会滚动。

关于java改变面板视野,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41578437/

相关文章:

java - 拖放 : Trying to understand DropDemo tutorial

java - 我应该使用什么布局来显示聊天记录

java - Applet 不将变量从 init 方法传递到 Paint 方法

java - JTree 节点和 JPanel 之间没有连接

java - 使用 maven 配置 swagger-ui

java - 我的 JMenuBar 未显示

java - 自定义绘制的 JPanel 不会出现在 JFrame 中

python - 按 "column"的字母顺序对python中的列表列表进行排序

algorithm - body 在某个封闭空间中可以移动的所有可能方向

python - 创建一个由 1x3 随机数数组组成的 NxN 数组 (python)