2016-07-12 3 views
0

У меня есть пара спрайтов в быстрой игре, которые имеют одинаковые списки действий (технически [SKAction]). Все они находятся в разных точках последовательности действий, и мне нужно ранжировать их в порядке наиболее полного (с действием) до наименее полного. Как получить ход спрайта (или, по крайней мере, шаг действия, в котором он работает)? Предпочтительно, я хотел бы получить процент завершения для шага, в котором он включен.Swift: Проверка прогресса на SKActions

Ради образца кода:

let sprite1 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 
    let sprite2 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 
    let sprite3 = SKShapeNode.init(rectOf: CGSize.init(width: 20, height: 20), cornerRadius: 5) 

    sprite1.position = CGPoint(x: -100, y: 0) 
    sprite2.position = CGPoint(x: 0, y: 0) 
    sprite3.position = CGPoint(x: 100, y: 0) 

    let sequence : [SKAction] = [SKAction.move(by: CGVector(dx: 50, dy: 0), duration: 1.5), 
           SKAction.rotate(byAngle: CGFloat(M_PI/2), duration: 1.0), 
           SKAction.move(by: CGVector(dx: 0, dy: 50), duration: 1.5), 
           SKAction.rotate(byAngle: CGFloat(M_PI/2), duration: 1.0), 
           SKAction.move(by: CGVector(dx: -50, dy: 0), duration: 1.5)] 

    sprite1.run(SKAction.sequence(sequence)) 
    //wait 1 second 
    sprite2.run(SKAction.sequence(sequence)) 
    //wait another second 
    sprite3.run(SKAction.sequence(sequence)) 

    var spriteAccord : [SKSpriteNode] = //insert ranking code 
+0

Пожалуйста, ваши реальный код, это не компилируется – Eric

+1

вам нужно ранжировать в зависимости от времени, или какие действия они находятся в – Knight0fDragon

+0

Это будет то, на что они направлены (поскольку я забыл упомянуть, что они могут работать с разной скоростью). Поэтому я собираюсь взять словарь времени начала и использовать разные скорости для вычисления «расстояния» вдоль последовательности и использовать пройденное расстояние, чтобы получить рейтинг –

ответ

1

Пока скорость спрайта постоянна (AKA нет времени пули эффекта) я бы просто использовать словарь для хранения времени начала:

var startingTimes = [SKNode:NSTimeInterval]() 

Затем магазин, когда спрайт начинает свою последовательность

sprite1.run(SKAction.sequence(sequence)) 
startingTimes[sprite1 as! SKNode] = currentTime 

Наконец, сортировать по startingTime

let sortedStartingTimes = startingTimes.sort(){ 
          (time1,time2)->Bool in 
          return time1 <= time2 
         } 

Тогда просто итерация го грубой словарь или захватить первый элемент, что бы вы ни делали здесь.

Это может быть заскочил в игровые площадки, чтобы проверить код выше:

var startingTimes = [String:NSTimeInterval]() 
startingTimes["A"] = 1 
startingTimes["C"] = 3 
startingTimes["B"] = 2 

let sortedStartingTimes = startingTimes.sort(){ 
    (time1,time2)->Bool in 
    return time1 <= time2 
} 
print("start") 
for time in startingTimes 
{ 
    print(time) 
} 
print("sort") 
for time in sortedStartingTimes 
{ 
    print(time) 
} 

Чтобы получить процент выполнения является немного более сложным. Вам нужно взять currentTime - startTime, а затем выяснить, на основе этого, где вы находитесь в своем спрайте.

Итак, у меня есть всего 3 шага, каждый 1 секунда.

My currentTime - StartingTime 1,5 секунды.

var deltaTime = currentTime - startingTime 

Я беру 1,5 - шаг 1 раз, поэтому результат .5 секунд

deltaTime -= step1Time 

DeltaTime> 0, я в новом шаге

Я принимаю .5 - шаг 2 раз , поэтому результат .5 секунд

deltaTime -= step2Time 

< DeltaTime = 0 Я в этом шаге

так DeltaTime/step2time, что мой процент в step2 сроки

let completionPercentage = deltaTime/step2Time 
1

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

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