UiKit ダイナミクスの実装を使用した単純なゲームがあります。ゲームには、下の図に示すように、ブロック (赤の部分) がグリッドに沿って配置されています。ブロックは上から落ち、下のグリッドに残ります。
一番下のグリッド行が参照 1 で呼び出されたとします。ブロックがどのグリッド参照にあるかを確認したいのです。CGGeomentry、CGRectContainsPoint([グリッド フレーム]) を使用してこれを行ってから、ブロックに 1 というグリッド番号を割り当てます。上の写真で使用しているように、単一のブロックに対しては正常に機能します。
次に2枚目の写真を見てください。
2 番目のブロックが 1 番目のブロックの上に積み上げられると、グリッド行 2 と 2 番目のブロックとの間のクリアランスに気付くことができます。このクリアランスは、より多くのブロックが積み重ねられると増加します。このクリアランスが原因で、CGRectContainsPoint の計算で、6 を超えるグリッド行に対して間違ったグリッド番号が返されます。
つまり、最初のブロックにはグリッド行 1 を割り当て、2 番目のブロックにはグリッド行 2 を割り当てる必要があります。ブロック フレーム サイズとグリッド フレーム サイズは同じなので、これはブロック 10 またはブロック 100 に当てはまります。このクリアランスにより、いくつかのブロックの後、グリッドの割り当てが間違っているように見えます。つまり、ブロック 6 のグリッド番号が 5 になっています。
UIKit ダイナミクス重力動作を使用してブロックを上から落下させ、衝突動作を使用して衝突を決定しています。弾力性を減らすために、弾性プロパティを 0.0 に設定しました。
私の質問は、グリッド フレーム サイズとブロック フレーム サイズが同じであるのに、なぜこのクリアランスが得られるのかということです。それらは正確に適合するべきではありませんか?どうすればこのクリアランスを取り除くことができますか?
下の図のように、ブロックを積み重ねるとクリアランスが増えていることがわかります。
ありがとうございました