我正在使用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
的一小部分。
非常感谢任何帮助,谢谢!
答案 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
内容很弱。
也许你是从列表中绘制这些组件的?只需在触摸组件时重新排序列表?