在Monogame中订购对象

时间:2014-09-29 23:45:14

标签: c# xna monogame

关于在Monogame中开发游戏我有一个很简单的问题。 假设我有一个不明飞行物作为可以四处移动的物体。我的不明飞行物不时在他站立的地方正下方产生一个洞(紫色圆圈)。

这样做之后,不明飞行物可以再次自由飞行。然而,当我想飞过我刚刚产生的洞时,我注意到圆圈比我的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

4 个答案:

答案 0 :(得分:5)

虽然其他答案都是正确的,但您只需使用其他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 :(得分:1)

你需要在黑洞后画出不明飞行物。 XNA按照绘制调用的顺序绘制(或者如果已定义,但这是默认值,我建议您坚持使用默认值)。 你可能在洞之前有不明飞行物,所以不明飞行物被洞打过来。

这是一个很好的修复(在Game类中):

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

答案 2 :(得分:1)

要添加到joppiesaus的答案,如果你对你的对象(如洞和不明飞行物)进行了Draw调用,你也可以给它们一个Z值和一个像IDrawable这样的基类/接口。然后,您可以在负责呈现的代码中存储这些列表。如果你这样做,那么你只需要按Z排序然后执行绘制。

答案 3 :(得分:0)

如果Hole和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);

确保在创建UFO时给它做同样的操作并给它一个DrawOrder值,将其绘制在黑洞顶部(我不确定它是否应该大于或小于MyHole.DrawOrder;只是尝试两者看看哪些有效。