0

観覧車を作ろうとしています。土台(脚)、胴体(回転する円形のパーツ)、座(全部で16個)の3種類のスプライトで構成されています。

以下のコードでは、ベースをシーンに追加し、ベースにボディを取り付け、最後に各シートをボディに取り付けています。座席は現在、体と一緒に(奇妙な方法で)回転しています。シートを回転させたくありません。私は何を間違っていますか?

注: @dragoneye からのコメントと提案で更新

-(void) initFerrisWheel {
    self.physicsWorld.gravity = CGVectorMake(0, 0);

    //creates the body of the ferris wheel and attaches it to the base
    SKSpriteNode *ferrisWheel = (SKSpriteNode*)[self childNodeWithName:@"ferriswheel_base"];
    SKTexture *bodyTexture = [[SharedAssetsManager sharedData].menuAssets objectForKey:@"ferriswheel_body"];
    SKSpriteNode *body = [[SKSpriteNode alloc] initWithTexture:bodyTexture];
    [body setZPosition:2];
    [body setPosition:CGPointMake(0, 55)];
    body.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:self.size.height/2];
    [ferrisWheel addChild:body];

    //rotates the body of the ferris wheel
    SKAction *rotateSequence = [SKAction rotateByAngle:-0.785 duration:2.0];
    SKAction *rotateFinal = [SKAction repeatActionForever:rotateSequence];
    [body runAction:rotateFinal];

    SKTexture *seatTexture = [[SharedAssetsManager sharedData].menuAssets objectForKey:@"ferriswheel_seat"];

    int r = 130; //radius of the body for the ferris wheel
    for (int i = 0; i < 16; i++) {
        //creates a seat and places it on the body
        SKSpriteNode *seat = [[SKSpriteNode alloc] initWithTexture:seatTexture];
        float x = r * cosf(2*M_PI*i/16);
        float y = r * sinf(2*M_PI*i/16);
        [seat setPosition:CGPointMake(x, y)];
        [seat setZPosition:3];
        [body addChild:seat];

        //physics body stuff
        seat.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:seat.size.height/2];
        seat.physicsBody.dynamic = YES;

        CGPoint anchor = CGPointMake(x, y);
        SKPhysicsJointPin *pin = [SKPhysicsJointPin jointWithBodyA:body.physicsBody bodyB:seat.physicsBody anchor:anchor];
        [self.physicsWorld addJoint:pin];
        pin.shouldEnableLimits = YES;
        pin.lowerAngleLimit = -0.25;
        pin.upperAngleLimit = 0.25;

    }
}
4

2 に答える 2

0

しばらくこれに取り組み、簡単なテストプロジェクトを作成した後、私の問題は、観覧車の本体を子ノードとしてベースに取り付けていて、座席も子ノードとして本体に取り付けていたことに気付きました. これを機能させる方法があるかもしれませんが、代わりにすべての座標をワールド座標に基づいています。これは将来誰かを助けるかもしれません。固定コードは次のとおりです。

-(void) initFerrisWheel {
    //creates the body of the ferris wheel and attaches it to the base
    SKSpriteNode *ferrisWheel = (SKSpriteNode*)[self childNodeWithName:@"ferriswheel_base"];
    SKTexture *bodyTexture = [[SharedAssetsManager sharedData].menuAssets objectForKey:@"ferriswheel_body"];
    SKSpriteNode *body = [[SKSpriteNode alloc] initWithTexture:bodyTexture];
    [body setZPosition:2];
    [body setPosition:CGPointMake(ferrisWheel.position.x, ferrisWheel.position.y + 55)];
    body.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:body.size];
    body.physicsBody.affectedByGravity = NO;
    [self addChild:body];

    //rotates the body of the ferris wheel
    SKAction *rotateSequence = [SKAction rotateByAngle:-0.785 duration:2.0];
    SKAction *rotateFinal = [SKAction repeatActionForever:rotateSequence];
    [body runAction:rotateFinal];

    SKTexture *seatTexture = [[SharedAssetsManager sharedData].menuAssets objectForKey:@"ferriswheel_seat"];

    int r = 130; //radius of the body for the ferris wheel
    for (int i = 0; i < 16; i++) {
        //creates a seat and places it on the body
        SKSpriteNode *seat = [[SKSpriteNode alloc] initWithTexture:seatTexture];
        float x = body.position.x + r * cosf(2*M_PI*i/16);
        float y = body.position.y + r * sinf(2*M_PI*i/16);
        [seat setPosition:CGPointMake(x, y)];
        [seat setZPosition:3];
        [self addChild:seat];

        //physics body stuff
        seat.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:seat.size];
        seat.physicsBody.affectedByGravity = NO;

        SKPhysicsJointPin *pin = [SKPhysicsJointPin jointWithBodyA:body.physicsBody bodyB:seat.physicsBody anchor:seat.position];
        [self.physicsWorld addJoint:pin];
    }
}
于 2015-07-29T18:47:25.150 に答える