我和我的团队现在正在xna开展游戏。但是我们遇到了一个问题。这是一个开放空间的模拟游戏,玩家将能够逐个房间建造自己的船只(俯视图)。每个房间都有一个texture2d,但是由于游戏是自上而下的,我们需要能够“翻船”。
我们遇到了一个问题,即旋转构成船只的texture2ds集合。在我们的旧代码中,我们试图围绕中心原点旋转所有房间作为桥梁的位置。由于我们遇到了这个问题,我们在线查看并决定尝试使用RenderTargets(将整个船划到RT上,然后我们可以在绘制时旋转RT图像)。 我们的问题是RT绘制了一个大的紫色背景,因为我们的船并不总是完全填充矩形,所以总会有一个紫色的背景在某处伸出来。
问题是:在xna中围绕单个原点旋转一组texture2ds的最佳方法是什么,就好像它们是单个图像一样?
答案 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)
直到最近,你的问题几乎是逐字逐句的。
我有一个围绕原点旋转的隔间(我的每个宇宙飞船)的集合,但结果是:
我建议你回到RenderTarget方法。要摆脱紫色背景,请使用:
GraphicsDevice.SetRenderTarget(render);
GraphicsDevice.Clear(Color.Transparent);
没有隔间之间的间隙,开销更小,更漂亮。
对你和你的团队一切都是最好的,可能是最好的宇宙飞船游戏胜利;]