0

C#とXNAを使用してWP7デバイスでゲームを作成しています。ユーザーがタッチしているオブジェクトを常に一番上に移動させたいシステムがあるので、タッチするたびにfloat.Epsilon描画深度を追加します(0が背面、1が前面になるように設定しています)。 。

エミュレーターではすべて正常に動作しますが、デバイスで実行すると、描画深度は完全にランダムに見えます。

誰かがこれを修正する方法を知っていることを願っています。Clean&Rebuildを実行してデバイスからアンインストールしようとしましたが、それはうまくいきません。私の呼びかけ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);

描画深度のfloat値はどこにありますかmDrawDepth(非常に小さい数である可能性があります。。の小さな倍数ですfloat.Epsilon

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

3

問題はあなたの使い方ですfloat.Epsilonドキュメントから:

ARM システムでは、Epsilon 定数の値が小さすぎて検出できないため、0 に相当します。代わりに、1.175494351E-38 に等しい別のイプシロン値を定義できます。

エミュレーターが ARM の完全に正確なエミュレーションを実行していないことが予想されます。これが、デバイスではなくエミュレーターで正しく動作する理由です。(エミュレーターが実際に ARM を実行しているかどうかさえわかりません。おそらく x86 である可能性があります。)


物事にイプシロンを追加し、結果の値が意味のあるものであると期待することは、非常に危険であることに注意してください。の値は、 0 付近float.Epsilonの 32 ビット浮動小数点数 (x86 上) の精度です。

数値がゼロより大きい場合、精度のデルタは大きくなります。float.Epsilon与えられた値に追加すると、正確にその値が返されるポイントが来ます。

浮動小数点がどのように機能するかについての詳細な説明には立ち入らず、32 ビット浮動小数点数 (基数 10 で考えた場合) は 6 桁 (またはそれくらい) の有効数字を格納できることだけを指摘します。


個人的には、独自の注文システムを実装することをお勧めします。私はいつもlayerDepth、XNA の機能が弱いと感じていました。

おそらく、リストからこれらのコンポーネントを描画していますか? コンポーネントに触れたときにリストを並べ替えるだけですか?

于 2012-09-25T12:30:04.613 に答える