Единственная причина наличия CCScene в cocos2d состоит в том, что CCDirector требует его в качестве базового класса для таких методов, как runWithScene и replaceScene.Кроме того, CCScene, CCLayer и CCNode практически идентичны друг другу.
Вы можете назначить сцены, слои, узлы, спрайты и т. Д. На любую роль, какую захотите.
Но обычно Сцена принимает на себя роль диспетчера состояний текущих активных игровых объектов (узлов),Обычный вариант использования - объявить сцену синглтоном, чтобы любой дочерний узел мог получить доступ к базовым методам сцены, например, для отправки сообщений другим несвязанным узлам или для проверки завершения игры и т. Д.
Для распространения событий я поддерживаю передачу событий вниз, поскольку нет простого способа передачи событий, как в UIKit.Однако это зависит от того, какие события и какой тип дизайна вы предпочитаете.
Отправляет ли Санта сообщение Рудольфу, чтобы его накормить, или Рудольф часто спрашивает Санту, есть ли у него что-нибудь поесть, такжевам решать.У обоих подходов есть свои плюсы и минусы.
Причина, по которой во многих примерах создается экземпляр объекта CCScene внутри класса CCLayer, заключается просто в том, что Cocos2D требует наличия сцены.Лично я считаю, что это плохой пример плохого примера, который стал стандартом де-факто за эти годы.Было бы лучше всегда создавать класс CCScene, а внутри него создавать все слои и другие нужные вам узлы.Это сделало бы связь между сценами и слоями и другими узлами более очевидной.На самом деле, существует много проектов, класс сцены которых просто делает только один слой, который выполняет весь код.