2014-09-03 2 views
1

сделалBeginContact не вызвал по какой-то причине. Как я могу это исправить? Благодаря! Я установил битмакс категории и skfysicsContactDelegate, но он до сих пор не регистрирует контакты. Я застрял в этом некоторое время.spritekit сделалBeginContact не называется

#import "MyScene.h" 
#import "FuelNode.h" 
#import "SKSpriteNode+DebugDraw.h" 

typedef NS_OPTIONS(uint32_t, CollisionCategory) { 
    CollisionCategoryPlayer  = 1 << 0, 
    CollisionCategoryFuel  = 1 << 1, 
}; 

@interface MyScene() <SKPhysicsContactDelegate> 

@end 

@implementation MyScene 

{ 
    SKNode *_playerNode; 
    SKNode *_backgroundNode; 
    SKNode *_foreGround; 
} 

-(id)initWithSize:(CGSize)size 
{ 
    if (self = [super initWithSize:size]) { 

     self.physicsWorld.contactDelegate = self; 

     _backgroundNode = [self createBackground]; 
     [self addChild:_backgroundNode]; 

     _foreGround = [SKNode node]; 
     [self addChild:_foreGround]; 

     //add a fuelNode 
     FuelNode *fuel = [self createFuelAtPosition:CGPointMake(160, 440)]; 
     [_foreGround addChild:fuel]; 

     _playerNode = [self createPlayer]; 
     [_foreGround addChild:_playerNode]; 

     SKAction *actionMove = [SKAction moveToY:-100 duration:3.0]; 
     [fuel runAction:actionMove]; 

     NSLog(@"yea"); 
    } 

    return self; 
} 

-(SKNode *)createPlayer 
{ 
    CGSize playerPhysicsBody; 
    //Create player 
    SKNode *playerNode = [SKNode node]; 
    SKSpriteNode *player = [SKSpriteNode spriteNodeWithImageNamed:@"wship-3.png"]; 
    player.position = CGPointMake(self.size.width/2, 120); 

    [playerNode addChild:player]; 

    //Add physics 
    playerPhysicsBody = CGSizeMake(player.size.width/2, player.size.height/2); 
    playerNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:playerPhysicsBody]; 
    playerNode.physicsBody.dynamic = NO; 

    //Setup collision settings 
    playerNode.physicsBody.usesPreciseCollisionDetection = YES; 
    playerNode.physicsBody.categoryBitMask = CollisionCategoryPlayer; 
    playerNode.physicsBody.collisionBitMask = 0; 
    playerNode.physicsBody.contactTestBitMask = CollisionCategoryFuel; 

    [player attachDebugRectWithSize:playerPhysicsBody]; 

    return playerNode; 
} 

-(SKNode *)createBackground 
{ 
    //Create background 
    SKNode *bgNode = [SKNode node]; 
    SKSpriteNode *bg = [SKSpriteNode spriteNodeWithImageNamed:@"purple"]; 
    bg.anchorPoint = CGPointZero; 

    [bgNode addChild:bg]; 
    return bgNode; 
} 

- (FuelNode *)createFuelAtPosition:(CGPoint)position 
{ 
    // 1 
    FuelNode *node = [FuelNode node]; 
    [node setPosition:position]; 
    [node setName:@"NODE_FUEL"]; 

    // 2 
    SKSpriteNode *sprite; 
    sprite = [SKSpriteNode spriteNodeWithImageNamed:@"fuelBlue"]; 
    [node addChild:sprite]; 

    // 3 
    CGSize contactSize = CGSizeMake(sprite.size.width/2, sprite.size.height/2); 
    node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:contactSize]; 

    // 4 
    node.physicsBody.dynamic = NO; 

    //Setup collision settings 
    node.physicsBody.categoryBitMask = CollisionCategoryFuel; 
    node.physicsBody.collisionBitMask = 0; 
    //node.physicsBody.contactTestBitMask = CollisionCategoryPlayer; 

    [sprite attachDebugRectWithSize:contactSize]; 

    //SKAction *actionMove = [SKAction moveToY:-100 duration:3.0]; 
    //[node runAction:actionMove]; 

    return node; 
} 

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    BOOL fuelCollision = NO; 

    SKNode *other = (contact.bodyA.node != _playerNode) ? contact.bodyA.node : contact.bodyB.node; 

    NSLog(@"collision"); 

    fuelCollision = [(GameObjectNode *)other collisionWithPlayer:_playerNode]; 

} 


@end 
+0

Исправлено! В методе создания игрока я ошибочно установил положение спрайта игрока вместо установки позиции узла игрока! – mistakeNot

ответ

0

Исправлено! В методе создания игрока я ошибочно установил положение спрайта игрока вместо установки позиции узла игрока!

0

Для того, чтобы дать возможность обнаружения контакта, вам необходимо установить

node.physicsBody.dynamic = YES; 

Посмотрите на documentation, а также.

+0

На самом деле я пробовал это заранее, и это не исправляет проблему. – mistakeNot

+0

Вам все еще нужно, чтобы физическое устройство было динамическим. Попробуйте установить контактTestBitMask для топливного узла, а также ... – ZeMoon

+0

Я думал, что они должны быть динамическими для столкновений, чтобы работать. Контактные сообщения должны запускаться, даже если тела не настроены как динамические. Во всяком случае, это не имеет значения, если я установил их динамическими или нет, один из них или оба из-за того, что он все еще не вызывает метод. – mistakeNot