2

我有一个节点,它位于我的屏幕下方并用作平台。一旦另一个节点接触到该节点,布尔值就会设置为 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);
    }
}
4

3 回答 3

2

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

也许你的位面具有问题?

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

于 2014-03-10T21:20:00.880 回答
2

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

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

SKPhysicsBody* body = desertBottom.physicsBody;
body.velocity = CGVectorMake(body.velocity.x, 0.0);
于 2014-03-10T15:45:36.877 回答
1

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

于 2014-03-11T16:11:58.627 回答