2013-10-13 9 views
9

スプライトキットのピンジョイントをテストしています。スプライトキットのピンジョイントのアンカーが正しくないようです

希望する設定は、1つのワイドフラットボックスと2つのサークルです。円はSKPhysicsPinジョイントを介してボックスに接続されているため、ホイールとして機能することができます。

ここに私のコードです。私はそれをできるだけ簡潔にするために試してみた:

- (SKNode*) createWheelWithRadius:(float)wheelRadius { 
    CGRect wheelRect = CGRectMake(-wheelRadius, -wheelRadius, wheelRadius*2, wheelRadius*2); 

    SKShapeNode* wheelNode = [[SKShapeNode alloc] init]; 
    wheelNode.path = [UIBezierPath bezierPathWithOvalInRect:wheelRect].CGPath; 

    wheelNode.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:wheelRadius]; 

    return wheelNode; 
} 


- (void) createCar { 

    // Create the car 
    SKSpriteNode* carNode = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(150, 50)]; 
    carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 
    carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
    [self addChild:carNode]; 

    // Create the left wheel 
    SKNode* leftWheelNode = [self createWheelWithRadius:30]; 
    leftWheelNode.position = CGPointMake(carNode.position.x-80, carNode.position.y); 
    [self addChild:leftWheelNode]; 

    // Create the right wheel 
    SKNode* rightWheelNode = [self createWheelWithRadius:30]; 
    rightWheelNode.position = CGPointMake(carNode.position.x+80, carNode.position.y); 
    [self addChild:rightWheelNode]; 

    // Attach the wheels to the body 
    CGPoint leftWheelPosition = leftWheelNode.position; 
    CGPoint rightWheelPosition = rightWheelNode.position; 

    SKPhysicsJointPin* leftPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:leftWheelNode.physicsBody anchor:leftWheelPosition]; 
    SKPhysicsJointPin* rightPinJoint = [SKPhysicsJointPin jointWithBodyA:carNode.physicsBody bodyB:rightWheelNode.physicsBody anchor:rightWheelPosition]; 

    [self.physicsWorld addJoint:leftPinJoint]; 
    [self.physicsWorld addJoint:rightPinJoint]; 
} 

私は期待していどのようなピン継手は、その中心点に固定されていることです。しかし、私がこれをテストすると、関節のアンカーは遠く離れているように見えます。

本当に明白なものがありませんか?

答えて

10

この問題もあり、原因はスプライトの位置を設定する前に物理ボディを設定していることです。

carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 

まで以上にそれが動作するはず

carNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carNode.size]; 
carNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 

変更。ありがとうSmick。

SpriteKit: How to create Basic Physics Joints

+0

あなたのTVCでは、numberOfSectionsInTableViewをコメントアウトし、numberOfRowsInSectionには[_dataSourceArray count]を使用するだけです。良い例ですが、[head.physicsBody applyTorque:0.2]を追加する必要があります。固定ジョイントとの違いを実際に表示するためにピン結合に移動します。良い仕事 - 分かち合いに感謝します。 – DogCoffee

+0

ありがとうSmick ..私は例を更新しました。しかし、TVCはそのようにコーディングされています。なぜなら、2つのセクションがあるからです。あなたの車の例をジョイントタイプとして追加できませんでした。 :)その例は別のセクションに置かれます。 – Bavan

+0

私はここの例で車を見ることはできませんが、まだ関節のリストしか持っていません。私はすべてのテストコードをTVCに入れます - クールなアイデア! – DogCoffee

5

このコードを試してみると、私はあなたのものを使い、奇妙な問題が発生したので、最初から始めました。

- (SKShapeNode*) makeWheel 
{ 
    SKShapeNode *wheel = [[SKShapeNode alloc] init]; 
    CGMutablePathRef myPath = CGPathCreateMutable(); 
    CGPathAddArc(myPath, NULL, 0,0, 16, 0, M_PI*2, YES); 
    wheel.path = myPath; 
    return wheel; 
} 


- (void) createCar 
{ 

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 0, self.size.width, self.size.height)]; 

    // 1. car body 
    SKSpriteNode *carBody = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(120, 8)]; 
    carBody.position = CGPointMake(200, 200); 
    carBody.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:carBody.size]; 
    [self addChild:carBody]; 

    // 2. wheels 
    SKShapeNode *leftWheel = [self makeWheel]; 
    leftWheel.position = CGPointMake(carBody.position.x - carBody.size.width/2, carBody.position.y); 
    leftWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16]; 
    [self addChild:leftWheel]; 

    SKShapeNode *rightWheel = [self makeWheel]; 
    rightWheel.position = CGPointMake(carBody.position.x + carBody.size.width/2, carBody.position.y); 
    rightWheel.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:16]; 
    [self addChild:rightWheel]; 

    // 3. Join wheels to car 
    [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:leftWheel.physicsBody anchor:leftWheel.position]]; 
    [self.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:carBody.physicsBody bodyB:rightWheel.physicsBody anchor:rightWheel.position]]; 

    // 4. drive car 
    [carBody.physicsBody applyForce:CGVectorMake(10, 0)]; 
} 
+0

ありがとうございました!私はBavanの答えを正しいとマークしました。なぜなら、今後の読者の方がより簡潔で容易になるためですが、最初に正しい解決策を提示しました。 –

+0

@DogCoffee:私はあなたのコードを使ってSpriteNodesに結合しました。しかし、それは私のspritenodeの位置を変更します。手伝ってくれませんか ? – Nirav

+0

@Nirav新しい質問を投稿することをお勧めします。私はスプライトキットをしばらく使用していません。 – DogCoffee

関連する問題