绘制深度适用于WP7仿真器,但不适用于设备

时间:2012-09-25 09:25:36

标签: c# windows-phone-7 xna

我正在使用C#和XNA在WP7设备上制作游戏。我有一个系统,我总是希望用户触摸的对象被带到顶部,所以每次触摸时我都会将float.Epsilon添加到其绘制深度(我设置为0,这样0就是后面和1是正面)。

在模拟器上一切正常,但是当我在设备上运行时,绘制深度似乎是完全随机的。

我希望有人知道解决这个问题的方法。我试过做一个Clean&从设备重建和卸载,但这不是运气。我对spritebatch.Begin的电话是:

spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend);

并绘制我使用

spriteBatch.Draw(Texture, new Rectangle((int)X, (int)Y, (int)Width, (int)Height), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, mDrawDepth);

其中mDrawDepth是绘制深度的浮点值(可能是一个非常小的数字; float.Epsilon的一小部分。

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

问题在于您使用float.Epsilon来自documentation

  

在ARM系统上,Epsilon常量的值太小而无法检测到,因此它等于零。您可以定义另一个等于1.175494351E-38的替代epsilon值。

我希望仿真器没有运行完全准确的ARM仿真 - 这就是它在仿真器而不是设备上正常工作的原因。 (我甚至不确定模拟器实际上是在运行ARM - 它可能是x86。)


应该注意的是,将epsilon添加到事物并期望结果值有意义是非常危险的。 float.Epsilon的值是32位浮点数的精度(在x86上)在零附近

在幅度大于零的数字处,精度增量变大。有一点,将float.Epsilon添加到给定值将为您提供完全该值。

如果不进入detailed description how floating-point works,我只会指出32位浮点数(在基数为10时考虑)可以存储6位(或大数)有效数字。


我个人建议您实施自己的订购系统。我总是发现XNA中的layerDepth内容很弱。

也许你是从列表中绘制这些组件的?只需在触摸组件时重新排序列表?