среда, 27 февраля 2013 г.

Основы cocos2d. Статья 7. Надписи и меню


Основы cocos2d. Статья 7. Работа с надписями CCLabelTTF и меню CCMenuItem


Всем привет!
Уфф, значительный выдался перерыв.
И тем не менее, мы продолжаем.
Сегодня мы познакомимся с надписями и менюшками :)

Надписи CCLabelTTF

Если нам необходимо написать какой-то текст на экране, то надписи - это наш выбор.
Вот пример создания надписи:
CCLabelTTF *label = [CCLabelTTF labelWithString:@"text" fontName:@"AppleGothic" fontSize:32];

Технически, надпись рендерится на CCTexture2D-текстуре и перерисовывается всякий раз, когда меняется текст, а поскольку пересоздание текстуры для надписи - процесс медленный, то лучше не менять текст слишком часто, уж точно не в каждом кадре.
Кстати, для смены текста используется вызов:
[label setString:@"new text"];

Кстати, текст выравнивается по центру, это происходит за счет того, что по умолчанию anchor point (якорь, мы говорили о них в прошлых уроках) установлен в позицию 0.5, 0.5.
Передвигая якорь, мы можем выравнивать текст по левому краю, по правому краю, по верху, низу.
Вот примеры:
label.anchorPoint = CGPointMake(1, 0.5f);//по правому краю
label.anchorPoint = CGPointMake(0, 0.5f);//по левому краю
label.anchorPoint = CGPointMake(0.5, 1);//по верху
label.anchorPoint = CGPointMake(0.5f, 0);//по низу
//пример использования в сцене
CGSize size = [[CCDirector sharedDirector] winSize];//запрашиваем размер экрана у режиссера
label.position = CGPointMake(winSize.width, winSize.height);//размещаем надпись в верхнем 
//правом углу
label.anchorPoint = CGPointMake(1,1);//теперь надпись будет выравнена по правому краю и 
//при увеличении количества текста, она будет "уходить" влево и вниз


Меню CCMenu

Когда вам необходима кнопка, которую пользователь будет жать для перехода на следующий уровень или использовать для включения-выключения настроек - вот тогда вам и понадобится меню.
Меню (CCMenu) - это тот же слой CCLayer, но он может принимать в себя только объекты меню CCMenuItem.
Вот иерархия объектов CCMenuItem:

Вот пример кода для создания меню:
CGSize size = [CCDirector sharedDirector].winSize;
// устанавливаем значения по умолчанию для CCMenuItemFont
[CCMenuItemFont setFontName:@"Helvetica-BoldOblique"];//название шрифта
[CCMenuItemFont setFontSize:26];//размер шрифта
// создадим несколько надписей с текстом и селектором
CCMenuItemFont* item1 = [CCMenuItemFont itemWithString:@"Go Back!"
                           target:self
                         selector:@selector(menuItem1Touched:)];

// создадим пункт меню, используя спрайт
CCSprite* normal = [CCSprite spriteWithFile:@"Icon.png"]; normal.color = ccRED; CCSprite* selected = [CCSprite spriteWithFile:@"Icon.png"]; selected.color = ccGREEN; CCMenuItemSprite* item2 = [CCMenuItemSprite itemWithNormalSprite:normal
                         selectedSprite:selected
 target:self selector:@selector(menuItem2Touched:)];

// создадим переключатель с двумя другими пунктами меню (переключатель работает и
// с изображениями
// переключатель - это элемент с несколькими состояниями, меняющимися по нажатию
[CCMenuItemFont setFontName:@"STHeitiJ-Light"];
[CCMenuItemFont setFontSize:18];
CCMenuItemFont* toggleOn = [CCMenuItemFont itemWithString:@"I'm ON!"];
CCMenuItemFont* toggleOff = [CCMenuItemFont itemWithString:@"I'm OFF!"];
CCMenuItemToggle* item3 = [CCMenuItemToggle itemWithTarget:self
 selector:@selector(menuItem3Touched:) items:toggleOn, toggleOff, nil];
