2014-09-29 88 views
1

我有一個關於在Monogame中開發遊戲的相當簡單的問題。 假設我有一個UFO作爲可以四處移動的對象。我的不明飛行物不時在他站立的地方正下方的地面(紫色圓圈)產生一個洞。Monogame中的訂購對象

這樣做後,UFO可以再次自由飛翔。然而,當我想飛過剛剛產卵的洞時,我注意到這個圈子比我的UFO高。它不會飛過這個洞,而只是在它下面剪輯。

有沒有什麼辦法讓UFO對象總是在前景上或者可能產生UFO背後的洞?

,增加了孔的主要遊戲:

Components.Add(new Hole(this, holeTexture, 
        hero.HolePosition)); 

孔對象的繪製功能:

public override void Draw(GameTime gameTime) 
    { 
     SpriteBatch sBatch = 
      (SpriteBatch)Game.Services.GetService(typeof(SpriteBatch)); 
     sBatch.Draw(texture, position, Color.White); 
     base.Draw(gameTime); 
    } 

中的主人公(UFO)的對象,我定義孔的位置的功能:問題的

public Vector2 HolePosition //nodig om gaten te graven (startpos.) 
     { 
      get { return new Vector2(position.X + (WIDTH/2), position.Y + HEIGHT); } 
     } 

圖片: The UFO and the hole The UFO clipping behind the hole

回答

1

如果孔和UFO是DrawableGameComponent對象,那麼他們似乎已經繪製順序內置了:

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.drawablegamecomponent.draworder.aspx

public int DrawOrder { get; set; } 

順序組件時,應繪製。

所以,你的原代碼,會成爲這樣的事情:

Hole MyHole = new Hole(this, holeTexture, hero.HolePosition); 
MyHole.DrawOrder = 1; 
Components.Add(MyHole); 

只是要當你創建你的飛碟,並給它繪製它的黑洞之上的DRAWORDER值肯定你做同樣的(我不確定它應該大於還是小於M​​yHole.DrawOrder;只是嘗試查看哪些作品)。

+1

非常感謝!這是一個非常大的幫助。 – 2014-10-23 16:32:00

1

你需要在黑洞後面繪製不明飛行物。 XNA按照繪製調用時的順序繪製(或者如果已定義,但這是默認值,並且我建議您堅持使用默認值)。 你可能有洞前的不明飛行物,所以不明飛行物是由孔洞。

這是一個很好的修復(在遊戲類):

protected override void Draw(GameTime gameTime) 
{ 
    spriteBatch.Begin(); 
    hole.Draw(); 
    ufo.Draw(); 
    spriteBatch.End(); 
} 
+0

感謝您的提示:D我現在有一個快速解決它。我會再次在base.Draw()後繪製我的英雄。這樣,我會畫兩次英雄,但至少它是頂尖的。目前屏幕上的空洞數量沒有限制,所以我真的不知道如何在沒有base.Draw()的情況下單獨調用每個空洞。 – 2014-09-30 06:52:57

1

爲了增加joppiesaus的答案,如果你畫你的對象,如孔和UFO電話,你也可以給他們一個Z值和像IDrawable這樣的基類/接口。然後,您可以在負責渲染的代碼中存儲這些列表。如果你這樣做,那麼你只需要按Z排序,然後進行繪製。

2

雖然其他答案是正確的,但是您可能僅僅使用不同的SpriteSortMode就會受益。正如joppiesaus所解釋的那樣,默認的SpriteSortMode是「Deferred」,這意味着精靈將按照它們繪製的順序繪製。

在您的情況下,您最希望使用的是SpriteSortMode.BackToFront。

使用此模式,您可以指定每個元素的繪圖層,這很可能會爲您提供您正在查找的功能。

SpriteBatch.Begin(SpriteSortMode.BackToFront, null); 

然後,當圖不要忘記設定值層:

SpriteBatch.Draw(texture, position, null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 0.1f); 

的層值,或層深度值,從0到1(浮動),0是最前層,1是最後一層。

+1

這應該是被接受的答案。它使用框架的內部架構。 – increddibelly 2017-02-15 18:51:58