首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试SpriteBatch.Draw

调试SpriteBatch.Draw
EN

Stack Overflow用户
提问于 2013-12-21 07:13:49
回答 2查看 126关注 0票数 0

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

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

代码语言:javascript
复制
if(OvertakeMouseHover == true)
{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
}
spriteBatch.Draw(Car1, Car1Position, Color.White);
spriteBatch.Draw(Car2, Car2Position, Color.White);

这是代码设置OvertakeMouseHover

代码语言:javascript
复制
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个精灵始终出现:

代码语言:javascript
复制
//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中出现和消失。就好像括号比它应该的位置低了一行:

代码语言:javascript
复制
if (OvertakeMouseHover == true)
{
    spriteBatch.Draw(OvertakeButton, OvertakeButtonPosition, Color.White);
    spriteBatch.Draw(Car1, Car1Position, Color.White);
}
spriteBatch.Draw(Car2, Car2Position, Color.White);

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

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

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

发布于 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。

票数 0
EN

Stack Overflow用户

发布于 2013-12-21 08:36:11

如果你使用SpriteSortMode.BackToFront,你需要指定每个精灵的深度,否则游戏会同时绘制它们,使它们“闪烁”。

您可能需要使用具有float layerDepth参数的其他SpriteBatch.Draw重载,如this one

代码语言:javascript
复制
public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     float scale,
     SpriteEffects effects,
     float layerDepth
)

或者更好的是,就像我之前写的那样,使用更容易使用和理解的SpriteSortMode.Deferred

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20713413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档