我正在检测来自球和屏幕两个边缘的触点(左右一个) 为此我创建了: - 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
答案 0 :(得分:2)
我已经调查了你的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];
答案 1 :(得分:0)
您可能错过了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;
}
...
}
这需要做,因为无法保证哪个机构将成为第一个或第二个。
答案 2 :(得分:0)
这是一个与您的应用程序似乎不同的方向,但它有效。
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];
然后对上边缘做同样的事情。
希望这会有所帮助。