Прокручивающееся меню iOS Spritekit

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

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

Мое следующее решение — добавить один пункт меню в поле зрения камеры, один слева и один справа. Затем при смахивании правильный элемент перемещался в поле зрения моей камеры через SKAction, а исходный элемент удалялся. Затем я удалял дочерний узел, самый дальний от камеры, и добавлял следующий элемент в сцену в направлении, в котором я провел пальцем. Таким образом, мой диапазон x (в пунктах) будет только от -displayWidth до displayWidth. Проблема в том, что мне нужно было бы анимировать все пункты меню одновременно, и поскольку они являются отдельными узлами, я не видел способа синхронизировать их анимацию.

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

Есть ли какая-нибудь жизнеспособная стратегия, которую мне здесь не хватает?


person slugz    schedule 02.08.2018    source источник


Ответы (2)


Поскольку это всего лишь меню, можно быть немного неэффективным.

Что вы делаете, так это клонируете свое меню 2 раза (всего у вас есть 3). Вы размещаете одного из клонов слева, а другого справа.

Затем вы добавляете все 3 из них в родительский SKNode. Теперь у вас должен быть один SKNode с тремя пунктами меню в длинной строке. Убедитесь, что ваша точка привязки (0.5,0.5)

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

Допустим, наше меню имеет ширину 400 (-199 200) точек, а наш экран имеет ширину 300 точек (-149 150). Как только родительская точка -200 (пункт меню 200 или правая часть меню) совпадет с точкой экрана -150, вы переместите родительскую точку на 200 (таким образом, точка меню будет -200 или левая часть меню).

Поскольку вы перемещаете родительский узел, все клоны последуют его примеру, и вам нужно будет выполнить только одно действие.

person Knight0fDragon    schedule 02.08.2018
comment
Я не уверен, что полностью понимаю - просто чтобы уточнить каждый элемент меню, который я создаю, он занимает весь экран. Все пункты моего меню хранятся в двусвязной структуре данных списка, которая также является круговой. Вы предлагаете разместить Node.previous слева, текущий Node в центре и Node.next справа? Или что я помещаю КАЖДЫЙ элемент связанного списка один раз слева, один раз в центре и один раз справа? Мне кажется, я понимаю концепцию добавления всего в SKNode, а затем использования одного SKAction для его перемещения. - person slugz; 03.08.2018
comment
@slugz я не знаю, почему у вас есть связанный список, так что понятия не имею - person Knight0fDragon; 03.08.2018
comment
Это меню магазина, которое я пытаюсь сделать. Я создал структуру связанного списка, где node.value является объектом моего класса StoreItem. Из-за того, что каждый элемент магазина занимает весь размер экрана, и пользователю приходится проводить по экрану, чтобы перемещаться между элементами, я решил использовать круговой связанный список, чтобы при смахивании я мог использовать scene.addchild(node.next или node. предыдущее) в зависимости от направления смахивания, а затем вывести его для просмотра с помощью SKAction. Я пытаюсь использовать этот метод добавления/удаления со сцены по мере необходимости для повышения производительности. - person slugz; 03.08.2018

Я рекомендую использовать UIKit для создания такого меню вместо SpriteKit. UICollectionView должно подойти для такой задачи.

person Max Gribov    schedule 02.08.2018
comment
Если вы собираетесь утверждать, что используете другие технологии, то вам нужно быть более подробным в своих ответах. Этот ответ на самом деле не помогает пользователю и должен быть комментарием. - person Knight0fDragon; 02.08.2018