1x20 グリッド (幅は 20 マス、各ドミノの幅は 2、ドミノは重ならない) 上の 5 つの水平ドミノで構成される単純な Cocos2d ゲームを考えてみましょう。ドミノはグリッド内を水平にスライドできます。それらはグリッドに拘束されているため、垂直位置は一定です。
基本的な移動のロジックは単純です。タップしてドラッグすると、CGRectIntersectsRect
別のドミノがいつヒットするかが決まるまでドミノが移動します。この時点で、ドミノはスナップを所定の位置に移動しただけです。
「高度な」移動のロジックはより複雑です。ここで、ドミノを別のドミノに押し付けると、両方のドミノが余裕がある限り、2 つの連続した電車のように移動するはずです。明らかに、3 つ、4 つなどのドミノをこの方法で動かすことができます。
高度な動きのコードはより複雑ですが、絶望的ではないと思います。いくつかの概念をスケッチしました。
- 「後ろのドミノ」はドミノのユーザーがドラッグしている
- 「フロントドミノ」は、動いているすべてのドミノの前にあり、いつ停止するか、いつグループに別のドミノを追加するかなどを決定します
- "moving domines" は、現在 "train" 内にあるすべてのドミノのグループです。
このアプローチは実行可能だと思います。ただし、コーナーケースが多数発生する可能性が高いため、これが最も簡単なアプローチであるとは確信していません。たとえば、3 つの連続するドミノを所定の位置にスナップするには、スナップ後の重なり、スナップ後のギャップなどを防ぐロジックが必要になる場合があります。
Box2d を使用して、この複雑なロジックの一部を回避するにはどうすればよいですか?
シンプルな物理エンジンは、フロント ドミノ、リア ドミノなどの概念を完全に排除すると思います。したがって、私はこのアプローチを検討しています。