Анимация SCNNode навсегда – SceneKit, Swift

Я хочу оживить 2 куба навсегда, пока пользователь не ударит один из них. Предполагается, что анимация будет похожа на ∞.

Это мои кубы в sceneView, которые я хочу оживить: кубы для анимации

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

Прежде чем продолжить разработку ∞-анимации, я хотел бы знать, есть ли лучший (и фактически рабочий) способ. Это мой текущий код:

SCNTransaction.begin() SCNTransaction.setAnimationDuration(2) cube1.position = SCNVector3Make(3, 0, 0) cube2.position = SCNVector3Make(-3, 0, 0) println("log 0") SCNTransaction.setCompletionBlock { println("log 1") while (animationKey != 1) { //initially animationKey = 0 SCNTransaction.begin() SCNTransaction.setAnimationDuration(2) cube1.position.x += 1 cube1.position.y += 1 cube2.position.x += 1 cube2.position.y += 1 println("log 2") SCNTransaction.setCompletionBlock { SCNTransaction.begin() SCNTransaction.setAnimationDuration(2) cube1.position.x -= 1 cube1.position.y -= 1 cube2.position.x -= 1 cube2.position.y -= 1 println("log 3") SCNTransaction.setCompletionBlock { animationKey = 1 } SCNTransaction.commit() } println("log 4") SCNTransaction.commit() } } println("log 5") SCNTransaction.commit() println("log 6") } 

Вывод показывает следующие вещи: log 0, log 5, log 6, log 1, log 2, log 4, log 2 … и затем он просто продолжается с чередованием log 4 и log 2 .

Может ли кто-нибудь мне помочь?

Заметка

  • Я думал, что рекурсивный подход будет лучше, поэтому я заменил animationKey = 1 на вызов метода, в котором он находится … больше не работал.

  • Я получил анимацию для работы один раз, но теперь она просто останавливается после завершения самой первой анимации и полностью игнорирует второй и третий фрагменты анимации …

Если вы собираетесь анимировать SCNNode , ваши узлы будут запускать SCNAction .

Swift:

 let moveUp = SCNAction.moveBy(x: 0, y: 1, z: 0, duration: 1) moveUp.timingMode = .easeInEaseOut; let moveDown = SCNAction.moveBy(x: 0, y: -1, z: 0, duration: 1) moveDown.timingMode = .easeInEaseOut; let moveSequence = SCNAction.sequence([moveUp,moveDown]) let moveLoop = SCNAction.repeatForever(moveSequence) myNode.runAction(moveLoop) 

Objective-C:

 SCNAction *moveUp = [SCNAction moveByX:0 Y:1 Z:0 duration:1]; moveUp.timingMode = SCNActionTimingModeEaseInEaseOut; SCNAction *moveDown = [SCNAction moveByX:0 Y:-1 Z:0 duration:1]; moveDown.timingMode = SCNActionTimingModeEaseInEaseOut; SCNAction *moveSequence = [SCNAction sequence:@[moveUp,moveDown]]; SCNAction *moveLoop = [SCNAction repeatActionForever:moveSequence]; [myNode runAction:moveLoop]; 

Приведенный выше код будет анимировать myNode вверх и вниз навсегда.

вы можете создать анимацию CAKeyframeAnimation из пути Безье (см. свойство path ). Таким образом, вы получите очень гладкую анимацию.

Чтобы он повторял навсегда, установите для HUGE_VALF repeatCount значение HUGE_VALF , и вы можете настроить скорость, используя свойство timingFunction .

  • collectionView необязательный в UICollectionViewController
  • Градиентная анимация - Замедление и ускорение
  • Как создать расширяемый заголовок UITableView?
  • Как создать GMSMarker с комбинированными изображениями в Swift
  • Swift 3 - Отрегулируйте размер шрифта, чтобы установить ширину, несколько строк
  • Сегодня виджет в iOS 10 не расширяется
  • Как добавить PageControl внутри UICollectionView Image Scrolling
  • Эквивалент шины событий в iOS
  • как изменить цвет фона UIStackView?
  • Уникальные значения массива в swift
  • Поддержка Realm для Swift 3.0
  • Interesting Posts

    Путь Безье с динамическим изменением ширины

    Как кэшировать аудио в локальном режиме при воспроизведении аудио с помощью avplayer

    Запись в AAC из RemoteIO: данные записываются, но файлы не воспроизводятся

    Не позволяйте сафари iOS перемещать окно веб-страницы, так что может произойти событие перетаскивания

    Изменения панели вкладок iOs7

    Настройка панели состояния iOS JASidePanel

    Как достичь промежутка между страницами в UICollectionView?

    Ошибка кодового знака в macOS Sierra, Xcode 8

    Исправлено ли отклонение метаданных приложения ios – это двоичный файл

    Внутреннее позиционирование на iOS с Core Location – неточно?

    Каков наилучший формат использования изображений (png, jpg) в iOS?

    Каков наиболее безопасный способ шифрования данных в постоянном хранилище iphone / ipad?

    Поддерживается ли поддержка iPhone 5 * необходимо * для отправки приложения?

    Как выбрать строку таблицы во время длительного нажатия в Swift

    wsdl2objc: Файл libxml / tree.h не найден

    Давайте будем гением компьютера.