Как мне создать HUD поверх моего Scenekit.scene

Я экспериментирую со Swift и Scenekit. Создание приложения для Mac OS X. Кажется, довольно легко заставить работать 3D-сцену. Но что за сцена без какого-нибудь 2D-приветствия, дисплея радара, индикатора скорости и т.д.? Я бы ожидал, что сцена SpriteKit будет легко интегрироваться в SceneView, но я не нахожу документацию очень ясной по этому поводу.

Самый очевидный и единственный способ, который я могу придумать, — это разместить SKView над SceneView и визуализировать каждый отдельно. Но есть ли более элегантный способ?


person Ghis    schedule 25.06.2014    source источник
comment
Посмотрите на образец кода из WWDC 14. Он отображает HUD с использованием Sprite Kit поверх Scene Kit.   -  person David Rönnqvist    schedule 26.06.2014


Ответы (4)


пытаться

scnView.overlaySKScene = aSKScene;

(см. SCNSceneRenderer.h) Это рекомендуемый способ. Альтернативный способ — сделать слой SCNView резервным и добавить дочерние представления или слои (но это менее эффективно).

person Toyos    schedule 25.06.2014
comment
+1 :) Дополнительную информацию можно найти в в документах и в Бананы и Транспортное средство примеры проектов кода. Еще одним преимуществом оверлеев SK является то, что вы можете сделать свой HUD кроссплатформенным вместо использования UIKit на iOS и AppKit на OS X. - person rickster; 26.06.2014
comment
Я проверил пример проекта Bananas. Это не работает. Можете ли вы запустить код на 10.9.3? Есть ли у Swift эквивалент «overlaySKScene»? - person Ghis; 30.06.2014
comment
Интеграция SceneKit/SpriteKit — это функция версии 10.10, как и некоторые другие функции, которые вы видите в Bananas. Однако у этого проекта есть цель для iOS, поэтому вы также можете попробовать запустить его на бета-устройстве iOS 8. - person rickster; 15.07.2014

Чтобы создать HUD, сделайте что-то вроде следующего:

// SKContainerOverlay is a class which inherits from SKScene

    SKContainerOverlay *skContainerOverlay = [[SKContainerOverlay alloc] initWithSize:self.sceneView.bounds.size];
    self.sceneView.overlaySKScene = skContainerOverlay;
    self.sceneView.overlaySKScene.hidden = NO;
    self.sceneView.overlaySKScene.scaleMode = SKSceneScaleModeResizeFill; // Make sure SKScene bounds are the same as our SCNScene
    self.sceneView.overlaySKScene.userInteractionEnabled = YES;

Вы можете создать все свои объекты SKLabelNode внутри пользовательского класса SKContainerOverlay.

person JaredH    schedule 03.02.2016
comment
Спасибо за реальный ответ, а не за ссылку на документацию или примеры приложений. - person Brainware; 30.06.2016

Как сказал @Toyos выше, вы можете использовать

scnView.overlaySKScene = aSKScene

чтобы наложить SKScene на ваш SCNView.

Однако, когда я попробовал это в Swift, я обнаружил, что свойство overlaySKScene становится видимым только в том случае, если вы включаете оператор import SpriteKit.

person lukem    schedule 15.07.2014

Как ответил @Toyos, сегодня просто использовать scnView.overlaySKScene. Если вам нужен пример, вы можете проверить, как это сделала Apple, в их демонстрация бананов.

person Pierre    schedule 26.06.2014