未检测到 SkSpriteNode 冲突
Posted
技术标签:
【中文标题】未检测到 SkSpriteNode 冲突【英文标题】:SkSpriteNode collision not being detected 【发布时间】:2014-11-15 11:09:01 【问题描述】:我正在使用 Sprite Kit 来检测两个对象之间的碰撞。下面是我如何定义它们的位掩码。
static const uint32_t puffinCategory = 0x1 << 0;
static const uint32_t planeCategory = 0x1 << 1;
这是我关于如何设置海雀和飞机物理体的代码。 海雀用
SKSpriteNode *PuffinNode = [[SKSpriteNode alloc]initWithImageNamed:@"puffin"];
PuffinNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:PuffinNode.size];
PuffinNode.physicsBody.usesPreciseCollisionDetection = YES;
PuffinNode.physicsBody.categoryBitMask = puffinCategory;
PuffinNode.physicsBody.dynamic = NO;
PuffinNode.physicsBody.collisionBitMask = puffinCategory;
PuffinNode.physicsBody.contactTestBitMask = planeCategory;
[PuffinNode setZPosition:1.5];
飞机
SKSpriteNode *planeSpriteNode = [[SKSpriteNode alloc]initWithImageNamed:planeStringFileName];
planeSpriteNode.position = CGPointMake(0, self.view.frame.size.height*-1);
planeSpriteNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:planeSpriteNode.size];
planeSpriteNode.physicsBody.usesPreciseCollisionDetection = YES;
planeSpriteNode.physicsBody.categoryBitMask = planeCategory;
planeSpriteNode.physicsBody.dynamic = NO;
planeSpriteNode.physicsBody.collisionBitMask = puffinCategory;
planeSpriteNode.physicsBody.contactTestBitMask = puffinCategory;
这是我对委托方法 didBeginContact 的实现:
-(void)didBeginContact:(SKPhysicsContact *)contact
NSLog(@"collission method run");
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 & puffinCategory) != 0 && (secondBody.categoryBitMask & planeCategory) != 0 )
NSLog(@"collission occured");
如果调用方法,我看不到日志记录,当两个精灵碰撞时我也看不到日志。
【问题讨论】:
你不是忘了设置SKScene
的physicsWorld.contactDelegate
吗?
这是在 didMoveToView 方法中完成的。
【参考方案1】:
你设置
PuffinNode.physicsBody.dynamic = NO;
和
planeSpriteNode.physicsBody.dynamic = NO;
两个静态的物体不能碰撞,至少一个应该是动态的
【讨论】:
【参考方案2】:一些问题:
1) 您是否设置了 SKScene 的 physicsWorld.contactDelegate
?
2)你的两个节点都没有动态。如果你想让它们在物理世界中交互,你应该让它们符合物理定律。其中之一至少必须是动态的。
3) 你的collisionBitMask
设置不好。
【讨论】:
以上是关于未检测到 SkSpriteNode 冲突的主要内容,如果未能解决你的问题,请参考以下文章
如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?
NSight Compute - 预期银行冲突但未检测到任何