//создадим меню, используя все созданные ранее элементы
CCMenu* menu = [CCMenu menuWithItems:item1, item2, item3, nil];
menu.position = CGPointMake(size.width/2, size.height/2);
[self addChild:menu];
// вертикальное выравнивание важно, чтобы элементы не занимали одинаковую
// позицию на экране
[menu alignItemsVerticallyWithPadding:40];
Уфф.. Немало кода, верно?
Но - что поделать - это все-таки меню! Вручную, без cocos2d, создавать все то же самое было бы на порядок сложнее и дольше.
Во-первых, обратите внимание, что когда мы создавали CCMenu, мы перечислили список элементов item1, item2, item3 и закончили его элементом nil - это важное техническое требование и если вы забудете передать nil последним элементом - в какой-то момент ваше приложение упадет.
Теперь давайте разберем, какие менюшки мы использовали.
Сначала мы создали пункт меню на основе CCMenuItemFont - этот тип меню просто отображает строку. Мы добавили селектор, так что при нажатии на это меню вызывается метод menuItem1Touched.
Внутри cocos2d, этот пункт меню просто создает CCLabel. Если у вас уже есть надпись, вы можете использовать ее вместо этого с классом CCMenuItemLabel.
Аналогично, мы создали два пункта меню - одно CCMenuItemImage, которое на самом деле создает CCSprite с изображением из файла и использует его. Меню CCMenuItemSprite использует уже готовый спрайт, что, как мне кажется, удобнее - вы можете использовать существующее изображение и просто подсвечивать его цветом для эффекта выделения.
CCMenuItemToggle (переключатель) принимает два (ровно) элемента, происходящих от CCMenuItem, и по нажатию, отображает то один, то другой. То есть сначала отображается первый элемент, если нажать его - он скроется и вместо него появится второй. И т.д. Можно использовать или надписи, или изображения в нашем переключателе.
Ну и наконец мы создаем CCMenu и позиционируем его по центру. Все пункты меню CCMenuItem являются "детьми" меню, т.к. содержатся внутри него, а значит, как мы помним из рассказов о CCLayer, они позиционируются относительно нашего меню.
Чтобы они все не наложились друг на друга, мы и добавили последнюю строчку, которая выравнивает все пункты вертикально с расстоянием между ними. У меню есть и другие align-методы для выравнивания.
Меню - это CCNode с элементами, поэтому технически можно улучшить его, делать скроллинги и т.д. Я постараюсь в будущих уроках показать более продвинутые фишки для работы с меню.
Ну а вот что получится, если запустить приложение с нашим меню:
Спасибо за внимание!
Надеюсь, урок понравился!
Пожелайте не задержаться со следующим ;)) 
Удачи!

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

вторник, 12 февраля 2013 г.

Переходим на cocos2d 2.0

Всем привет!
Да, извиняюсь, что давно не писал сюда - очень затянули текущие проекты)
И все-таки, надо продолжать начатое.

Устанавливаем cocos2d 2.0 и Kobold2d


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

Обновление блога

Всем привет!

Извиняюсь, что долгое время не было постов.
Дело в том, что мне сейчас попалась новая редакция книги про Cocos2d, которая основана на cocos2d 2.0 - новой версии cocos2d, основанной на OpenGL ES 2.0, поэтому я решил, что имеет смысл обновить те части блога, которые устарели.

Концепции cocos2d, безусловно, останутся теми же самыми, так что все то, что относится к теории про CCLayer, CCNode, CCScene, CCDirector и так далее - все остается в силе :)
Скоро выложу пост на тему того, что именно пришлось обновить.

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

Основы. Статья 6. Работа с акселерометром в cocos2d. Спрайты в cocos2d

Основы cocos2d. Статья 6. Работа с акселерометром в cocos2d. Спрайты в cocos2d

Привет!
После небольшого перерыва - продолжаем ;)
В этой статье мы закончим узнавать об основах CCLayer, изучив последний аспект - ввод данных через акселерометр. Затем мы познакомимся с классом спрайтов CCSprite.

четверг, 10 января 2013 г.

Основы. Статья 5. Работа со слоями и касаниями в cocos2d

Основы cocos2d. Статья 5. Работа со слоями и касаниями в cocos2d

Итак, к этому моменту мы изучили сцены и работу с ними.
Как мы помним, каждая сцена состоит из "слоев", в которых располагаются конкретные игровые объекты и, соответственно, игровая логика.
Сам слой - это узел, который умеет принимать от устройства данные о касаниях пользователя и показания акселерометра.
Предлагаю узнать больше о слоях в этой статье.

среда, 9 января 2013 г.

Основы. Статья 4. Сцены и анимации перехода

Основы cocos2d. Статья 4. Сцены и анимации перехода

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

В этой статье - узнаем еще больше ;)

вторник, 8 января 2013 г.

Основы. Статья 3. Класс режиссера и работа со сценами

Основы cocos2d. Статья 3. Класс режиссера и работа со сценами

Итак, в прошлых статья мы говорили о CCNode - базовом для всех объектов в cocos2d, который олицетворяет "узел", являющийся контейнером для других узлов; обсудили CCScene - "узел", представляющий в иерархии сцену на экране; узнали о CCLayer - "слой", который содержит в себе другие узлы (как мы помним, слои объединяют узлы, а сцена объединяет слои).

Теперь настало время поговорить о другом мощном классе cocos2d - классе-"режиссере" :)
Да-да, он так и называется в переводе с английского - CCDirector!

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

Основы. Статья 2. Использование CCNode

Основы cocos2d. Статья 2. Использование CCNode

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

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

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

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

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

воскресенье, 6 января 2013 г.

Немного практики

Первое приложение

Наконец, мы готовы создать наше первое приложение!

О структуре базового проекта-2

Структура шаблона проекта Cocos2D. Часть 2

В прошлой части мы начали говорить о структуре шаблона проекта Cocos2D.
В этой части - продолжим.

О структуре базового проекта

Структура шаблона проекта cocos2d. Часть 1

В прошлом уроке мы создали наш первый проект и запустили его.
Теперь давайте поговорим о том, какова структура проекта, основанного на cocos2d.

Начало работы с cocos2d

Начало работы с cocos2d

Добрый день!
В этом посте мы установим cocos2d и создадим наше первое приложение.

Что такое cocos2d? Вводный урок.

Что такое cocos2d?

Добрый день!

Рад приветствовать вас в блоге, посвященном программированию игр для iPhone / iPad / iPod с использованием игрового движка cocos2d!

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