Изменение текстуры SpriteKit в соответствии с направлением оси X спрайта

Это кажется простой проблемой для решения, но я не могу. Как следует из названия, мне нужно, чтобы мой спрайт изменился на другую текстуру в зависимости от того, как он движется - влево или вправо. Вот что я пытался сделать:

if (self.sprite.position.x > 0) //also tried "self.sprite.position.x" instead of 0.
{
    [self.sprite setTexture:[SKTexture textureWithImageNamed:@"X"]];
}
if (self.sprite.position.x < 0)
{
    [self.sprite setTexture:[SKTexture textureWithImageNamed:@"XX"]];
}

Ни один из них не работал (за исключением случаев, когда ось x спрайта == 0 -_-).

Я прочитал это: SpriteKit: изменить текстуру в зависимости от направления Это не помогло.

РЕДАКТИРОВАТЬ: Простите, я забыл упомянуть, что движение спрайта совершенно случайно в 2D-пространстве. Я использую arc4random() для этого. Мне не нужны какие-либо изменения текстуры, когда она идет вверх или вниз. Но левый и правый имеют важное значение.

Должно быть, я что-то не так пишу

if (self.sprite.physicsBody.velocity.dx > 0)
if (self.sprite.physicsBody.velocity.dx < 0)

не работает для меня Ни то, ни другое

if (self.sprite.physicsBody.velocity.dx > 5)
if (self.sprite.physicsBody.velocity.dx < -5)

Просто чтобы прояснить движение этого спрайта еще раз: оно случайно движется с помощью

-(void)update:(CFTimeInterval)currentTime

метод. Это достигается так:

-(void)update:(CFTimeInterval)currentTime
{
    /* Called before each frame is rendered */

    if (!spritehMoving)
    {   
        CGFloat fX = [self getRandomNumberBetweenMin:-5 andMax:5];
        CGFloat fY = [self getRandomNumberBetweenMin:-5 andMax:7];


        int waitDuration = arc4random() %3;

        SKAction *moveXTo       = [SKAction moveBy:CGVectorMake(fX, fY) duration:1.0];
        SKAction *wait          = [SKAction waitForDuration:waitDuration];
        SKAction *sequence      = [SKAction sequence:@[moveXTo, wait]];
        [self.sprite runAction:sequence];
    }

}

1 ответ

Решение

Вы можете просто проверить, если fX больше или меньше 0, что означает, что "сила" на оси х является либо положительной (правое движение), либо отрицательной (левое движение).

Вот модифицированный код, который должен сделать
Кстати, я также установил SpritehMovingBOOL в начале и в конце движения, в противном случае этот метод будет вызван, даже если спрайт движется (что в этом нет ничего плохого, но, похоже, он не справляется с задачей проверки BOOL значение.

if (!spritehMoving)
{   
    spritehMoving = YES;  

    CGFloat fX = [self getRandomNumberBetweenMin:-5 andMax:5];
    CGFloat fY = [self getRandomNumberBetweenMin:-5 andMax:7];


    int waitDuration = arc4random() %3;  

    SKAction *changeTexture;  

    if(fX > 0) { // Sprite will move to the right  
        changeTexture = [SKAction setTexture:[SKTexture textureWithImageNamed:@"RightTexture.png"]];  
    } else if (fX < 0) { // Sprite will move to the left  
        changeTexture = [SKAction setTexture:[SKTexture textureWithImageNamed:@"LeftTexture.png"]];  
    } else {  
        // Here I'm creating an action that doesn't do anything, so in case  
        // fX == 0 the texture won't change direction, and the app won't crash    
        // because of nil action  
        changeTexture = [SKAction runBlock:(dispatch_block_t)^(){}];
    }

    SKAction *moveXTo    = [SKAction moveBy:CGVectorMake(fX, fY) duration:1.0];
    SKAction *wait       = [SKAction waitForDuration:waitDuration];  
    SKAction *completion = [SKAction runBlock:(dispatch_block_t)^(){ SpritehMoving = NO; }];
    SKAction *sequence   = [SKAction sequence:@[changeTexture, moveXTo, wait, completion]];
    [self.sprite runAction:sequence];
}
Другие вопросы по тегам