2014-09-29 114 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