SKSpriteNode忽略物理停用

时间:2014-03-10 15:36:31

标签: ios objective-c sprite-kit skphysicsbody

我有一个节点放在我的屏幕下,作为一个平台。只要另一个节点触摸节点,布尔值就会设置为NO。 当我使用SKPhysicsBody属性定义我的节点时,节点会忽略affectedByGravity属性。

我的代码:

+ (void)addNewNodeTo:(SKNode *)parentNode
{
    //Correct image size
    SKSpriteNode *desertBottom = [SKSpriteNode node];
    desertBottom = [[SKSpriteNode alloc] initWithImageNamed:@"Giraffe.png"];

    desertBottom.position = CGPointMake(0, -200);
    desertBottom.zPosition = 2;


    desertBottom.physicsBody.collisionBitMask = lionType;
    desertBottom.physicsBody.categoryBitMask = terrainType;
    desertBottom.physicsBody.contactTestBitMask = lionType;


    desertBottom.zPosition = 2;
    desertBottom.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(desertBottom.size.width, desertBottom.size.height)];
    desertBottom.physicsBody.dynamic = YES;
    desertBottom.physicsBody.affectedByGravity = NO;


    [parentNode addChild:desertBottom];
}

我的碰撞方法:

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (lionType | terrainType)) {
        self.lionNode.lionIsJumping = NO;
        NSLog(@"%i", self.lionNode.lionIsJumping);
    }
}

- (void)didEndContact:(SKPhysicsContact *)contact
{
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

    if (collision == (lionType | terrainType)) {
        self.lionNode.lionIsJumping = YES;
        NSLog(@"%i", self.lionNode.lionIsJumping);
    }
}

3 个答案:

答案 0 :(得分:2)

物理机构有速度。重力随时间变化速度。如果身体由于重力已经以一定速度行进,并且您禁用重力,它将继续根据其当前速度移动,但不再从重力获得额外的速度。

我的猜测是,在禁用重力时你会期望身体停止。如果这是您想要的,您可以通过将速度的y分量设置为零来手动执行此操作:

SKPhysicsBody* body = desertBottom.physicsBody;
body.velocity = CGVectorMake(body.velocity.x, 0.0);

答案 1 :(得分:2)

如果平台在碰撞后不应移动,则必须将动态属性设置为false。

也许你的位掩码存在问题?

您是否尝试在didBeginContact方法的if语句之外注册?

答案 2 :(得分:1)

我已经为底部创建了一个带有SKSpriteNode子类的新类,并将其添加到我的GameScene中。