Java 2d游戏用摄像机

Java 2d游戏用摄像机,java,camera,2d,slick2d,Java,Camera,2d,Slick2d,我现在正在制作一个很棒的僵尸游戏,我需要知道一个制作相机的好方法。我正在使用Slick2d库和MarteEngine for java 我对java有点陌生,在深入了解swing之前直接进入了一个库,所以这可能是缺乏图形知识。我在一篇教程中读到,你实际上无法在地图上移动游戏窗口,因此你需要移动地图和对象,使其看起来像相机在移动 如果我是这样做的话,它看起来将是非常资源密集型的。我将不得不在每一个僵尸、幸存者、物体、杀手盒等中循环移动它们的坐标。我已经试过这种方法一次了,但事情并没有以同样的速度发

我现在正在制作一个很棒的僵尸游戏,我需要知道一个制作相机的好方法。我正在使用Slick2d库和MarteEngine for java

我对java有点陌生,在深入了解swing之前直接进入了一个库,所以这可能是缺乏图形知识。我在一篇教程中读到,你实际上无法在地图上移动游戏窗口,因此你需要移动地图和对象,使其看起来像相机在移动

如果我是这样做的话,它看起来将是非常资源密集型的。我将不得不在每一个僵尸、幸存者、物体、杀手盒等中循环移动它们的坐标。我已经试过这种方法一次了,但事情并没有以同样的速度发展。这可能是因为我用不同的更新速度处理它


我在使用graphics.translate时看到了一些东西,但我不太懂。所以任何关于移动相机的建议都会很棒!提前感谢。

您可能正在寻找
图形
类的
翻译(x,y)
方法。此方法可从标准Java Swing/AWT
Graphics
类以及Slick2D版本获得,因此请记住,这不是Slick2D特有的功能

translate所做的是移动将来所有图形操作的原点。这是什么意思?记住,原点通常在(0,0)。因此,在位置(40,50)处绘制点将绘制到屏幕位置(40,50)。但是,
translate()
会移动此参照点,从而影响所有其他绘图操作

例如,执行
translate(50,60)
将使原点在x轴上向右移动50个像素,在y轴上向下移动60个像素(因为在计算机程序员中,较大的y值在屏幕上较低)。然后,在(40,50)处绘制点将实际绘制到(40+50,50+60)或(90,110)处的屏幕。这就是使用
translate()
的强大功能

在完成绘图后,将原点移回(0,0)通常是一个好主意,否则事情可能会搞砸。但是,执行
translate(0,0)
将无法完成此任务,事实上,它完全不起任何作用。这是因为“平移”方法将原点移动到相对点。相反,只要确保对于每个调用
translate(x,y)
,您都有另一个调用
translate(-x,-y)
。这将防止原点失控

如果要使用此方法使摄影机跟随其中一个实体,请务必注意,要使用该实体位置的负数平移原点。例如,要跟随具有位置向量“pos”的玩家:

g.translate(-player.pos.x, -player.pos.y);

// Render everything

g.translate(player.pos.x, player.pos.y);

这是因为当播放器向右移动时,您希望背景向左移动,否则所有内容都将跟随播放器。

您可能正在寻找
Graphics
类的
translate(x,y)
方法。此方法可从标准Java Swing/AWT
Graphics
类以及Slick2D版本获得,因此请记住,这不是Slick2D特有的功能

translate所做的是移动将来所有图形操作的原点。这是什么意思?记住,原点通常在(0,0)。因此,在位置(40,50)处绘制点将绘制到屏幕位置(40,50)。但是,
translate()
会移动此参照点,从而影响所有其他绘图操作

例如,执行
translate(50,60)
将使原点在x轴上向右移动50个像素,在y轴上向下移动60个像素(因为在计算机程序员中,较大的y值在屏幕上较低)。然后,在(40,50)处绘制点将实际绘制到(40+50,50+60)或(90,110)处的屏幕。这就是使用
translate()
的强大功能

在完成绘图后,将原点移回(0,0)通常是一个好主意,否则事情可能会搞砸。但是,执行
translate(0,0)
将无法完成此任务,事实上,它完全不起任何作用。这是因为“平移”方法将原点移动到相对点。相反,只要确保对于每个调用
translate(x,y)
,您都有另一个调用
translate(-x,-y)
。这将防止原点失控

如果要使用此方法使摄影机跟随其中一个实体,请务必注意,要使用该实体位置的负数平移原点。例如,要跟随具有位置向量“pos”的玩家:

g.translate(-player.pos.x, -player.pos.y);

// Render everything

g.translate(player.pos.x, player.pos.y);

这是因为当播放器向右移动时,您希望背景向左移动,否则所有内容都将跟随播放器。

您完全可以移动相机。请参见解释如何移动相机,渲染相对于所述相机的世界,以及有关如何执行此操作以及如何决定在相机移动时在屏幕上绘制什么的一些其他有用提示

虽然完全可以使用
translate(x,y)
,但这并不能解决剪辑问题(如何知道在屏幕上绘制什么),也不是一个包罗万象的问题。另外,仔细想想,平移曲面和移动摄影机之间其实没有太大区别。这都是相对的,只要像素在正确的方向上移动,无论你是“相对于世界移动摄影机”还是“相对于摄影机移动世界”——它们基本上是相同的操作

就Swing而言。Swing是为具有窗口、菜单、按钮、复杂事件系统等的桌面应用程序而设计的。出于一些原因