Как установить горизонтальные движения вперед и назад на спрайте?

Я пишу игру, в которой я создаю несколько спрайтов, которые движутся в одной и той же горизонтальной плоскости, т. Е. Их координата y всегда одинакова. Я не уверен, что физика, скорее только SKActions. Первоначально я написал это, чтобы создать спрайт в точке Y и переместиться в точку за пределами экрана в случайно выбранном направлении. Теперь я хочу, чтобы этот спрайт вместо этого поворачивался и шел назад, пока не достигал противоположного конца экрана, где я хочу, чтобы он снова повернулся и т. д.

Изначально у меня настроено действие как таковое:

SKAction * actionMove = [SKAction moveTo:destination duration:duration];

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

какой элегантный способ сделать это бесконечным циклом спрайтов, поворачивающихся и повторяющих свой путь снова и снова?


person marina    schedule 15.12.2013    source источник


Ответы (1)


Я понял, как это сделать с последовательностями действий. Сначала я попытался настроить это в обновлении

метод сцены, и это сделало все ужасно медленным, как и ожидалось. Итак, я настроил следующую последовательность действий (у меня спрайты двигаются вперед и назад по одной и той же координате y, поэтому им просто нужно развернуться, чтобы продолжить свое путешествие)

CGPoint destination1, destination2;
if (sprite.direction == LeftDirection)
{
    destination1 =CGPointMake(-sprite.size.width/2, sprite.position.y);
    destination2 = CGPointMake(self.frame.size.width + sprite.size.width/2, sprite.position.y);

}else {
    destination1 =CGPointMake(self.frame.size.width + sprite.size.width/2
                             , sprite.position.y);
    destination2 = CGPointMake(-sprite.size.width/2, sprite.position.y);
}

int duration = [sprite getDuration]; //this generates a random duration amount
// Create the actions
SKAction * actionMove1 = [SKAction moveTo:destination1 duration:duration];

//turn the sprite around
SKAction * rotateAction = [SKAction runBlock:^{
    sprite.xScale = sprite.xScale * -1;
    sprite.direction = (sprite.direction == LeftDirection) ? RightDirection : LeftDirection;
}];
//reverse the movement
SKAction * actionMove2 = [SKAction moveTo:destination2 duration:duration];

SKAction * actionMove = [SKAction sequence:@[actionMove1, rotateAction, actionMove2, rotateAction]];

SKAction * repeat = [SKAction repeatActionForever:actionMove];

как только это будет создано, мы запустим действие repeat для спрайта. И вуаля! непрерывное движение, изменяющее направление.

person marina    schedule 15.12.2013