0

UiKit ダイナミクスの実装を使用した単純なゲームがあります。ゲームには、下の図に示すように、ブロック (赤の部分) がグリッドに沿って配置されています。ブロックは上から落ち、下のグリッドに残ります。

ここに画像の説明を入力

一番下のグリッド行が参照 1 で呼び出されたとします。ブロックがどのグリッド参照にあるかを確認したいのです。CGGeomentry、CGRectContainsPoint([グリッド フレーム]) を使用してこれを行ってから、ブロックに 1 というグリッド番号を割り当てます。上の写真で使用しているように、単一のブロックに対しては正常に機能します。

次に2枚目の写真を見てください。

ここに画像の説明を入力

2 番目のブロックが 1 番目のブロックの上に積み上げられると、グリッド行 2 と 2 番目のブロックとの間のクリアランスに気付くことができます。このクリアランスは、より多くのブロックが積み重ねられると増加します。このクリアランスが原因で、CGRectContainsPoint の計算で、6 を超えるグリッド行に対して間違ったグリッド番号が返されます。

つまり、最初のブロックにはグリッド行 1 を割り当て、2 番目のブロックにはグリッド行 2 を割り当てる必要があります。ブロック フレーム サイズとグリッド フレーム サイズは同じなので、これはブロック 10 またはブロック 100 に当てはまります。このクリアランスにより、いくつかのブロックの後、グリッドの割り当てが間違っているように見えます。つまり、ブロック 6 のグリッド番号が 5 になっています。

UIKit ダイナミクス重力動作を使用してブロックを上から落下させ、衝突動作を使用して衝突を決定しています。弾力性を減らすために、弾性プロパティを 0.0 に設定しました。

私の質問は、グリッド フレーム サイズとブロック フレーム サイズが同じであるのに、なぜこのクリアランスが得られるのかということです。それらは正確に適合するべきではありませんか?どうすればこのクリアランスを取り除くことができますか?

下の図のように、ブロックを積み重ねるとクリアランスが増えていることがわかります。 ここに画像の説明を入力

ありがとうございました

4

1 に答える 1

1

物理シミュレーションに UIKit Dynamics を使用しないでください。そのために設計されたものではありません。物理的な感覚を与えるアニメーションを作成するために設計されています。

もし私がこのようなことをしていたら、おそらく UIKit と UIView のアニメーションを使うでしょう。

実際、ブロックの配置に AutoLayout を使用する同様のブログを書いたことがありますが、これは役に立ちますか?

ここで自動レイアウトゲームを見ることができます。

それか SpriteKit を使用しますが、それでも物理演算は使用しません。

ほとんどのゲームでは、物理 (つまり、重力やその他の力の下で作用する物理体) を避けます。マリオ (2D サイド プラットフォーマー) や Flappy Bird などのゲームでさえ、物理演算を使用しません。彼らは非常に正確に計算された動きを使用します。

マリオのジャンプは、実際にはいくつかの異なるアニメーションに分割されており、ユーザーがジャンプのタイミングを合わせたり、着地を釘付けにしたりしやすくなっています。実際、物理演算を使用するだけで、ほとんどの場合、ゲームのプレイが難しくなります。

Angry Birds のようなゲームは、その性質上、鳥の飛行とブロックの落下をシミュレートするために物理演算を必要とするため、明らかに異なります。しかし、物理はユーザーによって操作されません。以前のアクションに基づいて実行されるだけです。

于 2014-08-21T08:03:15.737 に答える