ios - Spritekit - 碰撞和接触问题

标签 ios objective-c sprite-kit collision

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

墙壁代码:

//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;
   } 
}

最佳答案

您需要将墙的 contactTestBitMask 设置为零,以便不测试它与其他对象的接触(或者如果需要,设置所需的位以与特定对象进行测试到)

node.physicsBody.contactTestBitMask = 0;

为两个墙节点设置它。

为了让球与墙壁碰撞,将它们的 collisionBitMask 设置为属性类别位:

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 等...)

关于ios - Spritekit - 碰撞和接触问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23608355/

相关文章:

ios - Sprite Kit 如何让网格中的特定节点执行操作?

ios - x 和 y 位置因不同的设备而异

objective-c - 使用 CloudKit 和 Core Data 进行本地存储的应用程序。如何处理订阅通知的顺序

ios - 如何在 Swift 中将 NSDictionary 转换为 NSObject?

objective-c - 是否存在允许将 Objective-C 语法处理为面向对象的纯 C 的工具?

ios - Objective-c 中的滑动导航

ios - 如何检测在两个不同类中声明的 Sprite 之间的接触?

iOS SpriteKit 动画不出现

ios - 同义词链 - iOS/sqlite 的高效路由算法

ios - MPMoviePlayerController 不适用于文档文件夹中的电影