我有2個小精靈,它們在畫在一起時組成正確的圖像在屏幕上。同時繪製它們不是一種選擇。用任意點圍繞縮放和旋轉的小精靈
想象一下這個類:
class MyImage
{
Vector2 drawOffset; // this gets added before the image is drawn
Vector2 sourceRect; // this is where it is on the source texturepage
void Draw(Vector2 position)
{
position = position + drawOffset;
spriteBatch.Draw(sourceTexture, position, sourceRect, Color.White);
}
}
而這種代碼調用到它:
MyImage a = new MyImage(); // assume they get initialised correctly
MyImage b = new MyImage(); // with different drawOffsets and sourceRects
a.Draw(position); // this composes the final
b.Draw(position); // screen image from the 2 source images
現在我想縮放和旋轉添加到Draw()函數,但我有真正的無法正確獲取SpriteBatch.Draw函數的參數。這將是需要縮放,旋轉和原點的版本。我需要最終合成的圖像來正確縮放和旋轉(圍繞某個任意中心),但不能在我的生活中找到如何操作縮放比例,旋轉和原點參數以使兩幅圖像呈現比例縮放和旋轉一致。有沒有人做過這樣的事情?如果有什麼不清楚的話,很樂意根據反饋對問題進行修改。如果圖像可以幫助我可以讓他們張貼在某處...
我看過rotation around point xna 2D但我仍然難住。
乾杯, 查理。
非常感謝下面的答案 - 使用它我已經設法使圖像正確渲染。還有一個問題,那就是我似乎需要使用大量的spritebatch.Begin/End對(每個圖像呈現一個)。我還沒有辦法測量這款設備的性能,而且幀率也不是很高,所以我猜這不是問題。
這裏是我的代碼:
// gr is the graphic object:
// gr.position is the location of the image in the atlas
// gr.DrawOffset is the draw offset so the image is placed correctly in it's virtual box
// gr.pageIndex is the index into the texture/atlas array
// hw,hh are half the width/height of the image (it always rotates around it's centre in fact)
Matrix m = Matrix.CreateTranslation(-hw, -hh, 0) *
Matrix.CreateRotationZ(rotation) * // rotation : parameter
Matrix.CreateScale(scale) * // scale : parameter
Matrix.CreateTranslation(pos.X + hw, pos.Y + hh, 0); // pos : parameter!
spriteBatch.Begin(SpriteSortMode.Deferred, null, null, null, null, null, m);
spriteBatch.Draw(page[gr.pageIndex].texture, gr.DrawOffset, gr.position, color);
spriteBatch.End();
這是否比通過渲染目標渲染目標然後再旋轉紋理更好或更容易? – smelch 2011-05-27 18:40:18
@Smelch,這是我第一次展示,但是後來我想到OP的聲明「同時繪製它們不是一個選項」。這促使我提出這個建議。我知道在我的例子中,我把它們放在一起:),但將上述兩個調用分解爲單獨的精靈批次並將它們分開繪製,只要兩個精靈批次都獲得相同的矩陣就可以了。 – 2011-05-27 18:48:47
很好的答案。雖然在XNA 4.0中默認是'SpriteSortMode.Deferred' - 應該可以使用它。 – 2011-05-28 03:34:09