调试SpriteBatch.Draw

时间:2013-12-20 23:13:49

标签: c# xna

问题:当一个if子句放在spriteBatch.Draw语句周围时,它似乎会影响if子句之外的其他spriteBatch.Draw。

这是Draw方法中代码的一部分:

if(OvertakeMouseHover == true)
{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
}
spriteBatch.Draw(Car1, Car1Position, Color.White);
spriteBatch.Draw(Car2, Car2Position, Color.White);

这是代码设置OvertakeMouseHover

if (mouse.X > OvertakeButtonPosition.X && mouse.X < OvertakeButtonPosition.X + OvertakeButton.Width &&
   mouse.Y > OvertakeButtonPosition.Y && mouse.Y < OvertakeButtonPosition.Y + OvertakeButton.Height)
{
   //Overtake button mouseover
   OvertakeMouseHover = true;
}
else
{
   OvertakeMouseHover = false;
}

运行上面的代码时,OvertakeButton按预期显示(即当鼠标悬停在其位置上时)。 Car2按预期显示(始终如此)。但是,Car1而不是一直显示,会在OvertakeButton中显示和消失,就像spriteBatch.Draw(Car1...)在if语句中一样。

以下代码使所有3个精灵始终出现:

//if(OvertakeMouseHover == true)
//{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
//}
spriteBatch.Draw(Car1, Car1Position, Color.White);
spriteBatch.Draw(Car2, Car2Position, Color.White);

我不能为我的生活解决为什么spriteBatch.Draw(Car1..)会受到if语句的影响,但它看起来确实对我而言。欢迎所有想法!

编辑 - 此代码使所有3个精灵显示并随MouseHover消失。好像支架比它应该低一行:

if (OvertakeMouseHover == true)
{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
    spriteBatch.Draw(Car1, Car1Position, Color.White);
}
spriteBatch.Draw(Car2, Car2Position, Color.White);

编辑2.好的,这与我背景前后出现的图像有关。在这种情况下,问题与排序有关。如何强制排序顺序?我认为它只是按照代码的顺序回到了前面,但这似乎不是它。

编辑3.整个绘制方法。目前正在调查各种排序选项的作用。

GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin(SpriteSortMode.Backtofront, BlendState.AlphaBlend);
spriteBatch.Draw(RaceBackground, BackgroundPosition, Color.White);
spriteBatch.Draw(Car1, Car1Position, Color.White);
spriteBatch.Draw(Car2, Car2Position, Color.White); 
if (OvertakeMouseHover == true)
{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
}        

string output = Car1Speed.ToString();

// Find the center of the string
Vector2 FontOrigin = Font1.MeasureString(output) / 2;
// Draw the string
spriteBatch.DrawString(Font1, output, FontPos, Color.LightGreen,
    0, FontOrigin, 1.0f, SpriteEffects.None, 0.5f);
spriteBatch.End();
// TODO: Add your drawing code here

base.Draw(gameTime);

2 个答案:

答案 0 :(得分:0)

您应该使用SpriteBatch.Begin

致电SpriteSortMode.Deferred

延迟保证您的精灵将按照您为其调用Draw方法的顺序绘制。

  

延期

     

在调用End之前不会绘制精灵。 End将应用图形   设备设置并在同一批次中绘制所有精灵   收到了对Draw的订单调用。此模式允许Draw调用两个   或更多SpriteBatch实例,而不会引入冲突   图形设备设置。 SpriteBatch默认为延迟模式。

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritesortmode.aspx

根据文档,BackToFront表示它的工作方式与延迟相同,但它需要考虑深度,但您可能遇到了它的错误。这是not the first time,我会看到这个错误。

答案 1 :(得分:0)

如果您使用SpriteSortMode.BackToFront,则需要指定每个精灵的深度,否则游戏会同时绘制它们,使它们“闪烁”。
您可能需要使用具有SpriteBatch.Draw参数的其他float layerDepth重载,例如this one

public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     float scale,
     SpriteEffects effects,
     float layerDepth
)

或者更好,正如我之前写的 Sam ,使用更容易使用和理解的SpriteSortMode.Deferred