2016-11-28 2 views
2

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

Моя базовая архитектура использовать подвесную систему, чтобы представить Вселенную, у меня есть пустые случаи и случаи с системами/планеты/и т.д ... Моя сетка поддерживается GameplayKit GKGridGraph, я использую алгоритм, который генерирует узел с случайным свойства для каждого узла сетки и я подклассифицировал его для добавления к нему настраиваемого объекта, который обладает всеми свойствами этого конкретного случая универсума.

Чтобы сделать это, я просто использую SKShapeNode и SKPriteNode с различными цветами, формами и текстурами.

я перечисляю все узлы (GKGridGraphNode) в моем GKGridGraph, например, и для каждого из этих узлов, которые я получаю генерировать соответствующие SKNode (мои SKNode поколения является составной частью каждого GKGridGraphNode объекта прикрепленного объекта), и я поставил их позицию, и добавьте их в качестве дочернего элемента в мой основной узел (назовем его mapNode), который является простым SKNode. В итоге это выглядит как сетка.

Он хорошо работает для сетки 30/30, у меня есть 60 FPS при прокрутке моей сетки (пользовательская реализация, я изменяю свой mapNode positon, когда пользователь перемещает пальцы). Но как только я попробую сетку 50/50 или 100/100, у меня буквально слишком много узлов на экране, чтобы прокрутка работала. Я знаю, что не следует добавлять каждый из моего узла на экране, так что я думал о различных стратегиях, и я хотел некоторый вход на них:

  • Вместо прокрутку моего mapNode, я мог вынести только те узлы, которые я вижу на экране, а затем добавьте/удалите узлы, когда пользователь прокручивает влево/вправо/вверх/вниз. Так что это больше не прокрутка, она имитирует. Я могу подумать об этом, но на самом деле не так, как я должен реализовывать его на практике. Это правильное решение?

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

Edit: На самом деле, мой текущий код является открытым исходным кодом, вот сцена Я рендеринга: https://github.com/Dimillian/LittleOrion/blob/master/Little%20Orion/Little%20Orion/scenes/UniverseScene.swift

Есть ли другой умный способ сделать это?

+1

подтвердили, что это медленно с помощью реального устройства? – hamobi

+0

Да, 17 FPS на симуляторе, 40 FPS как статический узел на устройстве, но как только ваш старт перемещает ваш палец, он останавливается до менее 1 FPS, и вы не можете эффективно прокручивать его. – Dimillian

+1

Вы должны динамически загружать и выгружать данные в узлы набора спрайтов по мере прокрутки содержимого. Вы просто не можете загрузить все данные загодя, просто измените свой код, чтобы динамически проверить квадратное перекрытие, чтобы определить, какие узлы загружать и отображать. Это в основном то же самое, что и черепица, поэтому вам, скорее всего, захочется заглянуть в новую поддержку Tile в iOS 10 и построить на ней. – MoDJ

ответ

2

SKTileMapNode было сделано только для этого в Xcode 8 https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps

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

Я подозреваю, что алго будет включать проверку узлов, которые находятся в .frame' and then using 'addChild' on them--concurrently, add a reference to them to an array, which you would check against next обновлении вида (в) and removeFromParent`, если они уже не были видны .. Было бы получить волосатые пытаемся оптимизировать это, хотя. Целью было бы загрузить только несколько узлов на каждом конце, чтобы у вас был некоторый буфер при перемещении камеры (меньше обновлений).

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

Я рекомендую проскальзывать через книгу разработки игр Direct3d/DirectX/OpenGL, чтобы получить представление о том, что происходит во всем ... Их нетрудно найти: зайти в книжный магазин и искать самые толстые/тяжелые книга - это будет книга разработки игр DirectX.

Вы увидите, как то, что мы можем сделать с 30 линиями в SK, требует тысяч строк и векторных вычислений на C++ и низкоуровневых AV-инфраструктурах. Это даст вам оценку, понимание и перспективу игрового разработчика, который поможет вам в ваших путешествиях по SK :)

+1

У меня есть (очень) базовые знания о том, как работает бэкэнд, я сделал это хобби для изучения игр dev и игрового движка, поэтому с самого начала я знал, что добавление всех узлов на экране будет неэффективным (если только SK не сделал какой-то магии a la UITableView/UICollectionView), но я понимаю, что SKTilMapNode делает именно это: D. На самом деле у меня есть 1 книга OpenGL на моем столе, но если это все тарабарщина, я обожаю читать это :) Но да, кодирование игры VS, кодирующая движок, является средством для разговора для меня, у меня нет времени переходить на полный код низкого уровня, даже если бы я хотел бы :( – Dimillian

+0

наверняка, я только поднял его, потому что вы упомянули, что были новичком в игре dev;) И да, тарабарщина действительно! – Fluidity

+0

Да, я в любом случае новичок, новичок в этом, и дешево, потому что я взял «самый легкий» способ: D Но это очень забавно при разработке приложений, совсем другом образе мышления (я смотрю на вас цикл обновления). – Dimillian

Смежные вопросы