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