3

私は明らかにSKPhysicsJointをよく理解していませんが、もちろんAppleのドキュメント以外には、Web上にはまだほとんど情報がありません。次のコードの何が問題なのですか。頭と首を永久に結合したままにしておく必要があると思います。私の意図は、ピンで 2 枚の紙のように振る舞うことで、少し回転させることができますが、完全にバラバラになるわけではありません。 . このコードを実行すると、SKScene の下部に落ちて地面にぶつかり、頭が体から落ちます。

たぶん、関節はそれらと一緒に動いていないのでしょうか?

self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"];
self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size];
self.head.physicsBody.mass = 0.05;
self.head.physicsBody.dynamic = YES;

self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"];
self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size];
self.chest.physicsBody.mass = 0.05;
self.chest.physicsBody.dynamic = YES;

self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"];
self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size];
self.leftLeg.physicsBody.mass = 10;
self.leftLeg.physicsBody.dynamic = YES;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    self.head.position = CGPointMake(282, 220);
    self.chest.position = CGPointMake(282, 130);
    self.leftLeg.position = CGPointMake(282, 10);

} else {
    self.head.position = CGPointMake(512, 380);
    self.chest.position = CGPointMake(512, 290);
    self.leftLeg.position = CGPointMake(512, 10);

}



[self addChild:self.head];
[self addChild:self.chest];
[self addChild:self.leftLeg];


self.chestJointPinAnchor = CGPointMake(self.chest.position.x, self.chest.position.y+39);
self.chestJointPin = [SKPhysicsJointPin jointWithBodyA:self.head.physicsBody bodyB:self.chest.physicsBody anchor:self.chestJointPinAnchor];
[self.physicsWorld addJoint:self.chestJointPin];
4

4 に答える 4

6

これは、physicsBody プロパティを設定した後でスプライトの位置を設定したためです。ドキュメントでそれについての言及を発見していませんが、先週末、手動で作成したロープが機能する理由を理解しようとして頭を壊しましたが、再帰的には機能しません。SpriteNodes の位置は、physicsBody のに設定する必要があります。したがって、次のようにコードを並べ替えてください。

self.head = [SKSpriteNode spriteNodeWithImageNamed:@"head.png"];
self.chest = [SKSpriteNode spriteNodeWithImageNamed:@"chest_neck"];
self.leftLeg = [SKSpriteNode spriteNodeWithImageNamed:@"left_leg"];

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    self.head.position = CGPointMake(282, 220);
    self.chest.position = CGPointMake(282, 130);
    self.leftLeg.position = CGPointMake(282, 10);

} else {
    self.head.position = CGPointMake(512, 380);
    self.chest.position = CGPointMake(512, 290);
    self.leftLeg.position = CGPointMake(512, 10);

self.head.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.head.size];
self.head.physicsBody.mass = 0.05;
self.head.physicsBody.dynamic = YES;

self.chest.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.chest.size];
self.chest.physicsBody.mass = 0.05;
self.chest.physicsBody.dynamic = YES;

self.leftLeg.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.leftLeg.size];
self.leftLeg.physicsBody.mass = 10;
self.leftLeg.physicsBody.dynamic = YES;


}

ああ、気がついたのですが、あなたはすでに自分で答えを見つけています...それでは、あなたの質問に回答済みのマークを付けてください。

于 2013-11-18T10:47:09.350 に答える
1

さて、これは Sprite Kit の実際のバグであることがわかりました。修正は、physicsBody を設定する前にスプライトの位置を設定することです。私はそれを行い、期待どおりに完全に機能しました。

于 2013-10-30T00:14:52.610 に答える
0

さらに、上記の内容を無効にするわけではありませんが、明らかに物理エンジンは、シーンのアンカーポイントが (0, 0) のままであると想定しています。他の値に変更しても、物理エンジンは (0, 0) として扱います。

于 2014-12-19T20:51:32.963 に答える