Обновление геометрии в SpriteKit (или SceneKit)

Мы переносим игру на SpriteKit, и у меня возникла небольшая проблема. К некоторым объектам в нашей игре прикреплены треугольные дорожки. Буферы вершин трасс постоянно обновляются по мере того, как объекты перемещаются в мире, чтобы создать цельный и плавный эффект (существуют ограничения на количество вершин в буфере и на то, как часто мы испускаем новые вершины).

В предыдущей реализации мы просто обновляли затронутые вершины в соответствующем буфере всякий раз, когда испускали новые вершины. В SceneKit кажется, что я не могу обновить источники геометрии, если я не использую geometrySourceWithBuffer:vertexFormat:semantic:vertexCount:dataOffset:dataStride:. Однако для этого мне нужно устройство Metal, очередь команд и кодировщик, чтобы иметь возможность отправлять команды для обновления моего буфера до его рендеринга.

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

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


person BarneyBear    schedule 07.01.2016    source источник


Ответы (1)


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

    emitter = SKEmitterNode()
    emitter.name = marbleNodeNames.trail.rawValue
    emitter.particleTexture = SKTexture(imageNamed: "spark")
    emitter.particleAlphaSpeed = -1.0
    emitter.particleLifetime = 2
    emitter.particleScale = 0.2
    marbleSprite.addChild(emitter)
person Hal Mueller    schedule 07.01.2016
comment
К сожалению, это не вариант, поскольку полоса имеет текстуру, придающую ей непрерывный вид. Мы используем эффекты частиц для других целей, но этот конкретный эффект нуждается в геометрии, чтобы выглядеть и вести себя правильно. Для справки см. imgur.com/QJvxM2H (не мое изображение). - person BarneyBear; 08.01.2016
comment
Можно ли добавить отдельные треугольники в качестве экземпляров SCNShape с нулевой глубиной экструзии? Возможно, подкласс SCNNode для добавления времени истечения срока действия, если вам нужно периодически удалять треугольники следа. Вы можете использовать вызовы SCNRendererDelegate для запуска поиска. - person Hal Mueller; 08.01.2016
comment
Я думаю, что на данный момент мы решим эту проблему, используя сцену SceneKit в качестве основы, используя оверлейную сцену SpriteKit для запуска реальной игры. Таким образом, мы можем получить металлическое устройство из SCNView. Я постараюсь ответить, как только у меня все заработает. Спасибо за предложения, хотя! - person BarneyBear; 08.01.2016