ジョイント
ジョイントとは、2つのスプライトのコライダー同士を接続し、互いの物理挙動に制限をもうける機能のことです。
Joint はコンストラクタ引数として、 2 つのスプライトを受け取ります。スプライトのうち少なくとも 1 つには、 dynamic コライダーが必要です。
すべてのスプライトには sprite.joints プロパティがあり、接続中のすべてのジョイントを配列として格納しています。
グルージョイント
『ゼルダの伝説:ティアーズ・オブ・ザ・キングダム』の「クラフト」はお好きですか? それなら、グルー(接着)ジョイントが気に入るはずです!
GlueJoint (グルージョイント)とは、 2
つのスプライトを互いにノリ付けするように接着するだけの、最も単純なタイプのジョイントです。スプライトが物理的に触れ合っている必要はなく、ジョイントを削除しない限りは、接着が解けることはありません。
でも、ちょっと待ってください。なぜ sprite.addCollider ではなく、グルージョイントを使うのか? 実は、グルーならではの特徴があるからです。
- 各スプライトは、別々の物理的特性を持つことができます
- 各スプライトは、別々にコリジョンを検出できます
- ジョイントを削除しても、スプライトが削除されることはありません
ジョイントは、 joint.visible を false に設定することで非表示にでき、joint.remove
関数で完全に削除することができます。
このコードサンプルで、棒とボールのスプライトをグルーしたり、グルーを解除したりしてみてください。ボールを真上に投げあげて、棒の先端へグルーさせる、けん玉遊びにも挑戦してみましょう!
ディスタンスジョイント
DistanceJoint
(ディスタンスジョイント)とは、ゴムひものように伸び縮みしつつも、一定の距離(ディスタンス)に収束するジョイントのことです。デフォルトではこのジョイントは、互いのスプライトの中心どうしを接続します。ジョイントの取り付け位置を変更するには、その
offsetA (第 1 引数で指定したスプライト)と offsetB (第 2 引数で指定したスプライト)の、 x, y の値を編集します。
ジョイントの springiness (弾力性)係数を調節して、その伸び縮み加減を変更できます。
0.0 = 鉄の棒(デフォルト)0.2 = ガッチリ硬いバネ0.4 =
硬めのバネ0.6 = 普通のバネ0.8 = トムボーイ(バネのおもちゃ)1.0 = ゴムひも
また、ジョイントの damping (減衰)係数を調整して、振動エネルギーの失われる速さを変更することもできます。
collideConnected を true に設定して、接続されたスプライトが互いに衝突するようにします。
ホイールジョイント
WheelJoint (ホイールジョイント)とは、自動車などの車体を、回転する車輪(ホイール)に接続するジョイントです。ホイールジョイントを使って、運転できる車を作りましょう!
すべてのホイールジョイントには、「モーター」があり、ジョイントの speed をお望みの速度に設定するか、 maxPower を正の値に設定するか、
motorEnabled を true に設定するかのいずれかによって、そのモーターは有効になります。
ホイールジョイントのモーターを無効にすることは、車のギアをニュートラルにするようなもので、ホイールは自由に転がるようになります。ホイールに「ブレーキをかける」には、ジョイントの speed を明示的に 0 に設定しなければなりません。
デフォルトでは、ホイールジョイントは maxPower が 1000 、springiness が 0.1 、
damping が 0.7 、そして取り付け角度である angle が 90 度( 0
で真右、大きくすると時計回りに角度が増える)に設定されています。
このコードサンプルの車を、運転してみてください! 道路の端まで行けるでしょうか? ホイールの位置や、取り付け角度を変えて、車をカスタマイズしてみましょう。
ヒンジジョイント
HingeJoint (ヒンジジョイント)とは、片方または両方のスプライトが、ちょうつがい(ヒンジ)のように、同じ点を軸にして回転できるようにするジョイントです。
ディスタンス同様、回転軸の位置を変更するには、ジョイントの offsetA または offsetB の x, y の値を編集してください。
maxPower が小さく、デフォルトの speed が 0 のヒンジジョイントには、動かそうとする力に逆らう「ブレーキ」がかかります。
このコードサンプルで、マウスをかちかちクリックして、シーソーに小さなボックスを何個も乗せてみましょう。シーソーが傾くまでに、あなたはボックスをいくつ乗せられるでしょうか?
スライダージョイント
SliderJoint (スライダージョイント)とは、 2 つのスプライトに対し、回転させず、同じ軸に沿ってスライドするよう、動きを制限するジョイントです。
ジョイントの range は、接続されたスプライト同士が離れられる最大距離です。ジョイントの angle
を変更すると、スプライトがスライドできる向きが変わります( 0 で真右、大きくすると時計回りに角度が増える)。
デフォルトでは、このジョイントのモーターは有効で、 speed は 0 です。 maxPower
は、このジョイントがスライドにどれだけ抵抗できるかを決定します。
コードサンプルでマウスをクリックし、ばね秤に箱を落としてみてください。ばね秤が限界に達するまでに、あなたは箱をいくつ積み重ねることができるでしょうか? angle を変えることも試してくださいね。
GrabberJoint
GrabberJointを使用して、スプライトを掴んで最大の力で目標位置まで移動させることができます。
この例では、スプライトをクリックしてドラッグしてみましょう。
マウス位置にあるスプライトを取得するためにworld.getSpriteAtを使用していることに注目してください。
スプライトを目標位置に移動させるために、継続的にtargetプロパティを設定します。これは x と y のプロパティを持つどのようなオブジェクトでも可能です。
掴んだスプライトを解放するには、ジョイントを削除します。
デフォルト値 1000 からmaxForceを変更してみましょう。