【问题标题】:Spritekit - Collision & Contact IssuesSpritekit - 碰撞和接触问题
【发布时间】:2014-06-29 18:36:58
【问题描述】:

我的屏幕底部有一个可以通过倾斜设备来倾斜的对象。它可以被随机下落的物体击中,当这种情况发生时,它会显示“游戏结束!”。但是,如果它撞到墙壁上(如下面的代码所示),它将显示“游戏结束!”消息也是如此。我怎样才能解决这个问题?我希望它能够在没有任何事情发生的情况下撞到墙上。 (我也会为联系人代理添加当前代码)。

墙壁代码:

//Left Wall
SKNode *node = [SKNode node];
node.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0.0f, 0.0f, 1.0f, CGRectGetHeight(self.frame))];
[self addChild:node];


// Right wall
node = [SKNode node];
node.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(CGRectGetWidth(self.frame) - 1.0f, 0.0f, 1.0f, CGRectGetHeight(self.view.frame))];
[self addChild:node];

联系代表代码:

#pragma mark contact delegate
- (void)didBeginContact:(SKPhysicsContact *)contact {
    //Create two physics body objects
    SKPhysicsBody *firstBody, *secondBody;
    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
        firstBody = contact.bodyA;
        secondBody = contact.bodyB;
    }
    else {
        firstBody = contact.bodyB;
        secondBody = contact.bodyA;
    }

    if ((firstBody.categoryBitMask & dodgerCategory) != 0) {
       [secondBody.node removeFromParent];
       self.takenHits++;
    }if (self.takenHits >= 1) {
       //Game Over
       UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Game Over."
       message:@"You have been hit!" delegate:self
       cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
       [alert show];
       self.paused = YES;
   } 
}

【问题讨论】:

    标签: ios objective-c sprite-kit collision


    【解决方案1】:

    您需要将墙的contactTestBitMask 设置为零,以免测试它是否与其他物体接触(或根据需要设置所需的位以使用特定物体进行测试)

    node.physicsBody.contactTestBitMask = 0;
    

    为两个墙节点设置它。

    为了让球与墙壁发生碰撞,请将它们的碰撞位掩码设置为属性类别位:

    ballNode.categoryBitMask = <Ball category bit>
    ballNode.collisionBitMask = <wall category bit>
    
    leftWallNode.categoryBitMask = <wall category bit>
    leftWallNode.collisionBitMask = <ball category bit>
    
    rightWallNode.categoryBitMask = <wall category bit>
    rightWallNode.collisionBitMask = <ball category bit>
    

    简而言之,categoryBitMask 定义了物理世界中的“我属于哪个类别”,collisionBitMask 定义了“我可以在物理世界中与哪些类别发生冲突”

    如果您在定义位时遇到问题,请告诉我(使用 0x01、0x02、0x04、0x08 等...)

    【讨论】:

    • 我没有任何关于球与墙壁碰撞的任何东西......但是如果它们接触到墙壁不会有任何影响,因为它不会影响游戏......应该没问题还是我应该添加任何额外的代码?
    • 这些球是从墙上弹回来还是只是穿过它们?
    • @giorashhc 球直接从屏幕顶部落下,落地休息时消失,几乎没有碰到墙壁。另外,作为旁注,当我添加该代码时,它没有任何区别,我只需要它能够从墙上弹回而不影响其他任何东西。
    • 查看我关于设置类别和碰撞位掩码的编辑
    • 定义位时末尾的数字有什么区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多