知道为什么我的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++;
    }
}
}


有任何想法吗?非常感谢所有帮助!

提前致谢

斯蒂金

最佳答案

我最初怀疑这可能是缺少适当的SKPhysicsContactDelegate,因为在原始帖子中没有提到。但是,在检查代码时,情况并非如此,问题很简单,用于矩形的SKPhysicsBody是使用不合适的bodyWithCircleOfRadius:而不是bodyWithRectangleOfSize:创建的。

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




原始答案,对于此特定情况不正确,但将其留给任何有类似问题的人放在下面:

您提供的代码中没有任何地方提到SKPhysicsContactDelegatedidBeginContact:方法是physicsWorldSKScene属性的委托方法。

因此,例如,如果您想让SKScene作为其自己的委托,则它必须支持SKPhysicsContactDelegate协议。 e。 G。:

@interface YourSceneSubclass : NSObject <SKPhysicsContactDelegate>


然后,您需要在游戏开始之前将委托设置在场景中的某个位置。

self.physicsWorld.contactDelegate = self;

关于ios - didBeginContact不会触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21834716/

10-10 16:13