关于在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); }
}
问题图片:
答案 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;只是尝试两者看看哪些有效。