|
Июн
14
|
В этом уроке речь пойдет о создании приложения Hello World для cocos2d. Тем, кто еще не выполнил установку и компиляцию cocos2d, стоит прочесть предыдущий урок.
Шаг 1
Командой “File->New Project” создайте новый проект.
Шаг 2
Выберите опцию “Window-Based Application“.

Вариант “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” — файл класса приложения. С этим классом нам и предстоит работать в данном примере.

Если теперь выполнить “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“.

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

Шаг 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“.

Шаг 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“.
Должно появиться вот такое окно:

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

Шаг 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“:

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

Добавляем в проект исходный код Cocos2d
Вместо шагов с 5 по 7 можно выбрать альтернативный путь, включив в проект источники Cocos2d. Недостаток его в необходимости распределять большее количество файлов и редактировать больше путей в случае перемещения или передачи проекта на другой компьютер. Но если решили поступить так, то:
В окне “Group & Files” щелкните на имени проекта, удерживая нажатой клавишу <Control>, и выберите “Add Existing Files“.

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

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



Июнь 18th, 2009 at 08:50
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:’
Июнь 19th, 2009 at 11:12
проблема решилась после скачки другого кокоса
Июнь 19th, 2009 at 12:18
Ну вот очень хорошо что вы нашли решение, я за вас рад.
Июнь 27th, 2009 at 11:21
а заюзать CGPointMake() недодумаилсь ???
))
Июнь 27th, 2009 at 11:42
хм, ну все претензии к автору статьи коим я не являюсь. Это адаптированная статья-урок. Если у вас есть решение более рациональное то отразите его в комментариях.
Февраль 5th, 2010 at 17:04
После 7-го шага у меня так и остались ошибки типа:
Line Location HelloCocosAppDelegate.m:24: error: ’scene’ undeclared (first use in this function)
cocos2d построил в targets в проекте cocos2d, примеры cocos2d запускаются, место расположения cocos2d указал..
Что я ещ не сделал?