试图让固定炮塔向移动中的敌人开火(塔防游戏)。
static const uint32_t towerCategory = 0x1 << 0;
static const uint32_t creepCategory = 0x1 << 1;
如果以上是正确的,towerCategory 应该有较低的类别编号正确吗?
tower.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:80];
tower.physicsBody.dynamic = YES;
tower.physicsBody.categoryBitMask = towerCategory;
tower.physicsBody.contactTestBitMask = creepCategory;
tower.physicsBody.collisionBitMask = 0;
这应该将塔节点设置在 towerCategory 中,并对移动到范围内的 creep 之间的接触使用react(范围是 80 半径物理体)。由于我也不希望塔或 creep 相互插入,因此我将碰撞设置为 0。
baddie.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:baddie.size];
baddie.physicsBody.dynamic = YES;
baddie.physicsBody.categoryBitMask = creepCategory;
baddie.physicsBody.contactTestBitMask = towerCategory;
baddie.physicsBody.collisionBitMask = 0;
敌人也一样。我切换了类别并联系了 bitMask,因为这应该是一个 creep,并且它联系了塔。仍然没有碰撞,所以将其设置为 0。
SKPhysicsBody* firstBody;
SKPhysicsBody* secondBody;
if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask)
{
firstBody = contact.bodyA;
secondBody = contact.bodyB;
}
else
{
firstBody = contact.bodyB;
secondBody = contact.bodyA;
}
if ((firstBody.categoryBitMask & towerCategory) != 0 &&
(secondBody.categoryBitMask & creepCategory) != 0)
{
[secondBody.node removeAllActions];
}
我很确定 didBeginContact 函数是失败的地方。由于 towerCategory 低于 creepCategory,如果我的代码正确,它应该始终放在 firstBody 中。然后,当 creep 进入接触范围时,它应该移除所有 Action 并停在轨道上。然而,他只是不断前进。有人可以指出我遗漏了什么吗?
最佳答案
为您的 didBeginContact:
尝试此代码:
- (void)didBeginContact:(SKPhysicsContact *)contact
{
NSLog(@"bodyA:%@ bodyB:%@",contact.bodyA.node.name, contact.bodyB.node.name); // <- this gives you who touched who by object name
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);
if (collision == (towerCategory | creepCategory))
{
NSLog(@"we got contact...");
}
}
请记住,contact.bodyA.node.(property)
可以为您提供 SKNode 的任何属性。名称、位置、xScale、yScale、alpha、children、parent 等。您可以在 SKNode Class Reference 中看到它们全部列出.
关于ios - SpriteKit 碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23092948/