3

我有一个简单的游戏,我正在尝试为学习目的做,但矩阵有点难,尤其是在 DirectX 中。

我目前有一个 tilesystem 可以在屏幕上渲染图块并在中心呈现一个字符位置(在启动时)

当玩家向左移动时,地面应该向右移动,因此他始终位于屏幕中央。我使用 Sprite 来转换 Tiles 和玩家,但由于地面在移动而玩家站在地面上仍然位于中心位置,因此遇到了麻烦。

这是一个自上而下的 2D 游戏,所以我只需要变换位置(也许还有旋转)

我的相机类有这个方法:

D3DXMatrixTransformation2D(&View, NULL, 0, &Scale, &Center, D3DXToRadian(Rotation), &Position);

我也试过(对于相机):

D3DXMatrixTranslation(&View, Position.x, Position.y, 0);

然后当我渲染地面精灵时,我将它设置为转换为相机,但是玩家有它自己的矩阵,我在他移动时使用它。

和上面那个一模一样,但他的位置、轮换等等……

我错过了什么,我需要什么?

我只有一个适合屏幕宽度/高度的图块系统,所以我应该看到他什么时候移动,但他仍然站在中心和地面上,玩家在移动。

我是否需要反转矩阵以使地面向相反方向移动?

只有玩家在这里移动,世界在他周围发生变化。

例子

我必须说,作为游戏编程中排名第一的语言,很少有指南可以解释“2D 中的 TopDown 相机”这样简单的事情......

4

2 回答 2

2

对于您的问题,您应该阅读有关不同空间的信息:对象空间、世界空间和相机空间。(通常与 3D 空间相关,但我将尝试针对 2D 进行解释)

对象空间 每个对象都应该被建模或在你的情况下被绘制在对象空间中。这意味着对于每个对象,它们都是一个矩阵,它决定了您的播放器的中心。

世界空间 这是你的游戏世界。它描述了场景中每个对象的位置和方向。

相机空间 这描述了您的游戏世界中的当前视图。假设相机固定在屏幕中间,您移动整个世界以适应当前视点(例如,使用负位置平移)。

对于您的情况,这意味着您需要为每个对象创建一个矩阵,该矩阵描述了图像在该位置(对象空间)正确居中的偏移量。然后您需要将对象转换为世界空间。因此,您需要一个包含对象位置和方向的矩阵,并将其与对象矩阵相乘。最后,您必须考虑视点并乘以相机矩阵,以便将对象从世界空间转换到视图空间。生成的矩阵是您用于渲染的矩阵。

希望有帮助:)

于 2013-02-03T19:24:19.597 回答
0

在聊天人员的帮助下,我意识到我的系统出了什么问题,尽管我尝试了类似的事情,但可能是以错误的方式/顺序。

对于仅定位的简单 2D TopDown 相机:

Camera2D 翻译:

D3DXMatrixTranslation(&CameraView, Position.x, Position.y, 0);

对于相机视图中的每个对象:

D3DXMATRIX ObjectWorld;
D3DXMatrixTransformation2D(&ObjectWorld, NULL, 0, NULL, NULL, 0, &Position);

D3DXMATRIX Translation;
D3DXMatrixMultiply(&Translation, ObjectWorld, CameraView);

然后渲染精灵:

sprite->SetTransform(&Translation);
sprite->Draw(Texture, NULL, NULL, NULL, Color);

虽然这种方法需要我将相机移动到玩家移动的相反方向,所以如果玩家移动 +100,相机应该移动 -100 以仍然定位在相对于玩家的相同位置。

于 2013-02-04T09:14:40.657 回答