我正在制作一个很棒的(在我看来)僵尸游戏,我需要知道制作相机的好方法。我正在使用Slick2d库和MarteEngine for java。
我对java很陌生,直到真正深入了解之前才直接进入一个库,所以这可能是缺乏图形知识。我读了一个教程,你不能在地图上实际移动游戏的窗口,所以你需要移动地图和物体,使它看起来像是相机在移动。
如果我这样做,似乎会非常耗费资源。我将不得不遍历每个僵尸,幸存者,物体,hitbox等移动他们的坐标。我已经尝试了一次这种方法,事情并没有真正以同样的速度移动。这可能是由于我以不同的更新速度处理它。
我已经看过使用graphics.translate的一些事情,但我真的不明白。那么......任何有关移动相机的建议都会很棒!提前谢谢。
答案 0 :(得分:11)
你绝对可以移动相机。请参阅my answer to this question解释如何移动相机,渲染相对于所述相机的世界,以及一些其他有用的提示,了解如何执行此操作以及如何决定在屏幕上绘制 作为相机移动。
虽然完全有可能使用translate(x, y)
,但仅凭这一点并不能解决裁剪问题(如何知道在屏幕上绘制什么),并且它并不是一切。此外,当你考虑它时,翻译表面和移动相机之间真的没什么区别。这一切都是相对的,只要像素向正确的方向移动,如果你“相对于世界移动相机”或“相对于相机移动世界”并不重要 - 它们是基本上是相同的操作。
就Swing而言,be glad you didn't start there。 Swing专为具有窗口,菜单,按钮,复杂事件系统等的桌面应用程序而设计。出于多种原因,Swing对于游戏来说是可怕的,其中最重要的是渲染管道在Swing中的工作方式;这对于桌面应用程序来说很好,但对于游戏和大多数需要实时和图形密集的渲染类型而言,它们变得绝望。这一切都没关系,因为Swing并不是为解决游戏开发者的问题而构建的。
答案 1 :(得分:2)
您可能正在寻找translate(x, y)
类的Graphics
方法。此方法可从标准Java Swing / AWT Graphics
类以及Slick2D版本获得,因此请记住,这不是特定于Slick2D的功能。
翻译的作用是移动所有未来绘图操作的原点。这是什么意思?好吧,请记住原点通常是(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方法将原点移动到 relative 点。相反,只需确保每次通话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);
这是因为当玩家向右移动时你想让背景向左移动,否则你将拥有玩家跟随的一切。