Intereting Posts
Производительность прокрутки UITableView как использовать AQRecorder из примера Как приложение Uber iOS обновляет пользовательский интерфейс приложения без нажатия на обновление до магазина приложений? Как печатать на быстрых терминалах? неперехваченное исключение «NSFileHandleOperationException» Не удалось архивировать приложение iOS после обновления до Xcode 7.3 Правильный способ доступа к супер в блоке завершения NSSortDescriptor с именем и фамилией или с именем или фамилией? Обнаружение удаленных уведомлений, когда приложение выходит на передний план Использование и ограничения использования атома Газеты iOS NSURLConnection didReceivedData более чем одна задача Как обрезать текст и добавить Ellipsis (…) при использовании drawInRect: на iOS 7? предотвратить создание нескольких dispatch_queue_create в viewDidLoad Панель навигации не отображается при представлении View? Dialer VOIP в iOS

Как преобразовать физику Sprite Kits в абсолютные значения точек?

Я работаю над вертикальной 2D-платформой для авто-перемычек. Генерация уровней осуществляется процедурно, используя шаблоны и адаптивную сложность. Игра будет выпущена на iOS / OS X и будет использоваться в рамках Sprite Kit Apples Sprite Kit .

Физика реализована с использованием собственного физического ядра Sprite Kit . Например, прыжки выполняются путем применения силы или изменения текущей скорости объекта игрока. Что-то вроде того:

 playerEntity.physicsComponent.velocity = CGVectorMake(playerEntity.physicsComponent.velocity.dx, 850.0) 

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

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

Один из способов заключается в том, чтобы вручную жестко закодировать несколько скачков. Гораздо более гибким способом было бы получить расстояние прыжка – или радиус прыжка и детали, такие как «воздушное время» и т. Д. – из физической системы.

К сожалению, в Sprite Kit нет реального точечного эквивалента единицы вектора силы.

Поэтому я спрашиваю, как преобразовать физику Sprite Kit в абсолютные значения точки. Мне нужна функция, которую я могу добавить, например, вектор силы, и который выводит мне радиус возможной области прыжка для игрока.

Если бы я понял, как работает физика Sprite Kit , например, «пиксель на кадр», но, я думаю, этого не существует !? Что-то вроде следующего:

 /// Returns a rectangle describing an oval area in absolute points func jumpRadius(withPhysicsBody body: SKPhysicsBody, andVector vector: CGVector) -> CGRect { // Compute area using physics body properties like mass, friction, etc. // Return it ... return ... } 

Филипп Дик, один из моих любимых авторов научной фантастики, в 1978 году написал статью « Как построить вселенную, которая не распространяется на два дня спустя» . Вот выдержка:

Реальность – это то, что, когда вы перестаете верить в нее, не исчезает.

Давайте посмотрим, как это связано с вашим вопросом и моим ответом.

Неправильный подход

Это короткий ответ на ваш вопрос. Если вы хотите преобразовать position своего Hero спрайта в систему просмотра, вы можете добавить следующее свойство

 class Hero: SKSpriteNode { var globalPosition: CGPoint? { guard let scene = self.scene else { return nil } let pointInScene = self.convertPoint(self.position, toNode: scene) return scene.convertPointToView(pointInScene) } } 

Почему это не сработает

Теперь, если ваша игра использует физику, вы играете в виртуальный мир физики, где расстояния измеряются в метрах, а не в точках, а не в пикселях.

Точка и пиксели – это всего лишь способ представить на плоском экране гораздо более сложную реальность, которую вы имитируете внутри мира физики. Визуальное представление должно зависеть от мира физики, но то, что происходит в физическом мире, должно быть совершенно агностическим в отношении визуального представления. И что самое главное не должно быть затронуто этим.

В противном случае в тот момент, когда вы измените способ, которым сцена соответствует экрану устройства, скажем, заменив это

 scene.scaleMode = .AspectFill 

с этим

 scene.scaleMode = .AspectFit 

в ваш GameViewController вы попадаете в серьезные проблемы, потому что это меняет соотношение между точками и метрами (я уверен, что мы сможем найти больше таких примеров).

Правильный подход

То, что я предлагаю, – это ваш расчет в метрах и в вашем физическом мире . Он должен работать, даже когда никто не смотрит на него (а именно, когда графического представления вообще нет).