在2D游戏中实现相机/视口


20

将相机/视口实现到2D游戏的最实用方法是什么?

我读过,应该存储对象的世界位置而不是相对于屏幕的位置?

现在的情况:

我实现了一个简单的2D游戏,从XML文件加载对象和关卡。当前,级别XML文件如下所示:

<map>
   <tile obj="ground" x="0" y="555" />
   <tile obj="ground" x="16" y="555" />
   <tile obj="ground" x="32" y="555" />
   ...
</map>

所有对象都有一个二维矢量“位置”,将其当前位置存储在屏幕上。

我想要的是:

视口/游戏世界插图

图片中:

  • 相机为800x600或640x480
  • 块和精灵为16x16像素。
  • 世界大小可能有所不同
  • 坐标可能应该相对于世界而不是相对于屏幕进行标准化?
  • 视口相对于播放器x,y的位置,并在播放器到达相机死区时移动(类似于此视频)。

我问的是伪示例/文章,但是如果您需要了解我在开发中使用的东西:SDL和C / C ++。


1
在这里的评论中添加您的第三个链接,我可以将其添加到您的问题中。
MichaelHouse

这是我对摄影机死区的意思:youtube.com/watch?
v=89TRXUm8jMI


您好@Arthur Wulf White,想详细点说吗?谢谢。
bluekirai 2012年

您提到的相机是普通2d相机的特定版本,仅用于偏移视图(不旋转和缩放)。跟踪行为可以通过检查玩家角色和摄像机之间的距离来实现,如果距离太大,则移动摄像机。
wolfdawn 2012年

Answers:


19

您需要使每个对象都相对于世界而不是屏幕。您的相机还应该具有自己的世界坐标,以便可以在世界上的相对位置进行绘制。使摄像机跟随对象也很方便,因此无论对象在哪里,摄像机都只会使用其坐标。通常,摄像机的坐标将从左上角开始定位。这意味着相机在图片中的世界位置约为(0,24)。

至于实际绘制相机可以“看到”的对象,必须绘制相对于相机世界坐标的所有对象。要计算对象相对于摄像机的屏幕位置,只需执行以下操作:

int screenX, screenY; //screen position of the object being drawn

screenX = object.x-camera.x;
screenY = object.y-camera.y;

显然,某些对象实际上是相机不可见的,因此您可能需要实现视图剔除系统。


2

最好使用World和View矩阵在GPU中完成所有这些操作,而不是修改在CPU上绘制对象的位置。

这样,您可以任意更改相机(甚至可以放大和缩小!),它会神奇地工作。您仍然可以进行视图剔除,以节省绘制时间。正确设置视图和世界矩阵后,无需更改任何用于绘制世界的代码。

在SDL中,您可以仅内联OpenGL调用,例如glOrthoglTranslate

看到这个线程


有人可以解释一下反对意见吗?这很有道理。
世界

1
我没有拒绝投票,但我认为这是因为这甚至无法回答问题。问题在于如何计算某些东西,而不是在GPU与CPU上进行计算是否更高效或更容易。OP甚至说他正在寻找伪示例。毫无疑问,结合使用相机/世界/模型矩阵会更有效,因此mklingen至少有一点意义。
丹·沃特金斯

这个答案一点也不差!它更特定于OpenGL / DX开发,但是它是正确的方法,因为您可以仅基于摄影机坐标计算平移矩阵并通过cam矩阵移动对象,而无需更改其实际位置。
nenchev 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.