簡単な質問です。 私は基本的にグリッドを横切るEntityクロスを持つプログラムに取り組んでいます。 「ステップ」(つまり、(0、0)から(1、0)になる)を終了するたびに、私はイベントを起動する必要があります。フレーム当たりのエンティティの動きは、次の式で計算されます。エンティティのX座標にエンティティの動きが加算されます。私は、単純に関心の分離のために座標系の生のピクセルの代わりに世界単位(1ワールド単位は16ピクセルです)を使用することを選択しました。世界は、1つの四角形の距離が16ピクセルであることを知る必要はなく、描画システムだけが行います。Xを法とする階(X)はXに等しいか?
基本的に、私はユニットが「ステップ」を終えたことをシステムに伝える方法を工夫しています。明らかに、フレームの動きが計算される方法のために、正確に新しい正方形になることはありませんので、ユニットをその四角形に「クリップ」するか、または一定の距離内にある場合は「真」を返すメソッドを持たなければなりません正方形から(私は今0.05Wuと決めています - 正方形から約0.8ピクセル)。私は、私はちょうどそれが現時点で働いて取得しようとしているとして見てXを使用してい
return Math.floor(x) % x == 0;
:
私がこれまで持っている機能はこれです。しかし、私が持っている問題は、この関数は2つの結果のいずれかを返すように見えるということです:0%0が実際にNaNであるように、これは、予想される
x = 0f;
System.out.println(Math.floor(x) % x);
> NaN
。私はこの問題を回避することができます。しかし、私は現時点で持っている問題は、他の結果..です
x = 1f; // Or any number with 1sd > 0
System.out.println(Math.floor(x) % x);
> 1f
つまり、他の結果は常に、むしろ(、もしmath.floor(x)が正しいモジュロよりも、Xの値を返し、 xは等しい - すなわち、xは1fに等しい)。これは0である必要があります。
私はこれを引き起こしているかどうかは完全にはわかりません。あなたが私のために何か答えがあるか、これをより良い方法で修正する方法についての提案があれば、私はすべて耳にします。
TL; DR:エンティティがある座標から次の座標に移動するときを把握する必要があります。座標(およびそれらを横切るエンティティの遷移)は浮動小数点として格納されます。エンティティが四角形を横断する途中である場合、エンティティのX座標は、例えば1.5として記憶される。最後に、フロアは(1.0)%1.0は1.0を返して、そしてない0
EDIT:
私のコードで私は、この出力で
System.out.println("x equals " + x + ". Math.floor(x)%x==Math.floor(x): "+(Math.floor(x)%x==Math.floor(x)));
EDIT 2: 画像は楽しいです!
白い四角が実体です。赤い四角形は単に描画されたグリッドです。各正方形は16×16です。
ご覧のとおり、白い四角は(6.5、0)です。私は基本的にプログラムが通過する時を認識する必要があります(7、0)。
EDIT:リーと私はチャットを持っていた、ここで私たちのチャットだ: http://chat.stackoverflow.com/rooms/34727/discussion-between-neglected-and-lee-meador
彼は私が正しいと彼の答えを受け入れている私のために問題を解決しました。
float after = pos.x+changeInPosition;
if (Math.floor(after) != Math.floor(pos.x)) {
// We passed a boundary
}
pos.x = after;
のy%のXすることができます決して等しいXを。 0からx-1までの任意の値に等しいことができます。私のコードで –
私はこれを持っています:\t \t System.out.println(Math.floor(x)%x == Math.floor(x)); と評価しています。 ** ** ** ** ** ** ** ** **私はこれが決して同等ではないことを認識しています。 –
私はfalseに評価します。 –