1

我和我的团队现在正在 xna 开发一款游戏。然而我们遇到了一个问题。这是一个开放空间模拟游戏,玩家可以在其中一个房间一个房间地建造自己的船只(俯视图)。每个房间都有一个 texture2d,但是由于游戏是自上而下的,我们需要能够“转动船”。

我们在旋转组成飞船的 texture2ds 集合时遇到了问题。在我们的旧代码中,我们试图围绕一个中心原点旋转所有房间作为桥梁的位置。由于我们遇到了这个问题,我们在网上查看并决定尝试使用 RenderTargets(将整艘船绘制到 RT 上,然后我们可以在绘制时旋转 RT 图像)。我们的问题是 RT 绘制了一个大的紫色背景,并且由于我们的船并不总是完美地填充在矩形中,所以总会有一个紫色的背景从某个地方突出来。

问题是:在 xna 中围绕单个原点旋转一组 texture2ds 的最佳方法是什么,就好像它们是单个图像一样?

4

3 回答 3

0

您的问题几乎与我最近遇到的完全相同的问题完全相同。

我有一组隔间(对于我的每艘宇宙飞船)围绕原点旋转,但这导致:

  1. 计算和重新定位每个隔间的开销很大
  2. 隔间之间的小间隙,可能是由于浮子的不准确

我建议您回到 RenderTarget 方法。要摆脱紫色背景,请使用:

GraphicsDevice.SetRenderTarget(render);
GraphicsDevice.Clear(Color.Transparent);

如果没有隔间之间的间隙,开销要少得多,而且要漂亮得多。

祝您和您的团队一切顺利,愿最好的宇宙飞船游戏获胜;]

于 2014-08-19T12:16:42.837 回答
0

创建一个旋转而不是旋转所有纹理的相机/制作一个渲染目标。它基本上是查看精灵,而不是调整其他所有内容。

互联网上有很多教程,但我将向您展示一些内容:

class Camera
{
    public Matrix transform; // The transformed matrix

    public void Update(float rotation)
    {
        // you can add the positions here, x y z. Play around with it.
        // x should be half of the screen width,
        // y the half of the screen height, creating a "orgin" where it's rotating.
        transform = Matrix.CreateTranslation(0, 0, 0) * Matrix.CreateRotationZ(rotation);
    }
}

把它放在你的Draw方法中,它使用相机的视口: sb.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, camera.transform);

另外:我对相机的了解不多。但这是一个基本的。

于 2014-08-18T17:03:14.103 回答
0

您将必须找到“质心”,即质心。它是所有 x 和 y 坐标的平均值。你将有你需要的起源。

这是我前段时间找到的代码,但从未测试过……我猜它也来自stackoverflow。

Point bary = Point.Zero;
foreach (Point p in list)
{
    bary.X += p.X;
    bary.Y += p.Y;
}
bary.X = (bary.X + list.Count / 2) / list.Count;
bary.Y = (bary.Y + list.Count / 2) / list.Count;
return bary;

试试这个方法

于 2014-08-19T10:36:50.770 回答