Java 如何在平台游戏中移动背景?

Java 如何在平台游戏中移动背景?,java,swing,Java,Swing,我正在用JavaSwing制作一个简单的平台游戏。当然,我希望一些平台对于一个屏幕来说太大,我有以下问题:当玩家控制的角色接近屏幕边缘时,什么是使背景移动的最佳方式?事实上不仅仅是背景,而是整个游戏的内容(对手、砖块等)?当然,一定有更好的方法,而不仅仅是在角色移动1像素时上传新图像并重新绘制所有内容。我希望我用一种可以理解的方式来表达这一点,我试着在这个网站和其他网站上查找它,但到目前为止运气不好。Thx提前。这种类型的平台游戏称为a 基本上,您可以创建一个比JPanel更宽或更高的图像。您可

我正在用JavaSwing制作一个简单的平台游戏。当然,我希望一些平台对于一个屏幕来说太大,我有以下问题:当玩家控制的角色接近屏幕边缘时,什么是使背景移动的最佳方式?事实上不仅仅是背景,而是整个游戏的内容(对手、砖块等)?当然,一定有更好的方法,而不仅仅是在角色移动1像素时上传新图像并重新绘制所有内容。我希望我用一种可以理解的方式来表达这一点,我试着在这个网站和其他网站上查找它,但到目前为止运气不好。Thx提前。

这种类型的平台游戏称为a

基本上,您可以创建一个比JPanel更宽或更高的图像。您可以使用Java图像处理裁剪图像片段并在JPanel中显示它

在一个单位的时间之后,您将裁剪不同的图像片段并将其显示在JPanel中。这种情况发生得如此之快,以至于图像似乎正在滚动

您必须为游戏玩家、砖块和游戏中的任何其他对象建模。绘制背景后,必须绘制这些对象


查看第12章。您可能需要先阅读前面的章节,因此第12章是有意义的。如果你想做大量的Java游戏开发,那就买这本书。

我认为上面的答案是一个有效的方法,但是如果你想要另一本的话。可以将图形对象强制转换为Graphics2D对象,然后从原点平移距离。执行此操作时,将转换从图形对象绘制的所有内容

@Override
public void paint(Graphics g){
   super.paint(g);

   Graphics2D g2d = (Graphics2D)g;
   g2d.translate(character.x,character.y);

   background.render(g);
   character.render(g);
}
尽管这确实需要重新绘制可能不需要移动的对象。在处理大型地图时,这可能会成为一个问题。但我总是尝试只渲染屏幕上的对象和一些可能部分显示在屏幕上的对象。youtube上有一个教程介绍了如何实现这一点


您是否使用图像作为背景?您应该覆盖
JPanel
中的
paintComponent
方法,并直接使用
Graphics
类绘制像素。不过,一般的经验法则是,除非你需要,否则不要进行优化-因此,请尝试你认为最好的方式,如果不起作用,我们可以通过一个你尝试过的小例子来帮助你。好吧,那么我在开始时上传整个地图,然后只绘制当前片段,对吗?唯一的问题是,你所说的“在一个单位的时间之后,你裁剪出一幅不同的图像并在JPanel中显示”到底是什么意思?具体来说,什么时间段,或者你的意思是当角色接近屏幕边缘时我会这么做?@MountainThatCodes:假设你希望你的游戏以每秒20帧的速度运行。这意味着您有50毫秒的时间生成帧。时间单位为50毫秒。您必须确定要滚动多少背景,游戏玩家在50毫秒内可以移动多远。@MountainThatCodes:这取决于您的地图有多大。如果它是一个真正的侧边滚动器,你的背景每2000像素重复一次,你可以在开始时加载整个图像。如果你的游戏世界很大,你将不得不使用平铺,并构建一个比你的JPanel稍大的图像。好的,最后一个问题,我如何准确地处理当前屏幕外的非静态内容?例如,假设我有一个从左向右移动的对手,反之亦然,此时玩家看不见的地方。我是否根据他的动作更新他(对手)的位置,检查他是否在画面上,然后决定是否画他?如果他只是部分出现在屏幕上呢?处理这个问题的最佳方法是什么?@MountainThatCodes:一般来说,对象负责自己绘制。您必须跟踪对象的位置,对象绘制方法将游戏坐标转换为JPanel坐标,并确定对象是否位于JPanel中。