1

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

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

如果我这样做,它似乎会非常耗费资源。我必须遍历每个僵尸、幸存者、对象、hitbox 等来移动它们的坐标。我已经尝试过这种方法一次,但事情并没有真正以同样的速度发展。这可能是由于我以不同的更新速度处理它。

我已经看到了一些关于使用 graphics.translate 的东西,但我并不真正理解它。所以.. 任何让相机移动的建议都很棒!提前致谢。

4

2 回答 2

11

你绝对可以移动相机。请参阅我对这个问题的回答,解释如何移动相机,相对于所述相机渲染世界,以及有关如何执行此操作以及如何决定在相机移动时在屏幕上绘制什么的其他有用提示。

虽然完全可以使用translate(x, y),但仅此一项并不能解决剪辑问题(如何知道在屏幕上绘制什么),而且也不是万能的。此外,当您考虑它时,平移表面和移动相机之间实际上并没有太大区别。这都是相对的,只要像素朝着正确的方向移动,你是“相对于世界移动相机”还是“相对于相机移动世界”并不重要——它们是基本相同的操作。

就 Swing 而言,很高兴您没有从那里开始。Swing 专为具有窗口、菜单、按钮、复杂事件系统等的桌面应用程序而设计。出于多种原因,Swing 对游戏来说很糟糕,其中最重要的是渲染管道在 Swing 中的工作方式;这对于桌面应用程序来说很好,但对于需要实时和图形密集型的游戏和大多数类型的渲染来说却是一个绝望的深渊。这一切都很好,因为 Swing 并不是为解决游戏开发者的问题而构建的。

于 2012-05-12T12:06:46.577 回答
2

您可能正在寻找,是translate(x, y)的,类的方法Graphics。该方法在标准 Java Swing/AWTGraphics类和 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 方法将原点移动到相对点。相反,只需确保每次通话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);

这是因为当玩家向右移动时,您希望背景向左移动,否则您将让所有东西都跟随玩家。

于 2012-05-12T04:55:27.283 回答