Ответ 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 здесь.