问题:当一个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);
答案 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
。