didBeginContact不会触发

时间:2014-02-17 16:48:04

标签: ios objective-c sprite-kit

我知道为什么我的didBeginContact方法永远不会被解雇?球体和矩形实际上是相互接触的......

这里我宣布两个类别

static const uint32_t rectangleCategory = 0x1 << 0;
static const uint32_t ballCategory = 0x1 << 1;

此方法创建一个球体

- (SKSpriteNode *)createSphereNode
{
SKSpriteNode *sphereNode =
[[SKSpriteNode alloc] initWithImageNamed:@"sphere.png"];

sphereNode.name = @"sphereNode";
sphereNode.physicsBody.categoryBitMask = ballCategory;
sphereNode.physicsBody.contactTestBitMask = rectangleCategory;

return sphereNode;
}

此方法创建一个矩形

- (void) createRectangle
{
SKSpriteNode *rectangle = [[SKSpriteNode alloc] initWithImageNamed:@"balk.png"];

rectangle.position = CGPointMake(randomBetween(0, self.size.width),
                            self.size.height);
rectangle.name = @"rectangleNode";
rectangle.physicsBody =
[SKPhysicsBody bodyWithCircleOfRadius:(rectangle.size.width/2)-7];

rectangle.physicsBody.usesPreciseCollisionDetection = YES;
rectangle.physicsBody.categoryBitMask = rectangleCategory;
rectangle.physicsBody.contactTestBitMask = ballCategory;

[self addChild:rectangle];
}

这是不会触发的didBeginContact方法

- (void) didBeginContact:(SKPhysicsContact *)contact
{

NSLog(@"Contact begin");

SKSpriteNode *firstNode, *secondNode;

firstNode = (SKSpriteNode *)contact.bodyA.node;
secondNode = (SKSpriteNode *) contact.bodyB.node;

if ((contact.bodyA.categoryBitMask == rectangleCategory)
    && (contact.bodyB.categoryBitMask == ballCategory))
{
    CGPoint contactPoint = contact.contactPoint;

    float contact_x = contactPoint.x;
    float target_x = secondNode.position.x;
    float margin = secondNode.frame.size.height/2 - 25;

    if ((contact_x > (target_x - margin)) &&
        (contact_x < (target_x + margin)))
    {
        NSLog(@"Hit");
        self.score++;
    }
}
}

有什么想法吗?非常感谢所有帮助!

提前致谢

斯泰恩

1 个答案:

答案 0 :(得分:2)

我原本怀疑可能缺少一个合适的SKPhysicsContactDelegate,因为它在原帖中没有提到。然而,在检查代码时,情况并非如此,问题只是用于矩形的SKPhysicsBody是使用不合适的bodyWithCircleOfRadius:而不是bodyWithRectangleOfSize:创建的。

rectangle.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize: rectangle.size];

原始答案,对于这个特殊情况不正确,但是留在这里给任何有类似问题的人:

在您提供的代码中,没有任何地方可以看到SKPhysicsContactDelegatedidBeginContact:方法是physicsWorld的{​​{1}}属性的委托方法。

因此,如果您希望将SKScene作为自己的委托,则必须支持SKScene协议。即G:

SKPhysicsContactDelegate

然后你需要在游戏开始之前在你的场景中的某个地方设置委托...

@interface YourSceneSubclass : NSObject <SKPhysicsContactDelegate>