Подтвердить что ты не робот

Работа с различными разрешениями устройств iOS в SpriteKit

Я играю с SpriteKit в Xcode 6, iOS 8 beta 5. Все все выложено и отлично работает на симуляторе iPhone 4S, однако при переключении на 5S элементы в нижней части экрана вырезаются выкл.

По моему мнению, нижний левый угол экрана iPhone должен быть CGPoint (0, 0), но после проверки местоположения, напечатав координаты на консоли, чтобы самая низкая точка левого угла я мог щелкнуть (5, 44). Что-то не так в моей настройке сцены, которая вызывает это?

В файл GameViewController не внесены изменения, и даже после того, как я удалил файл GameScene, проблема не устранена.

Может ли кто-нибудь хотя бы указать мне в правильном направлении?

4b9b3361

Ответ 1

Добавление следующего кода устранит вашу проблему (код находится в Swift):

scene.scaleMode = SKSceneScaleMode.ResizeFill

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

Есть три вещи, которые могут повлиять на положение узлов в вашей сцене.

1) Якорная точка
Убедитесь, что точка привязки сцены установлена ​​на (0,0) внизу слева. По умолчанию точка привязки сцены начинается с (0,0), поэтому я предполагаю, что это не вызывает проблемы.

2) Размер
Проверьте размер вашей сцены. Обычно размер моей сцены соответствует размеру устройства (т.е. IPad, iPhone 4 дюйма, iPhone 3,5 дюйма), затем я помещаю еще один слой в сцену для хранения моих узлов. Это делает меня способным прокручивать эффект для устройств с меньшим разрешением, но это зависит от вашей игры. Я предполагаю, что размер вашей сцены может быть установлен на 320, 480, что может вызвать проблемы с позиционированием на вашем iPhone 5s.

3) Масштабный режим
Масштабный режим оказывает огромное влияние на позиционирование узлов в вашей сцене. Удостоверьтесь, что вы устанавливаете режим масштабирования на то, что имеет смысл для вашей игры. Режим масштабирования срабатывает, когда размер сцены не соответствует размеру представления. Таким образом, цель режима масштабирования - позволить Sprite Kit знать, как справиться с этой ситуацией. Я предполагаю, что размер сцены установлен на 320,480, а сцена масштабируется в соответствии с видом iPhone 5, что приведет к проблемам с позиционированием, идентичным тем, что вы описали. Ниже приведены различные режимы масштаба, которые вы можете установить для своей сцены.

SKSceneScaleMode.AspectFill

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


SKSceneScaleMode.AspectFit

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


SKSceneScaleMode.Fill

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


SKSceneScaleMode.ResizeFill

Сцена не масштабируется в соответствии с представлением. Вместо этого сцена автоматически изменить размер, чтобы его размеры всегда соответствовали размерам вид.


Заключение
Похоже, вы хотите удалить масштаб вашей сцены, таким образом ваши позиции в сцене будут соответствовать фактическим позициям в представлении. Вы можете установить размер сцены в соответствии с размером представления, и в этом случае масштабирование не произойдет. Или вы можете установить режим масштаба сцены в ResizeFill, который всегда сделает размер сцены соответствующим вашему размеру вида, и он ничего не будет масштабировать. В общем, я бы держался подальше от любого масштабирования и вместо этого настраивал интерфейс и размер сцены для наилучшего соответствия каждому устройству. Вы также можете добавить масштабирование и/или прокрутку, чтобы позволить устройствам с меньшими разрешениями достичь одного и того же поля обзора.


Но что, если я хочу масштабировать свою сцену?
Если вам нужно масштабировать сцену, но вы по-прежнему хотите, чтобы позиции были относительно вида (т.е. Вы хотите (0,0) быть в нижней левой части экрана, даже когда обрезание сцены), тогда см. Мой ответ здесь


Дополнительная информация
См. Ответ здесь для примера кода, показывающего, как я динамически размещаю узлы.

Подробнее о масштабировании для поддержки нескольких устройств см. answer здесь.

Ответ 2

Если вы хотите сохранить размер вашей сцены (как правило, желательно при работе с фиксированным размером и системой координат), вы можете добавить дополнение к любой стороне вашей сцены. Это удалит буксовую бокс и сохранит всю физику и динамику вашего приложения на любой платформе.

Я создал небольшую Framework, чтобы помочь с этим:

https://github.com/Tokuriku/tokuriku-framework-stash

Просто:

  • Загрузите ZIP файл для репозитория
  • Откройте подпапку "SceneSizer"
  • Перетащите SceneSizer.framework "lego block" в ваш проект.
  • Убедитесь, что Framework в Embedded, а не только Linked
  • Импортируйте Framework где-нибудь в свой код import SceneSizer

И вы закончили, теперь вы можете вызвать класс sizer с: SceneSizer.calculateSceneSize(#initialSize: CGSize, desiredWidth: CGFloat, desiredHeight: CGFloat) -> CGSize

Ответ 3

На всякий случай, попробуйте сделать CMD + 1, работал у меня. Некоторые из элементов были отрезаны, потому что они просто не отображались в Simulator - я подчеркиваю это, это просто функция симулятора (и ошибка, если вы спросите меня, потратила время на то, чтобы решить эту проблему). CMD + 2, CMD + 3 могут иногда скрывать части сцены.