1

SKSpriteKit を使って釣りゲームを作っています。フック用といくつかの魚用のスプライト ノードがあります (このために SKSpriteNode クラスを拡張しました)。理想的には、魚がフックに引っ掛かったときの動作は、魚の口がフックの先端に移動することです (アクションを使用してこれを行います) :

CGPoint hp = CGPointMake(self.hook.frame.size.width/2, 0);    
CGPoint hookPoint = [self.scene convertPoint:hp fromNode:self.hook];    
SKAction *moveAction = [SKAction moveTo:hookPoint duration:.1];

次に、魚が少し下に回転して、フックにぶら下がっていることをシミュレートします (別のアクション:)

SKAction * flip = [SKAction  rotateToAngle:M_PI_4 duration:.1 ];

これらをそのまま実行すると思います:

[fish runAction:[SKAction sequence:@[moveAction, flip]]];

これは多かれ少なかれ機能します(魚の方向に基づいてねじれを解決します)

後でやりたいことは、魚と釣り針の間にジョイントを作成することです。釣り針を動かしたときに、すでに魚が釣られていれば、魚は付いてきます。

私はこれをします :

SKPhysicsJointFixed *joint =
            [SKPhysicsJointFixed jointWithBodyA:self.hook.physicsBody
                                          bodyB:fish.physicsBody
                                         anchor:hookPoint];

SKAction *createJoint = [SKAction runBlock:^{
    [self.physicsWorld addJoint:joint];}];

[self.scene runAction:createJoint];

ジョイントなしでコードを実行すると、魚はフックにとどまり回転します。ただし、ジョイントが作成されてアクションが実行されると、上からの回転アクションは呼び出されません (ただし、フックへの移動は呼び出されます)。

なぜこれが起こるのか、私には少しもわかりません。誰にも指針がありますか?

4

1 に答える 1

2

私は参考のためにここでそれを言います:

物理ボディを持つノードで移動または回転アクションを使用すると、予期しない動作が発生する可能性が非常に高くなります。

SKActions は物理動作によって無効にされます。アクションが最初に評価され、次に物理世界がシミュレートされます。

ノードを物理ボディに従って動作させたい場合は、力やインパルスを適用するか、ボディの速度を直接変更して、ボディを動かしたり回転させたりする必要があります。アクションによって物理体を移動または回転させることはできません。アクションは、ボディがノードに影響を与えるのと同じようにノードに影響を与えますが、両方が同時にノードに影響を与えることは明らかに望ましくありません - どちらかが優先されなければなりません。

物理ボディの速度が常にゼロであり、物理ボディが衝突フィードバックを経験しないようにすることができます。次に、アクションでそれを移動できますが、いくつかの奇妙なシナリオ (つまり、物理ボディを一時的に非アクティブ化して、ボディをスポーン位置などに戻す) を除いて、おそらくあまり役​​に立ちません。

于 2013-11-13T19:02:52.053 に答える