Mecho Wars - пошаговая стратегия для iPhone Quantum Collapse
Июн 14

В этом уроке речь пойдет о создании приложения Hello World для cocos2d. Тем, кто еще не выполнил установку и компиляцию cocos2d, стоит прочесть предыдущий урок.

Шаг 1

Командой “File->New Project” создайте новый проект.

Шаг 2

Выберите опцию “Window-Based Application“.

hellococos2dnewproject

Вариант “View-Based” нас сейчас не интересует, поскольку в данном примере нет необходимости в “UIView“. Опция “Utility Application” не подходит — проект не будет утилитой. Варианты “Navigation Based” и “Tab-Bar” отпадают — в примере будет только один раздел. И, наконец, от опции “OpenGS EL” отказываемся, поскольку выбор этого шаблона чреват большим количеством постороннего материала.

Присвойте проекту имя “HelloCocos“.

Шаг 3

Проект должен выглядеть примерно так, как показано ниже. Обратите внимание: мастер проекта уже создал ряд файлов, включая “HelloCocosAppDelegate.h“, “HelloCocosAppDelegate.m“, “Info.plist“, “main.m“, “MainWindow.xib“.

HelloCocosAppDelegate.m” — файл класса приложения. С этим классом нам и предстоит работать в данном примере.

hellococos2dprojscreen

 Если теперь выполнить “Build and Go“, результатом будет пустое приложение (белый экран). Попробуйте сделать это (”Build->Build and Run“).

Шаг 4

Откройте файл “HelloCocosAppDelegate.m“, добавьте #import “cocos2d.h” (см. фрагмент кода ниже). Тем самым мы включаем классы cocos2d в наш код.

Шаг 5

Отредактируйте метод “applicationDidFinishLaunching“, как показано ниже:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void) applicationDidFinishLaunching:(UIApplication*)application
{
// Инициализация окна
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

// привязываем cocos2d к окну
[[Director sharedDirector] attachInView:window];

Scene *scene = [Scene node];

Layer* layer=[Layer node];

CGSize s = [[Director sharedDirector] winSize];
Label* label = [Label labelWithString:@"Hello cocos2d" fontName:@"Arial" fontSize:32];
[layer addChild: label];
[label setPosition: cpv(s.width/2, s.height-50)];

[scene addChild: layer z:0];

[window makeKeyAndVisible];

[[Director sharedDirector] runWithScene: scene];
}

Данный код создает объект “Scene” (в строке “Scene* scene=[Scene node]“), затем объект “Layer“, добавляя к нему метку “Label“. В метке, вставленной в слой, находится текст “Hello cocos2d“. Последним шагом добавляем “Layer” к “Scene“.

Итоговая иерархия выглядит следующим образом:
Window” содержит “Scene“; “Scene” содержит “Layer“; “Layer” содержит “Label“.

sharedDirector” — отвечающий за дисплей global controller в Cocos2 . Пока он почти ничего не делает.

С кодированием пока закончили. Имейте в виду: в реальном приложении нужно всегда удалять созданные объекты, как, например, добавленные здесь “Scene” и “Layer“.

Шаг 6

Если теперь выполнить “Build“, появится целый букет ошибок:

Line Location HelloCocosAppDelegate.m:10: error: cocos2d.h: No such file or directory
Line Location HelloCocosAppDelegate.m:22: error: ‘Director’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:24: error: ’scene’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:24: error: ‘Scene’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:26: error: ‘layer’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:26: error: ‘Layer’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:29: error: ‘label’ undeclared (first use in this function)
Line Location HelloCocosAppDelegate.m:29: error: ‘Label’ undeclared (first use in this function)

Все потому, что не добавили путь доступа к заголовочным файлам cocos2d. Этим и займемся. (При желании можно опустить шаги 6 и 7, включив в проект исходные файлы Cocos2d , как описано ниже в разделе “Добавляем в проект исходный код Cocos2d“).

Шаг 7

Выполните “Project -> Edit Project Settings“.

