问题:当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);发布于 2013-12-21 07:35:43
您应该使用SpriteSortMode.Deferred调用SpriteBatch.Begin
延迟保证您的sprites将按照您为其调用Draw方法的顺序绘制。
直到调用
,才会绘制延迟精灵。End将应用图形设备设置并在一批中绘制所有精灵,顺序与对绘制的调用相同。此模式允许对SpriteBatch的两个或多个实例进行绘制调用,而不会引入冲突的图形设备设置。SpriteBatch默认为延迟模式。
http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritesortmode.aspx
根据文档,BackToFront表示,它的工作原理与延迟相同,只是它考虑了深度,但您可能会遇到一个bug。这是not the first time,我可能会看到这个bug。
发布于 2013-12-21 08:36:11
如果你使用SpriteSortMode.BackToFront,你需要指定每个精灵的深度,否则游戏会同时绘制它们,使它们“闪烁”。
您可能需要使用具有float layerDepth参数的其他SpriteBatch.Draw重载,如this one
public void Draw (
Texture2D texture,
Vector2 position,
Nullable<Rectangle> sourceRectangle,
Color color,
float rotation,
Vector2 origin,
float scale,
SpriteEffects effects,
float layerDepth
)或者更好的是,就像我之前写的那样,使用更容易使用和理解的SpriteSortMode.Deferred。
https://stackoverflow.com/questions/20713413
复制相似问题