首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spritekit SKPhysicsBody销接头

Spritekit SKPhysicsBody销接头
EN

Stack Overflow用户
提问于 2015-07-29 08:20:39
回答 2查看 334关注 0票数 0

我在尝试制造一个摩天轮。它由三种不同的精灵组成:底座(腿)、身体(旋转的圆形部分)和座椅(总共16个)。

在下面的代码中,我将底座添加到场景中,然后将身体附加到底座上,最后将每个座椅附加到身体上。座椅目前(以一种奇怪的方式)与身体旋转。我根本不想让座位旋转。我做错了什么?

注:更新后有@dragoneye的评论和建议

代码语言:javascript
复制
-(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;

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-29 18:47:25

经过一段时间的努力,并创建了一个简单的测试项目,我意识到我的问题是,我把摩天轮的车身作为一个子节点附加到底座上,我还把座椅作为子节点附加到身体上。虽然可能有办法让这个工作,我把所有的坐标都基于世界坐标。这可能会对未来的人有所帮助。这是固定代码:

代码语言:javascript
复制
-(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];
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-07-29 09:16:24

设置连接的上、下限值。

pinJoint.shouldEnableLimits=TRUE;

pinJoint.lowerAngleLimit = -0.25;

pinJoint.upperAngleLimit = 0.25;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31695000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档