Xna 4.0 c#旋转图像集合

本文关键字:图像 集合 旋转 Xna | 更新日期: 2023-09-27 18:18:36

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

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

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

Xna 4.0 c#旋转图像集合

你的问题几乎和我最近遇到的问题一模一样。

我有一组舱室(我的每艘飞船)围绕一个原点旋转,但这导致:

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

我建议你回到RenderTarget方法。要去掉紫色背景,使用:

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

更少的开销和更漂亮的车厢之间没有间隔。

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

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

网上有很多教程,但我给你看一些:

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

还有:我真的不太了解相机。但这是最基本的

你必须找到"质心"也就是barycenter。它是所有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;

试试这个