Xna 4.0 c#旋转图像集合
本文关键字:图像 集合 旋转 Xna | 更新日期: 2023-09-27 18:18:36
我和我的团队现在正在xna开发一款游戏。但是我们遇到了一个问题。这是一款开放空间模拟游戏,玩家可以一个房间一个房间地建造自己的飞船(自上而下的视角)。每个房间都有一个texture2d,但由于游戏是自上而下的,我们需要能够"转动船"。
我们遇到了一个问题,旋转texture2ds的集合,构成船。在我们的旧代码中,我们试图围绕一个中心原点旋转所有的房间,作为桥梁的位置。因为我们在这方面有问题,我们上网看了看,并决定在RenderTargets上尝试一下(将整个船绘制到RT上,然后我们可以在绘制时旋转RT图像)。我们的问题是,RT绘制了一个大的紫色背景,因为我们的船并不总是完美地填充在矩形中,所以总是有一个紫色的背景突出来。
问题是:在xna中围绕单个原点旋转texture2ds集合的最佳方法是什么,就好像它们是单个图像一样?你的问题几乎和我最近遇到的问题一模一样。
我有一组舱室(我的每艘飞船)围绕一个原点旋转,但这导致:
- 计算和重新定位每个隔间的大开销
- 舱室之间的小间隙,可能是由于浮子的不准确
我建议你回到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;
试试这个