0

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

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

我希望有人知道解决此问题的方法。我尝试过清理和重建并从设备上卸载,但这并不走运。我的电话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.

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

4

1 回答 1

3

问题是您使用float.Epsilon. 文档中:

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

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


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

在大于零的数字处,精度增量变得更大。将会有一个点,添加float.Epsilon给定值会给你准确地返回那个值。

在不详细说明浮点的工作原理的情况下,我将仅指出 32 位浮点数(当考虑以 10 为基数时)可以存储 6 个(左右)有效数字。


我个人建议实施您自己的订购系统。我一直觉得layerDepthXNA 中的东西有点弱。

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

于 2012-09-25T12:30:04.613 回答