[英]C# & XNA - 2D Engine - Group Sprites From Car
我正在開始使用XNA,我想構建一個基於2D Tile的基本引擎。
到目前為止,我已經准備好進行一些汽車轉向數學和操作,但是還沒有碰撞。
現在,我決定使汽車具有可破壞性,因此當我撞牆時,汽車的區域將會被撞。
賽車的中心部分保持不變,但是當另一輛賽車從左側撞到玩家賽車時,我想用左側的“碰撞”圖像替換左側的“正常”圖像。
我的問題是,我什至現在都不知道如何對汽車的所有零件進行分組(還將添加前燈和后燈),所以當我開車時,所有零件都在跟隨。
到目前為止,我有一個簡單的Car和CarParts類,如下所示:
public Car() {
Vector2D Position;
float Rotation;
Vector2D Direction;
Texture2D BaseTexture;
List<CarParts> Parts;
}
public CarParts() {
Vector2D RelativePosition;
Texture2D Testure;
}
哪里:
List[0] = FrontPart;
List[1] = FrontLeftPart;
List[2] = FrontRightPart;
List[3] = LeftPart;
List[4] = RightPart;
List[5] = RearLeftPart;
List[6] = RearRightPart;
List[7] = ReartPart;
我該如何使這些CHILDS隨主車一起移動?
°編輯:還是有其他方法可以做到這一點?
感謝你的幫助 !
如果您使用的是SpriteBatch
,那么處理此問題的方法是仔細將origin參數設置為Draw
方法( MSDN )。 在這個答案中,我說“ sprite”是指對Draw
的一個調用-因此您的汽車將由多個sprite組成。
origin參數設置精靈發生位置,縮放和旋轉的原點。 您可以將原點設置為精靈邊界之外的位置。
原點位置被解釋為相對於Sprite源矩形的左上角。 (如果未指定源矩形,則假定覆蓋整個紋理的源矩形)。 以與源紋理中的像素匹配的單位指定原點。
因此-您應該維護構成汽車不同部分的9個紋理(如果使用Sprite Sheet,則為9個源矩形)的列表。 並且,對於每個零件,還存儲原點位置。
您為每個子畫面設置的原點將是(centre of car) - (top left of sprite)
。
因此,對於汽車中的中心精靈,它將大約位於矩形的中心。 對於汽車的左上角,其在兩個軸上均為正,但超出子畫面的邊界。 對於右下角,原點在兩個軸上都為負,因此在精靈邊界之外。 對於其他部分,依此類推。
然后,只需繪制所有9個精靈,讓你的車,每一個具有不同的源矩形/紋理和來源。 但是每個人的位置,比例和旋轉都相同。
無需弄亂矩陣或其他任何東西:)
當您移動汽車時,僅更新汽車的位置。 零件的偏移量應保持不變。 繪制精靈時,可以將汽車的位置與零件的相對位置結合起來。 例如:
var partPosition = List[0].RelativePosition;
var position = Position + partPosition;
然后,您可以使用矩形將其繪制到位
var rectangle = new Rectangle(position.X, position.Y, partWidth, partHeight);
要應用任何旋轉,您將需要一個旋轉矩陣以應用於位置/矩形。 XNA在Matrix類上具有Helper方法來幫助您解決此問題(請參見http://msdn.microsoft.com/zh-cn/library/microsoft.xna.framework.matrix_members.aspx )。
如果您不熟悉矩陣和向量數學,我建議您先嘗試一下。
您可以使用描述您汽車位置和方向的矩陣。 您可以將其應用於spritebatch,並僅使用局部坐標(RelativePosition)進行繪制。
否則,您將在矩陣中描述每個零件的變換並將其與汽車的矩陣進行多重播放。 然后,您可以將每個零件的方向和位置與變換矩陣相乘,以將其轉換為屏幕位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.