0

У меня есть эта проблема: У меня есть узел A и узел B. Что я хочу, когда происходит столкновение между ними (узел A сталкивается с вершиной B), узел B не будет толкать узел А немного вверх. Потому что, как и сейчас, когда A сталкивается с B, его немного отбрасывают, и столкновение мгновенно заканчивается (вызывается didEndContact). Поэтому, когда им нравится сталкиваться с этим B, столкновение мгновенно заканчивается, затем начинается снова, затем заканчивается, затем начинается снова .... Я хочу, чтобы, если A столкнулся с B, A будет лежать на этом B. Я заметил, что могу достичь что, установив A.dynamic = NO, но мне нужно применить скорость к A, и если ее не динамическая скорость не будет работать.Столкновение SpriteKit предотвращает от выталкивания

Это код:

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

-(void)didMoveToView:(SKView *)view 
{ 
    self.playerNode = [SKSpriteNode spriteNodeWithImageNamed:@"player"]; 
    self.playerNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.playerNode.size]; 
    self.playerNode.physicsBody.categoryBitMask = CollisionCategoryPlayer; 
    self.playerNode.physicsBody.collisionBitMask = CollisionCategoryDiggable; 
    self.playerNode.physicsBody.contactTestBitMask = CollisionCategoryDiggable; 
    self.playerNode.position = CGPointMake(160, 520); 
    self.playerNode.name = @"player"; 
    self.playerNode.physicsBody.allowsRotation = NO; 
    self.playerNode.physicsBody.friction = 0; 
    [self addChild:self.playerNode]; 

    SKSpriteNode* spriteNode = [SKSpriteNode spriteNodeWithTexture:textToUse]; 
    spriteNode.name = keyFromCoordinate(coord); 
    spriteNode.position = CGPointMake(160, 400); 
    spriteNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:spriteNode.size]; 
    spriteNode.physicsBody.dynamic = NO; 
    spriteNode.physicsBody.categoryBitMask = CollisionCategoryDiggable; 
    spriteNode.physicsBody.collisionBitMask = CollisionCategoryPlayer; 
    spriteNode.physicsBody.contactTestBitMask = CollisionCategoryPlayer; 
    spriteNode.physicsBody.resting = YES; 
    [self addChild:spriteNode]; 

} 

-(void)update:(NSTimeInterval)currentTime 
{ 
    self.playerNode.physicsBody.velocity = CGVectorMake(0, -200); 
} 

И снова проблема в том, что didBeginContact называется, то didEndContact, то didBegin и так далее, что я хочу, - так начинаются вызывалась только один раз.

+1

не рядом с моим Mac, но попробуйте перезагрузкой столкновения битовую маску для узла а/б, когда он сталкивается. – Scott

+0

@Scott ничего не изменилось :( – t0a0

+1

@Scott Я на самом деле нашел решение только сейчас. Настройка реституции для обоих физических тел на 0 сработала. – t0a0

ответ

0

Установка restitution = 0 для обоих physicsBodies помогли