簡體   English   中英

xna 4.0 c#旋轉圖像集合

[英]xna 4.0 c# rotate a collection of images

我和我的團隊現在正在開發xna游戲。 但是,我們遇到了一個問題。 這是一個開放空間的模擬游戲,玩家可以逐個房間建造自己的飛船(俯視圖)。 每個房間都有一個texture2d,但是由於游戲是自上而下的,因此我們需要能夠“轉向飛船”。

我們在旋轉組成船的Texture2ds集合時遇到問題。 在我們的舊代碼中,我們嘗試將所有房間圍繞中心位置作為橋的位置旋轉。 遇到問題時,我們聯機查看並決定嘗試使用RenderTargets(將整個飛船繪制到RT上,然后在繪制RT圖像時旋轉它)。 我們的問題是RT會繪制一個大的紫色背景,並且由於我們的船並不一定總是完全填充矩形,因此總會有紫色背景在某處露出來。

問題是:圍繞xna中的單個原點旋轉texture2ds集合的最佳方法是什么,就像它們是單個圖像一樣?

創建一個旋轉而不是旋轉所有紋理的相機/創建一個渲染目標。 它基本上查看了精靈,而不是調整其他所有東西。

互聯網上有很多教程,但我將向您展示一些內容:

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

另外:我對相機的了解並不多。 但這是基本的。

您將必須找到“質心”又稱重心。 它是所有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;

嘗試這種方式

您的問題幾乎是逐字逐句地與我直到最近遇到的完全一樣的問題。

我有一個圍繞原點旋轉的隔室(用於每個飛船),但是結果是:

  1. 計算和重新定位每個隔室的大量開銷
  2. 隔室之間的小間隙,可能是由於浮子的不准確性

我建議您回到RenderTarget方法。 要消除紫色背景,請使用:

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

沒有隔間之間的縫隙,開銷要少得多,而且漂亮得多。

祝您和您的團隊一切順利,也許最好的太空飛船游戲就贏了;]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM