Intereting Posts
удалить жест для UIButton UISwitch между режимами радиана и градусов для Swift Calculator Вперед UIAlertView нажмите на другой cotroller Что это за код вызова веб-службы, что происходит точно? UIPickerView, поскольку inputView UITextField устанавливает первое значение UITableView NSInternalInconsistencyException Ошибка брошена; Две анимации для одной ячейки NSLayoutConstraint «Невозможно одновременно удовлетворить ограничения» Ошибки и способы их интерпретации Интеграция с Sharekit Twitter сработала в iOS 5 Titanium Appcelerator через корпоративный прокси-сервер iOS – проверить, что все объекты пользовательского интерфейса имеют метку / идентификатор доступности? Получите высоту баннера iAd программно в Swift? Ограничение ширины полной ширины в автоматическом макете для ios 8 (работает в ios 7) didSelectRowAtIndexPath не вызывается, когда ячейка выбрана в режиме редактирования Images.xcassets перестали работать после проекта Xcode. Чистая папка сборки – iOS. ResideMenu: боковое меню для iOS 7 для поддержки как левого, так и правого меню

Как преобразовать физику 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 вы попадаете в серьезные проблемы, потому что это меняет соотношение между точками и метрами (я уверен, что мы сможем найти больше таких примеров).

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

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