ios - SpriteKit 碰撞检测

标签 ios objective-c collision-detection sprite-kit

试图让固定炮塔向移动中的敌人开火(塔防游戏)。

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/

相关文章:

ios - 按用户定义的标准对列表框进行排序 - delphi xe6

ios - Xcode AVAudioPlayer 未播放

objective-c - NSOpenSavePanelDelegate 协议(protocol)中的方法 panelSelectionDidChange 被调用两次

java - 你能用 Graphics g 绘制 Area 对象吗?

javascript - Cordova/PhoneGap 照片质量设置为 1,仍然是高质量

ios - 从其他 Swift 文件调用类

iOS - 在其他 View 之上设置模糊图像,奇怪的问题

ios - 整个应用程序的导航样式

java - 二维边界框与旋转的碰撞

javascript - 检测一个物体与多少个物体碰撞/否定多个物体