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];
ジョイントなしでコードを実行すると、魚はフックにとどまり回転します。ただし、ジョイントが作成されてアクションが実行されると、上からの回転アクションは呼び出されません (ただし、フックへの移動は呼び出されます)。
なぜこれが起こるのか、私には少しもわかりません。誰にも指針がありますか?