Открыв вкладку “Build“, прокрутите меню вниз до “Header Search Paths“.

projectsettingsheadersearchpath

Двойным щелчком добавьте пути доступа. Нужно указать папку, куда был скопирован пакет cocos2d SDK, например, “Library/cocos2d-iphone-0.7.1/“. Подсказываю: в имя папки не нужно включать “cocos2d“, зато обязательно необходимо установить флажок “Recursive“. Чтобы не набирать текст самостоятельно, воспользуйтесь Finder и перетащите папку в диалоговое окно.

headersearchpaths

Шаг 8

Выполните компиляцию заново. Ошибки станут другими:

“.objc_class_name_Scene”, referenced from:
literal-pointer@__OBJC@__cls_refs@Scene in HelloCocosAppDelegate.o
“.objc_class_name_Director”, referenced from:
literal-pointer@__OBJC@__cls_refs@Director in HelloCocosAppDelegate.o
“.objc_class_name_Label”, referenced from:
literal-pointer@__OBJC@__cls_refs@Label in HelloCocosAppDelegate.o
“.objc_class_name_Layer”, referenced from:
literal-pointer@__OBJC@__cls_refs@Layer in HelloCocosAppDelegate.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Теперь они вызваны отсутствием связей с библиотекой Cocos2d: при компиляции отсутствуют данные о местонахождении объектов “Layer“, “Label“, “Director” и “Scenes“. Чтобы исправить этот момент, разверните меню группы “Targets“, потом — “HelloCocos“, после чего откройте контекстное меню для “Link Binary With Libraries“. Выполните “Add->Existing Files“. Выберите “cocos2d.a“, который скомпилировали в предыдущем уроке. Таким образом, “cocos2d.a” окажется во вложенной в “cocos2d” папке “build“.

Обратите внимание: необходимо добавить корректную версию библиотеки для данной платформы. Если компиляция идет для симулятора, выберите “Debug-iphonesimulator” или “Release-iphonesimulator“. Если файлы компилируются для iPhone, выбирайте “Debug-iphoneos” или “Release-iphoneos“.

addcocoslib

Шаг 9

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

Line Location Tool:0: collect2: ld returned 1 exit status
Line Location Tool:0: symbol(s) not found
Line Location Tool:0: -[PVRTexture createGLTexture] in libcocos2d.a(PVRTexture.o)
Line Location Tool:0: -[EAGLView swapBuffers] in libcocos2d.a(EAGLView.o)
Line Location Tool:0: -[EAGLView _createSurface] in libcocos2d.a(EAGLView.o)
Line Location Tool:0: “_glGetError”, referenced from:
Line Location Tool:0: -[Director initGLDefaultValues] in libcocos2d.a(Director.o)
Line Location Tool:0: “_glClearColor”, referenced from:
Line Location Tool:0: -[TextureAtlas drawNumberOfQuads:] in libcocos2d.a(TextureAtlas.o)
Line Location Tool:0: “_glDrawElements”, referenced from:
Line Location Tool:0: -[EAGLView _createSurface] in libcocos2d.a(EAGLView.o)
Line Location Tool:0: “_glGenFramebuffersOES”, referenced from:
Line Location Tool:0: -[AtlasNode draw] in libcocos2d.a(AtlasNode.o)
Line Location Tool:0: -[AtlasNode draw] in libcocos2d.a(AtlasNode.o)
Line Location Tool:0: -[LabelAtlas draw] in libcocos2d.a(LabelAtlas.o)
Line Location Tool:0: -[LabelAtlas draw] in libcocos2d.a(LabelAtlas.o)
Line Location Tool:0: -[ColorLayer draw] in libcocos2d.a(Layer.o)
Line Location Tool:0: -[ColorLayer draw] in libcocos2d.a(Layer.o)
Line Location Tool:0: “_glEnableClientState”, referenced from:
Line Location Tool:0: -[Texture2D(Drawing) drawInRect:] in libcocos2d.a(Texture2D.o)
Line Location Tool:0: -[Texture2D(Drawing) drawAtPoint:] in libcocos2d.a(Texture2D.o)
Line Location Tool:0: -[ColorLayer draw] in libcocos2d.a(Layer.o)
Line Location Tool:0: “_glDrawArrays”

