gpt4 book ai didi

java改变面板视野

转载 作者:行者123 更新时间:2023-12-01 09:02:12 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com