2014-10-12 2 views
1

Я пытаюсь определить, почему произошло слайд. Я создал 2 узла, и один из них движется с помощью SKAction. Но когда один из них выше на другом, он не перемещается с узлом под ними.SpriteKit SKSpriteNode slide

Это немного трудно объяснить, так что я создал видео: https://www.youtube.com/watch?v=F4OuTBVd5sM&feature=youtube_gdata_player

Спасибо за ваши ответы!

Части кода:

CGPoint positionPoint = [valuePoint CGPointValue]; 
    SKSpriteNode *slab = [SKSpriteNode spriteNodeWithTexture:plitaTexture]; 
    slab.name = @"plita"; 
    slab.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:plitaTexture.size]; 
    slab.position = positionPoint; 
    slab.physicsBody.dynamic = NO; 
    CGFloat duration = 3.0; 
    CGFloat firstDuration = duration/(self.size.width/slab.position.x); 
    SKAction *moveLeftFirstTime = [SKAction moveTo:CGPointMake(0.0 + plitaTexture.size.width/2, positionPoint.y) duration:firstDuration]; 
    SKAction *moveLeft = [SKAction moveTo:CGPointMake(0.0 + plitaTexture.size.width/2, positionPoint.y) duration:5]; 
    SKAction *moveRight = [SKAction moveTo:CGPointMake(self.size.width - plitaTexture.size.width/2, positionPoint.y) duration:5]; 
    SKAction *movingRightLeft = [SKAction sequence:@[moveRight, moveLeft]]; 
    SKAction *moving = [SKAction sequence:@[moveLeftFirstTime,[SKAction repeatActionForever:movingRightLeft]]]; 
    [slab runAction:moving]; 
    [self addChild:slab]; 

Кролик код инициализации:

-(instancetype)init { 
    if (self = [super initWithImageNamed:@"eating-rabbit1"]) { 
     self.physicsBody = [SKPhysicsBody bodyWithTexture:self.texture size:self.texture.size]; 
     self.physicsBody.allowsRotation = NO; 
     self.physicsBody.dynamic = YES; 
     self.physicsBody.friction = 1; 
    } 
    return self; 
} 

ответ

2

Главный герой скользит, потому что вы перемещаете плиту, меняя свое положение с течением времени. Представьте, что вы стоите на поезде, который движется, трение заставит вас двигаться в направлении поезда. Однако, если поезд волшебным образом перемещается из точки A в точку B, исчезая и снова появляясь по 1 см за раз, вы останетесь в точке A. Это то, что происходит с вашим главным персонажем.

Для исправления этой проблемы вам нужно будет перемещать плиты с помощью физики. Вот пример того, как сделать это:

slab.physicsBody.affectedByGravity = NO; 
slab.physicsBody.dynamic = YES; 

// These will help prevent the slab from twisting due to the weight of the main character 
slab.physicsBody.angularDamping = 1.0; 
slab.physicsBody.mass = 1e6; 

// Air resistance will slow slab's movement, set the damping to 0 
slab.physicsBody.linearDamping = 0; 

Определить набор SKActions, которые будут двигаться плиты влево и вправо. Отрегулируйте переменные скорости и продолжительности для достижения желаемого движения.

SKAction *moveLeft = [SKAction customActionWithDuration:0 actionBlock:^(SKNode *node, CGFloat elapsedTime){ 
    node.physicsBody.velocity = CGVectorMake(-speed, 0); 
}]; 
SKAction *moveRight = [SKAction customActionWithDuration:0 actionBlock:^(SKNode *node, CGFloat elapsedTime){ 
    node.physicsBody.velocity = CGVectorMake(speed, 0); 
}]; 

SKAction *wait = [SKAction waitForDuration:duration]; 

SKAction *action = [SKAction sequence:@[moveRight, wait, moveLeft, wait]]; 

[slab runAction:[SKAction repeatActionForever:action]]; 
+0

Вы рок! Большое спасибо! – Stillfinder

0

Вы должны установить physicsBody сляба, чтобы быть динамичным.

slab.physicsBody.dynamic = YES; 
slab.physicsBody.affectedByGravity = NO; 

Нединамическая физикаBody визуализируется и игнорирует любые силы и импульсы, применяемые к ней. Посмотрите объект в документации here.

+0

Спасибо, но в этом случае я получаю что-то вроде в видео: https://www.youtube.com/watch?v=ewbTiUTm8cw&feature=youtube_gdata_player – Stillfinder

Смежные вопросы