[ios]didBeginContact 不火

发布时间: 2017/3/20 18:56:30
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

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

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

在此先感谢

Stijn

解决方法 1:

我最初怀疑这可能是缺乏适当的 SKPhysicsContactDelegate,因为它没有提到在原来的职位。在检查代码的然而,这不是和这个问题很简单 SKPhysicsBody 使用为矩形创建与合身 bodyWithCircleOfRadius: 而不是 bodyWithRectangleOfSize:

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

原来的答复,不正确的这宗个案,但它在这里留下任何类似的问题︰

没有提到的 SKPhysicsContactDelegate 在任何地方,您提供的代码所示。didBeginContact:方法是一种委托方法 physicsWorld 属性的你 SKScene

所以,如果你举个例子想要 SKScene 被它自己委托它必须支持 SKPhysicsContactDelegate Protocol。 e.g。:

@interface YourSceneSubclass : NSObject <SKPhysicsContactDelegate>

然后你需要在游戏开始适当之前在你的场景设置委托某处......

self.physicsWorld.contactDelegate = self;
官方微信
官方QQ群
31647020