【问题标题】:SKSpriteNode collision detection errorSKSpriteNode 碰撞检测错误
【发布时间】:2014-04-14 02:50:01
【问题描述】:

我正在创建一个游戏,假设球会从平台反弹。我已经为球和平台设置了物理属性(平台只有在球下方时才获得物理属性)。我的问题是:当球与平台接触时,球没有弹跳(我在 didbegincontact 方法中施加了脉冲),但是它检测到了接触。

这是我的 didBeginContact 代码:

- (void) didBeginContact:(SKPhysicsContact *)contact {

    SKSpriteNode *firstNode, *secondNode;

    firstNode = (SKSpriteNode*) contact.bodyA.node;
    secondNode = (SKSpriteNode*) contact.bodyB.node;

    if ((contact.bodyA.categoryBitMask == ballCategory) && (contact.bodyB.categoryBitMask == solidPlatformCategory)) {

        NSLog(@"Platform Hit");

        CGPoint contactPoint = contact.contactPoint;

        [_ball.physicsBody applyImpulse:CGVectorMake(0, 4) atPoint:contactPoint];

    }

}



///// Here is the code for SKSpriteNode Ball

- (void) addBall {

    _myBall = [SKSpriteNode spriteNodeWithImageNamed:@"ball.png"];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        _myBall.scale = 0.4;
    } else {
        _myBall.scale = 0.3;
    }
    _ball.position = CGPointMake(self.frame.size.width/2, _solidPlatform.position.y + 2.5*_ball.size.height);
    _ball.zPosition = 2;
    _ball.name = @"doodle";
    _ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_myDoodle.frame.size];
    _ball.physicsBody.mass = 1.0;
    _ball.physicsBody.restitution = 0.8;
    _ball.physicsBody.dynamic = YES;
    _ball.physicsBody.allowsRotation = NO;
    _ball.physicsBody.usesPreciseCollisionDetection = YES;
    _ball.physicsBody.categoryBitMask = ballCategory;
    _ball.physicsBody.collisionBitMask = solidPlatformCategory;
    _ball.physicsBody.contactTestBitMask = solidPlatformCategory;

    //SKAction *moveUpAction = [SKAction moveByX:0.0 y:8*numberOfPlatforms duration:0.5];


    [self addChild:_ball];
}

////Platform has been defined as (not a complete code):

_solidPlatform7.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_solidPlatform7.frame.size];
        _solidPlatform7.physicsBody.dynamic = NO;
        _solidPlatform7.physicsBody.affectedByGravity = NO;
        _solidPlatform7.physicsBody.usesPreciseCollisionDetection = YES;
        _solidPlatform7.physicsBody.categoryBitMask = solidPlatformCategory;

PS:如果我将平台定义为 bodyWithEdgeFromRect,我不会得到任何合谋检测

【问题讨论】:

  • 你的代码,赞成...
  • 你能帮忙看看上面的代码吗?

标签: ios7 xcode5 sprite-kit


【解决方案1】:

没有看到一些代码很难回答,但我会尝试:

如果球根本没有反弹,请检查恢复属性。更高的值提供更高的“弹性”:

ball.physicsBody.restitution=0.8;

如果你想让球在底部和天花板之间无限反弹,你可以在每次碰撞后反转重力:

self.physicsWorld.gravity = CGVectorMake(0, self.physicsWorld.gravity.dy * (-1));

希望对您有所帮助。如果没有,请分享一些代码。

我已经尝试过您的代码。通过一些较小的更改它可以工作:

- (void) addBall {

    // Bottom platforms
    for (int i=0; i<10; i++) {
        SKSpriteNode *mySprite = [SKSpriteNode  spriteNodeWithColor:[UIColor redColor] size:CGSizeMake(40, 20)];
        CGPoint location = CGPointMake(i*40+60, 10);
        //mySprite.size =CGSizeMake(20, 40);
        mySprite.position=location;
        mySprite.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:mySprite.size];
        mySprite.physicsBody.dynamic=false;
        mySprite.physicsBody.categoryBitMask=solidPlatformCategory;
        [self addChild:mySprite];
    }


    _ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball.png"];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        _ball.scale = 0.4;
    } else {
        _ball.scale = 0.3;
    }

    _ball.position = CGPointMake(self.frame.size.width/2, self.frame.size.width/2);
    _ball.zPosition = 2;
    _ball.name = @"doodle";
    //_ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:_myDoodle.frame.size];
    _ball.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:_ball.size.width/2];
    _ball.physicsBody.mass = 1.0;
    _ball.physicsBody.restitution = 1;
    _ball.physicsBody.dynamic = YES;
    _ball.physicsBody.allowsRotation = NO;
    _ball.physicsBody.usesPreciseCollisionDetection = YES;
    _ball.physicsBody.categoryBitMask = ballCategory;
    _ball.physicsBody.collisionBitMask = solidPlatformCategory;
    _ball.physicsBody.contactTestBitMask = solidPlatformCategory;




    //SKAction *moveUpAction = [SKAction moveByX:0.0 y:8*numberOfPlatforms duration:0.5];


    [self addChild:_ball];
}

【讨论】:

  • Stefan,感谢您的帮助,但请查看上面的代码了解详细信息。
  • 您在函数中使用“_myBall”和“_ball”。这会导致问题吗?
  • 物理学家为什么选择矩形作为球体?
  • _ball.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:_ball.size.width/2];
猜你喜欢
  • 2015-10-06
  • 2023-03-05
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2011-09-05
相关资源
最近更新 更多