为什么SpriteKit PhysicContactDelegate不起作用?

时间:2014-03-04 12:17:35

标签: ios objective-c delegates sprite-kit

我正在为iOS实现一个简单的游戏。 我正在尝试使用Sprite Kit进行开发。 但是,我不知道为什么没有发生接触检测。 任何人都可以帮我解决这个问题吗?

以下是我无法获得预期结果的代码:

#import "TesttingScene.h"

@interface TesttingScene()<SKPhysicsContactDelegate>

@property (nonatomic) SKTexture *ballText;

@end

@implementation TesttingScene

-(id)initWithSize:(CGSize)size{
    self = [super initWithSize:size];
    if (self) {
        self.physicsWorld.gravity = CGVectorMake(0, 0);
        self.physicsWorld.contactDelegate = self;

        SKSpriteNode *hitBoxx = [[SKSpriteNode alloc] initWithColor:[UIColor clearColor] size:CGSizeMake(self.frame.size.width/3, self.frame.size.height/3)];
        hitBoxx.anchorPoint = CGPointMake(0, 0);
        hitBoxx.position = CGPointMake(self.size.width/2, self.size.height/2);
        hitBoxx.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:hitBoxx.frame.size];
        hitBoxx.physicsBody.dynamic = YES;
        hitBoxx.physicsBody.categoryBitMask = abPlayerHitBoxCategory;
        hitBoxx.physicsBody.contactTestBitMask = adsViewCategory;
        hitBoxx.physicsBody.collisionBitMask = 0;
        hitBoxx.physicsBody.usesPreciseCollisionDetection = YES;

        self.ballText = [SKTexture textureWithImageNamed:@"FinalBossSkill1SS"];

    }
    return self;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    SKTexture *t1 = [SKTexture textureWithRect:CGRectMake(0, 0, 0.5, 1) inTexture:self.ballText];
    SKTexture *t2 = [SKTexture textureWithRect:CGRectMake(0.5, 0, 0.5, 1) inTexture:self.ballText];
    SKSpriteNode *ball = [SKSpriteNode spriteNodeWithTexture:t1];
    ball.position = CGPointMake(self.size.width, self.size.height/2);
    ball.name = @"FinalBossSkill1Ball";
    ball.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ball.size];
    ball.physicsBody.dynamic = YES;
    ball.physicsBody.categoryBitMask = adsViewCategory;
    ball.physicsBody.contactTestBitMask = abPlayerAttackBoxCategory | abPlayerHitBoxCategory;
    ball.physicsBody.collisionBitMask = 0;
    ball.physicsBody.usesPreciseCollisionDetection = YES;
    SKAction *moveTo = [SKAction moveToX:-ball.size.width duration:1.0];
    SKAction *flash = [SKAction animateWithTextures:@[t1,t2] timePerFrame:0.1];
    SKAction *moveBall = [SKAction repeatAction:flash count:moveTo.duration/flash.duration];
    SKAction *group = [SKAction group:@[moveTo, moveBall]];
    [self addChild:ball];
    [ball runAction:[SKAction sequence:@[group, [SKAction removeFromParent]]]];
}

-(void)didBeginContact:(SKPhysicsContact *)contact{
    NSLog(@"Contact");  // <~~~~this msg doesn't appear in console when the ball pass the hitboxx.
}

1 个答案:

答案 0 :(得分:0)

您需要在导入的正下方定义位掩码类别。

static const uint32_t abPlayerHitBoxCategory =  0x1 << 0;
static const uint32_t adsViewCategory =  0x1 << 1;