В этот раз в тексте нас ждут подсказки. Слово “EAGL” означает необходимость ссылки на OpenGL ES Framework. В свою очередь, OpenGL ES Framework наверняка потребует и фреймворка QuartzCore.

Чтобы исправить данный момент, последовательно разверните меню групп “Targets” и “HelloCocos” и откройте контекстное меню для “Link Binary With Libraries“. Выберите “Select Add->Existing Framework“.

Должно появиться вот такое окно:

hellococosaddframework

После щелчка на значке <+> возле “Linked Libraries” откроется еще одно окно. Выберите в нем опцию “Frameworks“, после чего добавьте “OpenGLES.framework“и “QuartzCore.framework“.

quartzcore

Шаг 10

Кнопка “Build and Run“. И….ошибок нет, зато симулятор прекращает работу:

2009-04-05 03:16:12.145 CocoInvaders[3294:20b] Image is Null
2009-04-05 03:16:12.145 CocoInvaders[3294:20b] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -[NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: fps_images.png)’

Похоже, он ищет “fps_images.png” для отображения параметра frame-rate (лично я считаю это ошибкой, поскольку в данном изображении нет необходимости без отображения параметра). В любом случае, а где оно? Должно быть в папке “Resource” внутри той, куда устанавливался cocos2d (на моем компьютере это “Resources/Images“). Смело добавляйте изображение в раздел “Resource” проекта “HelloCocos“. Подсказываю: чтобы ошибок больше не было, включите туда же “Default.png” и “Icon.png“:

cocos2dresource

Xcode часто неадекватно реагирует на перемещение ресурсов. Лучше всего выполнить “Build->Clean“, а потом “Build All“. В противном случае не исключена ситуация, когда в отсутствие ошибок при компиляции при запуске симулятора iPhone приложение вылетает с кучей непонятных ошибок.

Шаг 11

Запускаем. Вот как это выглядит у меня:

hellococos2dsimulator

Добавляем в проект исходный код Cocos2d

Вместо шагов с 5 по 7 можно выбрать альтернативный путь, включив в проект источники Cocos2d. Недостаток его в необходимости распределять большее количество файлов и редактировать больше путей в случае перемещения или передачи проекта на другой компьютер. Но если решили поступить так, то:

В окне “Group & Files” щелкните на имени проекта, удерживая нажатой клавишу <Control>, и выберите “Add Existing Files“.

helococosaddfiles1

Добавьте к проекту следующие папки Cocos2d:

cocos2dincludes1

Папку “DemoНЕ включать.

Появится вопрос “Copy files into the destination group’s folder?” Установите флажок, если хотите скопировать исходные файлы Cocos2d в папку проекта. Какую опцию выбрать, решать вам. Копирование, само собой, сделает папку проекта тяжелее, зато с дистрибуцией проблем не возникнет.

Текст оригинальной статьи на английском языке [здесь]

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

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 1.00 из 5)
Загрузка ... Загрузка ...


5 Responses to “Уроки iPhone SDK: Cocos2d: “Hello World” в Cocos2d”

  1. 1. erGo Says:

    pochemuto rugaetsa na -> [label setPosition: cpv(s.width/2, s.height-50)];
    Line Location HelloCocosAppDelegate.m:36: error: incompatible type for argument 1 of ’setPosition:’

  2. 2. erGo Says:

    проблема решилась после скачки другого кокоса

  3. 3. Artem Says:

    Ну вот очень хорошо что вы нашли решение, я за вас рад. :)

  4. 4. -=di Says:

    а заюзать CGPointMake() недодумаилсь ???
    ))

  5. 5. Artem Says:

    хм, ну все претензии к автору статьи коим я не являюсь. Это адаптированная статья-урок. Если у вас есть решение более рациональное то отразите его в комментариях.

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