2016-04-25 10 views
0

Я написал игру в SpriteKit, используя объектив C, и отлично работает на ios9, но он выглядит отвратительным на ios8. Я действительно хотел бы знать, как исправить эту проблему, либо путем «исправления» моей ошибки, либо если я не ошибаюсь, найдя обходной путь для ошибки в ios8.SKSceneScaleModeResizeFill на весах ios8 неадекватно

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

Если вы хотите попробовать проект Xcode, вот ссылка на него .... xcode project

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

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

ПОЖАЛУЙСТА, ПОМНИТЕ: Мой код отлично работает на iOS9.3. Таким образом, мой код, очевидно, не является полным масштабом. Но, по общему признанию, я не специалист по обработке вращения экрана, поэтому, вероятно, мой код может быть лучше.

Возможно, я должен упомянуть, что обе сцены имеют режим масштабирования, установленный в SKSceneScaleModeResizeFill. Я выбрал этот режим, потому что при работе с SKSceneScaleModeAspectFill у меня была огромная трудность делать правильные макеты для всех возможных размеров экрана (включая iPhone). Надеюсь, я смогу решить эту проблему, придерживаясь SKSceneScaleModeResizeFill.

В любом случае, мое приложение является игрой SpriteKit с двумя сценами. Основная сцена - GameScene, где вы играете в игру. И эта сцена имеет указатель на SettingsScene, где вы можете изменить настройки сцены. (например, изменить уровень сложности).

В любое время, когда пользователь поворачивает экран, GameViewController обнаруживает это изменение в viewWillTransitionToSize и сообщает объекту GameScene о новой ширине экрана и высоте экрана. Затем Game Scene корректирует положения своих спрайтов с учетом новой ориентации экрана, а затем сообщает свой объект SettingsScene о новой ширине и высоте экрана так, что сценарий настроек также правильно выкладывается.

Пожалуйста, обратите внимание, что с этим проектом, все спрайты на обеих сценах получить приложена в любое время пользователь вращает экран НЕЗАВИСИМО которого сцена на самом деле активны в то время ..

Как я уже говорил, все работы, как и ожидалось на ios9.3. Но на ios8 результат является сокрушительным. Скриншоты иллюстрируют один пример типичного опыта работы на ios8. Если пользователь поворачивает экран во время игры, а затем переходит на экран настроек, он увидит что-то ужасное. И часто будет в ловушке этого ужасного опыта, потому что кнопка для возвращения в главную игру может даже не подходить на экран больше.

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

Итак, что здесь не так?

Любые предложения были бы весьма высоко оценены.

Спасибо!

-j

p.s. В случае, если вы не хотите напрямую смотреть на связанный файл проекта, вот некоторые подробности о примере кода. GameViewController реализует viewTransitionToSize для обработки любого поворота экрана. Он напрямую сообщает новым параметрам экрана GameScene, который затем сообщает SettingsScene. Обе сцены перестраивают их спрайты с учетом новых размеров экрана. И все идет хорошо на ios9. Однако на ios8 неактивная сцена заканчивается тем, что выглядит скрытно, когда она представлена, хотя она явно переделала свои спрайты в соответствии с новыми измерениями.

enter image description here

+0

Вы тестируете на тренажере? В симуляторах iOS 8 есть ошибка, при которой событие поворота не срабатывает (но симулятор вращается), проверяйте его на аппаратном обеспечении, чтобы убедиться, что ошибка не существует – Knight0fDragon

+0

Спасибо, но да. Я впервые заметил проблему с оборудованием. Мое устройство - iPad с ios 8.4. Спасибо, в любом случае, за ваше интересное предложение. –

+0

ну, тогда ошибка может существовать в рамках, а не только симуляторе. Сделайте печать в своем контроллере вида на функции 'didRotateFromInterfaceOrientation', чтобы убедиться, что она называется – Knight0fDragon

ответ

0

проблема легко решается с помощью этих линий ....

gameScene.size = newScreenSize; 
    settingsScene.size = newScreenSize; 

в любое время изменения ориентации.

Этот код не требуется для ios9. Сцена знает, какой размер экрана без помощи. Но для ios8, кажется, необходимо добавить этот код.