contactTestBitMask 无法检测到联系人?
contactTestBitMask fails to detect contact?
我正在检测来自球和屏幕两个边缘的接触(左侧和右侧)
为此,我创建了:
– SKSpriteNode *球
– SKNode *leftEdge
– SKNode *rightEdge
我在这里设置位掩码
static const uint32_t kCCBallCategory = 0x1 << 0;
static const uint32_t kCCEdgeCategory = 0x1 << 1;
这里我添加边
leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
leftEdge.position = CGPointZero;
leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:leftEdge];
添加的右边缘完全相同,只是名称不同,位置设置为
rightEdge.position = CGPointMake(self.size.width, 0.0);
这里我配置添加球
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6.0];
ball.physicsBody.categoryBitMask = kCCBallCategory;
ball.physicsBody.collisionBitMask = kCCEdgeCategory;
ball.physicsBody.contactTestBitMask = kCCEdgeCategory;
[_mainLayer addChild:ball];
稍后在 didBeginContact 中,我正在检查第一个物体是否是球,第二个物体是否是边缘并向其添加一些爆炸
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (firstBody.categoryBitMask == kCCBallCategory && secondBody.categoryBitMask == kCCEdgeCategory) {
// Collision between ball and the edge
[self addExplosion:contact.contactPoint withName:@"BallEdgeBounce"];
}
奇怪的是 - 当球击中左边缘时 - 代码工作正常并且场景中添加了爆炸效果。 但右边缘不会做同样的事情。 这让我感到惊讶,因为碰撞效果很好。那么为什么右边缘会这样呢?我该如何解决这个问题?
您可以查看 github 上的项目,设置在 GameScene.m 文件中完成 https://github.com/Fenkins/Space-Cannon
我调查了您的 Git 项目,出现这种情况是因为您错误地为 rightEdge 设置了类别(更准确地说,您根本没有设置它)。你应该这样做:
SKNode *rightEdge = [[SKNode alloc]init];
rightEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
rightEdge.position = CGPointMake(self.size.width, 0.0);
// leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;//Error when copy/pasting ;-)
rightEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:rightEdge];
您可能错过了在 assigning the first and second bodies based on their categoryBitMask values.
的 didBeginContact: 方法中执行的简单练习
-(void)didBeginContact:(SKPhysicsContact *)contact {
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
firstBody = contact.bodyA;
secondBody = contact.bodyB;
} else {
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
...
}
这需要完成,因为无法保证 body 是第一个还是第二个。
这与您使用应用程序的方向似乎不同,但它确实有效。
SKSpriteNode *edgeLeft = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(1, self.frame.size.height)];
edgeLeft.physicsBody.collisionBitMask = kCCEdgeCategory;
edgeLeft.position = CGPointMake(3, self.frame.size.height / 2);
[self addChild:edgeLeft];
然后对顶部边缘执行相同的操作。
希望对您有所帮助。
我正在检测来自球和屏幕两个边缘的接触(左侧和右侧) 为此,我创建了: – SKSpriteNode *球 – SKNode *leftEdge – SKNode *rightEdge
我在这里设置位掩码
static const uint32_t kCCBallCategory = 0x1 << 0;
static const uint32_t kCCEdgeCategory = 0x1 << 1;
这里我添加边
leftEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
leftEdge.position = CGPointZero;
leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:leftEdge];
添加的右边缘完全相同,只是名称不同,位置设置为
rightEdge.position = CGPointMake(self.size.width, 0.0);
这里我配置添加球
ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:6.0];
ball.physicsBody.categoryBitMask = kCCBallCategory;
ball.physicsBody.collisionBitMask = kCCEdgeCategory;
ball.physicsBody.contactTestBitMask = kCCEdgeCategory;
[_mainLayer addChild:ball];
稍后在 didBeginContact 中,我正在检查第一个物体是否是球,第二个物体是否是边缘并向其添加一些爆炸
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (firstBody.categoryBitMask == kCCBallCategory && secondBody.categoryBitMask == kCCEdgeCategory) {
// Collision between ball and the edge
[self addExplosion:contact.contactPoint withName:@"BallEdgeBounce"];
}
奇怪的是 - 当球击中左边缘时 - 代码工作正常并且场景中添加了爆炸效果。 但右边缘不会做同样的事情。 这让我感到惊讶,因为碰撞效果很好。那么为什么右边缘会这样呢?我该如何解决这个问题?
您可以查看 github 上的项目,设置在 GameScene.m 文件中完成 https://github.com/Fenkins/Space-Cannon
我调查了您的 Git 项目,出现这种情况是因为您错误地为 rightEdge 设置了类别(更准确地说,您根本没有设置它)。你应该这样做:
SKNode *rightEdge = [[SKNode alloc]init];
rightEdge.physicsBody = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointZero toPoint:CGPointMake(0.0, self.size.height)];
rightEdge.position = CGPointMake(self.size.width, 0.0);
// leftEdge.physicsBody.categoryBitMask = kCCEdgeCategory;//Error when copy/pasting ;-)
rightEdge.physicsBody.categoryBitMask = kCCEdgeCategory;
[self addChild:rightEdge];
您可能错过了在 assigning the first and second bodies based on their categoryBitMask values.
的 didBeginContact: 方法中执行的简单练习-(void)didBeginContact:(SKPhysicsContact *)contact {
SKPhysicsBody *firstBody;
SKPhysicsBody *secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) {
firstBody = contact.bodyA;
secondBody = contact.bodyB;
} else {
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
...
}
这需要完成,因为无法保证 body 是第一个还是第二个。
这与您使用应用程序的方向似乎不同,但它确实有效。
SKSpriteNode *edgeLeft = [SKSpriteNode spriteNodeWithColor:[SKColor clearColor] size:CGSizeMake(1, self.frame.size.height)];
edgeLeft.physicsBody.collisionBitMask = kCCEdgeCategory;
edgeLeft.position = CGPointMake(3, self.frame.size.height / 2);
[self addChild:edgeLeft];
然后对顶部边缘执行相同的操作。
希望对您有所帮助。