|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
09.01.2013, 02:04 | #1 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Разработка игр на С++ и Cocos2D-x
В общем, решила я заняться Cocos2D. Как обычно, инфы на русском очень-очень мало, а на С++ еще меньше, поэтому хочу каким-то образом это исправить. Пока я совсем новичок в этом деле, то буду просто переводить статьи продвинутых "товарищей по оружию". Это, конечно, не громадный вклад в гейм-индустрию, и многие могут сказать: "Зачем нужен перевод, если программисты в большинстве своем знают английский язык?" Не знаю, как вам, а мне все же приятнее читать статьи на родном языке. Может, кому-то поможет в освоении новых для себя технологий.
Туториал 1. Как написать простую игру с помощью Cocos2D Это вольный перевод статей Ray Wenderlich и Yong Yang. Часть по установке Cocos2D на ваш компьютер можно прочитать здесь Добавление спрайта Перед тем, как вы сможете добавить спрайт, вам необходимо несколько картинок для работы. Вы можете использовать картинки, нарисованные специально для данного туториала женой автора одной из переводимых статей – Рэя Вендерлича (http://www.raywenderlich.com/), скачать их можно тут Resource.rar Скачав ресурсы, распакуйте их и перетащите в папку Resource в VisualStudio (у меня так не получилось, поэтому я добавляла картинки в папку Resource на жестком диске, а потом в студии правой кнопкой на Resource в панели Обозреватель решений – Добавить – Существующий элемент – и выбирала картинки. Замечу, что сразу они у меня почему-то в проекте не отобразились (а только после перезапуска студии), но обращаться к ним я все равно могла). Теперь, когда у вас есть картинки, мы разместим нашего персонажа. В Cocos2D нижний левый угол картинки имеет координаты (0;0), а значения координат х и увеличиваются по направлению к правому верхнему углу. Поскольку данный проект в горизонтальном режиме, это обозначает, что верхний правый угол имеет координаты(480, 320), если вы запускаетесь на 3.5″ экране, и (568, 320), если запускаетесь на 4″. Замечание: Те из вас, кто программировал для iOS могут возразить, что 4″ экран вмещает в себя 1136х640 пикселей. Вы правы, но Cocos2D оперирует поинтами, а не пикселями. На устройствах с Retina дисплеями 1 поинт = 2 пикселям, таким образом 1136х640 пикселей = 568х320 поинтам. Это очень удобно, потому что используя поинты в своих играх, координаты будут одинаковыми и для Retina дисплеев, и для других. Также замечу, что по умолчания, когда вы задаете позицию объекта, она считается относительно центра добавляемого спрайта. Итак, если вы хотите, чтоб спрайт вашего персонажа был выровнен по левому краю экрана по горизонтали и центрирован по вертикали: - Координату х установите в [ширина спрайта персонажа]/2. - Координату у установите в [высота окна]/2. Данная картинка поможет это лучше представить: SpriteCoordinates.jpg Итак, давайте попробуем! Откройте HelloWorldScene.cpp (в туториале было HelloWorldLayer, у вас этот файл может называться немного по-другому), и поместим в метод инициализации (bool HelloWorld::init()) следующий код: Код:
Легче всего установить необходимый цвет фона в Cocos2D с помощью класса CCLayerColor. Откроем HelloWorldScene.h и изменим родителя нашего класса HelloWorld: Код:
Код:
Замечание: вы, возможно, заметили, что в ресурсах два варианта изображения нашего героя: player.png (27×40 пикселей), и player-hd.png (двойной размер – 54×80 пикселей). Это для одной крутой фичи Cocos2D – он достаточно умен для того, чтобы подставить графику с высоким разрешением, когда вы запускаетесь под Retina дисплеями! Только положите графику с удвоенным размером и добавьте окончание -hd.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
09.01.2013, 02:06 | #2 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Движение монстров
Далее мы добавим монстров на нашу сцену, с которыми ниндзя будет сражаться. Позволим им перемещаться, чтобы было интереснее. Давайте будем создавать монстров за правым краем экрана и настроим для них движение влево. Добавим следующий метод перед методом init (не забываем прописать его сигнатуру в HelloWorldScene.h): Код:
Новым здесь будет добавление действий. Cocos2D предоставляет множество встроенных действий, которыми мы можем оживить наши спрайты: движение, прыжок, исчезновение, анимация и т.д. Сейчас мы использовали три действия на монстрах: • CCMoveTo: Мы используем действие CCMoveTo, чтобы заставить объект двигаться из-за экрана в левую сторону. Замечу, что вы можете изменять время движения, и сейчас скорость варьируется от 2 до 4 секунд. • CCCallFuncN: CCCallFuncN позволяет нам указать функцию, которая будет выполняться после того, как действие завершится. В этой игре мы поставим это действие выполняться после того, как монстры зайдут за левый край экрана, и будет удалить их со слоя, как только они скроются. Это нужно для того, чтобы не было утечек памяти каждый раз, когда у нас будет тонна неиспользуемых спрайтов за экраном. Замечу, что есть другие (и лучшие пути) решения этой проблемы, например, многократно использующиеся массивы спрайтов, но у нас уроки для новичков, поэтому пойдем легким путем. • CCSequence: Действие CCSequence позволяет связывать нам цепочкой действия, которые должны выполниться последовательно по одному. Таким образом, вы можете вызвать сначала действие CCMoveTo, а по его завершении, действие CCCallFuncN. Теперь нам нужно вызвать метод создания монстров. Чтобы было интересно, давайте заставим монстров непрерывно появляться. Вы можете сделать это в Cocos2D, запланировав периодический вызов функции возврата. Будем вызывать ее один раз в две секунды. Добавьте следующий вызов в ваш метод init перед словом return. Код:
Код:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
09.01.2013, 02:07 | #3 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Выстрел
Давайте добавим немного действий – научим ниндзя стрелять. Есть много вариантов реализации выстрела, но в этой игре мы сделаем его так, что когда игрок коснется экрана(кликнет мышью по экрану), произойдет выстрел в направлении от героя к месту клика. Я хочу использовать действие CCMoveTo для реализации этого, чтобы не выходить за рамки уровня новичка, но также понадобится немного математики. А все потому, что CCMoveTo запрашивает у нас конечную точку снаряда, но мы не можем использовать в этом качестве точку клика, потому что клик по экрану представляет собой всего лишь направление полета снаряда относительно игрока. На самом деле мы хотим, чтобы снаряд пролетал сквозь точку клика, пока не залетит за экран. Вот картинка, которая проиллюстрирует это: ProjectileTriangle.jpg Как вы можете видеть, у нас имеется маленький треугольник, созданный смещением х и у относительно исходной точки к точке клика. Нам только нужно сделать большой треугольник с такими же пропорциями – и мы получим конечную точку за экраном. Итак, вернемся к нашему коду. Сначала нужно разрешить клик по нашему слою. Добавьте следующий код в метод init(): Код:
Код:
Первым делом мы выбираем один из кликов, чтоб работать с ним, и используем convertTouchToNodeSpace, чтобы конвертировать координаты клика в координаты нашего слоя. Далее мы загружаем картинку снаряда и устанавливаем его начальные координаты, как обычно. Затем определим, куда мы хотим переместить снаряд, используя вектор между кликом и игроком согласно алгоритма, приведенного ранее. Замечу, что алгоритм не идеален. Мы заставляем снаряд двигаться, пока он не достигнет экрана по позиции Х, даже если он уже вышел за экран в Y-позиции. Существуют множество способов найти кратчайший путь за экран, но для этого туториала пусть будет как есть. Последнее, что мы должны сделать – это определить продолжительность движения. Мы хотим, чтобы снаряд двигался с одинаковой скоростью, несмотря на направление движения, и опять нам понадобится математика. Вы можете выяснить расстояние, используя теорему Пифагора. Вспомните из курса геометрии правило, которое утверждает, что длина гипотенузы прямоугольного треугольника равна квадратному корню из суммы квадратов катетов. Когда у вас есть расстояние, разделите его на скорость, чтобы получить время. Напоследок установите действия так же, как это делали для монстров. Скомпилируйте и запустите проект, и ваш ниндзя теперь имеет возможность разить орды противника!
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
09.01.2013, 02:08 | #4 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Обнаружение столкновений
Итак, сейчас сюррикены летают везде, но что наш ниндзя действительно хочет – это уложить парочку монстров. Давайте добавим код, определяющий, когда наши снаряды поразили цель. Есть несколько способов решить эту задачу с помощью Cocos2D, включая использование физических библиотек: Box2D или Chipmunk. Однако чтобы не усложнять, мы сделаем самостоятельно простое обнаружение столкновений. Чтобы сделать это, сперва нужно запомнить снаряды и цели, которые присутствуют в данный момент на сцене. Добавим следующее объявление в класс HelloWorldScene: Код:
Код:
Код:
Код:
Код:
Код:
Добавим новый метод (в .h-файле void update(cocos2d::ccTime dt);): Код:
Замечу, что вы должны добавить объект в массив «для удаления», потому что нельзя удалить объект из массива, пока вы идете по нему. Разумеется, есть более оптимальные способы решения этой задачи, но мы идем самым легким путем. Осталась одна вещь, которую нужно сделать – запланировать запуск этого метода так часто, как это возможно, добавив следующую строку в метод init(): Код:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
09.01.2013, 02:09 | #5 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Последние штрихи
Мы уже очень близко к завершению нашего хоть и очень простого, зато работоспособного приложения. Было бы неплохо добавить сюда звуковых эффектов и музыки (какая же это игра без звука?) и немного простой игровой логики. В нашей игре мы имеем возможность проигрывать музыку и звуковые эффекты с помощью одной строчки кода. Конечно, на разных платформах поддерживаются разные аудиоформаты, об этом можно прочитать по ссылке Итак, скопируйте файлы background-music-aac.wav и pew-pew-lei.wav в папку Resource, если вы этого еще не сделали ранее. Мы будем использовать wav, потому что wav поддерживается всеми платформами. Затем подключим SimpleaudioEngine.h в HelloWorldScene.cpp. Код:
Код:
Код:
Код:
Код:
Код:
Вернемся к задачам, GameOverScene должна быдет вызываться в двух случаях: если убито достаточное количество монстров или одному из монстров удалось улизнуть. Мы добавим переменную в HelloWorldScene.h, в которой будем считать количество убитых героем врагов. Код:
Код:
Код:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
09.01.2013, 02:09 | #6 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
И, наконец, давайте сделаем так, чтобы когда хотя бы один монстр убегает, мы проигрывали. В функции spriteMoveFinished() после условия проверки, удалился ли монстр с экрана (if (node->getTag() == 1)), пишем:
Код:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
10.01.2013, 16:07 | #7 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Ха-ха, эту же статью на русском нашла здесь, и перевод там гораздо удачнее, (правда, она на Objective-C). Ну, как говорится, "хорошая мысля приходит опосля". В моем случае я нахожу то, что мне надо, когда уже все перевела (перевод с Objective-C на С++ тоже нашелся в середине написания мной игры).
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
05.07.2013, 12:06 | #8 |
Новичок
Джуниор
Регистрация: 13.11.2009
Сообщений: 1
|
автору респект однозначно! Речь идет не о статье в частности, а о конкретной реализации данного проекта на С++ и cocos2d-x. Да-да.. не о Objective-C и cocos2d-iphone, а именно связке С++/cocos2d-x. Здесь, как грят в Одессе, две большие разницы.
|
04.01.2014, 11:25 | #9 |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
Скажите пожалуйста, автор, есть ли у вас еще обучающие статьи? Именно таких статей не хватает для самостоятельного обучения. И можно ли задавать вопросы по урокам здесь?
|
04.01.2014, 14:07 | #10 |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
niixon, я не автор, я типа переводчик Больше статей нет (так как нашла русский перевод, хоть и на ObjC), но если кому надо, могу попробовать попереводить еще. Вопросы задавать можно, отвечу в меру своих знаний.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработка игр | Kaddok | Свободное общение | 6 | 18.05.2012 22:06 |
Разработка социальных игр | tfe2012 | Фриланс | 0 | 23.08.2011 18:57 |
разработка игр на Python | OrcXCyber | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 3 | 24.03.2011 10:26 |
Требуются талантливые люди. Разработка PC-игр. | zzzAleXzzz | Фриланс | 2 | 22.01.2011 23:09 |
разработка онлайн-игр | dvizzz | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 1 | 18.06.2010 23:52 |