xna 4.0 c#旋转图像集合

时间:2014-08-18 16:08:14

标签: c# xna rotation rendertarget

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

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

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

3 个答案:

答案 0 :(得分:0)

创建一个旋转的相机,而不是旋转所有纹理/创建一个rendertarget。 它基本上可以查看精灵,而不是调整其他所有内容。

互联网上有很多教程,但我会告诉你一些事情:

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);

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

答案 1 :(得分: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;

试试这种方式

答案 2 :(得分:0)

直到最近,你的问题几乎是逐字逐句的。

我有一个围绕原点旋转的隔间(我的每个宇宙飞船)的集合,但结果是:

  1. 计算和重新定位每个隔间的开销很大
  2. 隔间之间的间隙很小,可能是由于浮子的不准确性
  3. 我建议你回到RenderTarget方法。要摆脱紫色背景,请使用:

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

    没有隔间之间的间隙,开销更小,更漂亮。

    对你和你的团队一切都是最好的,可能是最好的宇宙飞船游戏胜利;]