понедельник, 7 января 2013 г.

Основы. Статья 1. Иерархия сцены

Основы cocos2d. Статья 1: Иерархия сцены

Я начинаю цикл статей, посвященных основам движка cocos2d.
Этот цикл предназачен для начинающих - в рамках него мы узнаем все базовые понятия движка и подготовимся к более продвинутому изучению.

Каждый игровой движок устроен по-разному и оперирует различными понятиями и объектами.
Давайте узнаем, какие объекты являются базовыми для cocos2d и как они связаны между собой.

Иерархия сцены

Итак, поехали! :)
В cocos2d самым базовым объектом является узел (node) - это объект любого класса, наследуемого от встроенного в cocos2d класса CCNode.
Что такое узел? Узлом может быть что угодно - например, обыкновенная надпись на экране, реализуемая классом CCLabelTTF, является узлом.
Или текстура (класс CCSprite) - она тоже является узлом.

Узел может и не отражаться на экране - например, есть узлы CCLayer (слой) и CCScene (сцена), которые не имеют отображения.
Все типы узлов, существующие в cocos2d, мы рассмотрим чуть позже, на этом этапе главное - понимать, что основа всего - это узел.

А причем здесь иерархия сцены?
Начнем с того, что каждый узел может содержать в себе другие узлы (эти узлы мы будем называть "дочерними узлами").
В cocos2d принято считать, что для каждой сцены на экране у нас есть некоторый узел CCScene (сцена), который содержит в себе все остальные узлы.
Отсюда и происходит понятие "иерархия сцены"

Рассмотрим пример:
Перед вами - обычная игра. Казалось бы, где тут узлы?

Но давайте рассмотрим ее с точки зрения иерархии сцены.
На картинке показано, что весь экран у нас - это сцена (Scene).

Сцена содержит в себе три дочерних узла - Background Layer (фоновое изображение космоса), Game objects Layer (слой с игровыми объектами) и Virtual Joypad Layer (слой с виртуальным джойстиком).
В свою очередь, слой с игровыми объектами содержит в себе объект с нашим кораблем, с кораблями противника, изображениями выстрелов и т.д.

То есть, по сути, каждый объект в игре - это узел. Корабль игрока - это класс, который мы унаследуем от CCNode и в который добавим игровую логику, корабли противника - это тоже узлы (классы, унаследованные от CCNode), в которые мы опять же добавим некий искусственный интеллекстю

Как я упоминал выше, сцена (CCScene) и слой (CCLayer) не имеют отображения, но зато они являются контейнерами для других объектов (кораблей, космоса, джойстика и т.д.), которые как раз таки отображаются на экране.

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

Словом, все объекты в cocos2d - это узлы; узел может иметь отображение на экране или не иметь его; и каждый узел может содержать в себе другие узлы (как ни странно, можно взять узел с надписью и добавить в него в качестве дочерних узлов другие надписи - о том, как это будет выглядеть, я расскажу дальше).
Вот иерархия нашей сцены:

Все узлы на экране изначально позиционируются следующим образом:
То есть, центр узла Child 1 находится там же, где находится левый нижний угол его "родительского" элемента.
Если мы добавим в узел Child 1 дочерний элемент Child 2, то Child 2, по аналогии, будет иметь центр там, где левый нижний угол его родительского элемента Child 1.

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

А вот иерархия всех классов, существующих в cocos2d и наследуемых от класса CCNode:
Серым цветом выделены те классы, которые используются наиболее часто и на изучение которых мы сделаем упор.

В следующей статье мы поговорим об узлах более подробно.


Иллюстрации и примеры кода взяты из книги Learn cocos2d Game Development with iOS 5.
Посетите также блог автора книги ("Learn Cocos2d", Steffen Itterheim)

Комментариев нет:

Отправить комментарий