|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.01.2014, 22:00 | #11 |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
Я нашел этот урок на си++, и по нему у меня все получилось.
Вот ссылка. http://www.cocos2d-x.org/wiki_extens...d-x?tag_id=318 По вашим урокам я только читал логику. К сожалению по неведомым мне причинам, функции и классы, которые использовали вы, отличаются от тех, которые используются в тех уроках и ваши у меня не видел компилятор. Может быть вы используете старые классы и методы, которых нет у меня в сборке? Или наоборот? Последний урок: "Последние штрихи" на сайте нет, а по вашим примерам у меня не работает. Не видит библиотеку: "SimpleAudioEngine.h" А вопросы я с удовольствием позадаю. Я первый раз сел за разработку игр. Это все очень интересно, просто безумно |
05.01.2014, 23:17 | #12 | |
Сама себе режиссер
Старожил
Регистрация: 27.04.2007
Сообщений: 3,365
|
Возможно, у меня кокос старше. Я брала его по ссылке в первом сообщении:
Цитата:
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
|
|
06.01.2014, 00:17 | #13 |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
Я хочу разобрать каждую строчку из примера. Если будет время, помогите разобраться. Я буду стараться больше рассказывать как я понимаю то, или иное действие. Если будет не правильно, то исправьте пожалуйста.
1. Класс CCArray cocos2d::CCArray *_targets; cocos2d::CCArray *_projectiles; Как я понял, класс CCArray используется как массив переменной длинны для различных объектов. Что-то типа arrayList из java. _targets для целей, _projectiles, для пуль. Потом в функции addTarget(), в массив _targets методом _targets->addObject(target); вставляется спрайт с картинкой цели. Потом в методе update(), если есть столкновение, нужный объект удаляется из массива. _targets->removeObject(target); - по каким-то причинам, программа понимает какой именно объект надо удалить. Это я пока не понял. 2. Создание спрайта, загрузка картинки. Класс CCSprite CCSprite *player = CCSprite::create("player-hd.png", CCRectMake(0, 0, 20, 20)); player->setPosition( ccp(player->getContentSize().width/2+30, winSize.height/2) ); this->addChild(player, 1); 1 строчка: здесь создается указатель на наш српайт с картинкой игрока. Через метод create() подгружаем картинку. Это первый параметр в функции, а для чего второй параметр? 2 строчка: устанавливаем позицию появления на сцене, или на слое? Или на экрана? Как правильно сказать? В параметры функции setPosition(), передаем: 1. player->getContentSize().width/2 - как правильно сказать, что здесь происходит? Вызываем метод getContentSize(), этот метод наверняка возвращает объект, который содержит в себе всевозможные размеры(константы ?). Мы обращаемся к переменной width(ширина), это ширина нашего спрайта? и делим ее на пополам. Для чего? 2. winSize.height/2 - winSize тоже объект с размером, и в нем хранятся наверное разные константы с размерами? Мы достаем из него значение height(длинна) и тоже делим на пополам. Но это уже длинна не нашего спрайта, а наверное всего экрана... Получается поделив ширину спрайта на пополам и поделив длину экрана на пополам мы получаем центр экрана с левой стороны? И там отобразится наш спрайт? Но дальше непонятнее всего, все эти значения передаются в параметры метода ccp. Что он возвращает? Для чего он? 3. Функция HelloWorld::init() Эта функция вызывается при старте программы, в ней происходит инициализация переменных, создание белого фона, загрузка спрайта с игроком, вызов нужных нам функций. Вопрос: Эта функция выполняется постоянно с какой-то частотой? Или она запускается 1 раз? В этой функции вызывается метод update(), его надо вызывать очень часто, чтобы отследить столкновение. Получается, что функция init(), вызывается постоянно в каком-то цикле? Но если она постоянно вызывается... в ней каждый раз пересоздаются все переменные и постоянно выделяется память под наши массивы(цели и пули). _targets = new CCArray; _projectiles = new CCArray; ... но эти переменные нельзя в каждом кадре пересоздавать. Ведь это массивы объектов и они заполняются данным. 3.1 Класс CCSize,CCDirector CCSize и CCPoint - для каких целей можно использовать эти классы? CCDirector - это один из главных классов. Что можно про него сказать, чтобы понять для чего он и какая у него роль? static Director* sharedDirector() - на оф сайте сказано, что этот метод устарел, и лучше использовать getInstance(). static Director* getInstance() - получается можно и его использовать. Суть его такая: создается и возвращается указатель на объект класса Director и через него вызывается методы getWinSize(), getVisibleSize(), getVisibleOrigin(); CCSize winSize = CCDirector::sharedDirector()->getWinSize(); CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin(); getWinSize(); - returns the size of the OpenGL view in points getVisibleSize(); - returns visible size of the OpenGL view in points getVisibleOrigin(); - returns visible origin of the OpenGL view in points Не могу правильно перевести, что возвращают эти методы, гугл переводчик ужасно переводит(. То, что возвращают размер это понятно, но чего именно и в каком представлении этот размер записывается и хранится в переменных класса CCSize CCPoint? На скриншоте показано, какие значения хранят 3 переменные. Последний раз редактировалось niixon; 06.01.2014 в 11:31. Причина: Добавление скриншота |
06.01.2014, 01:39 | #14 | |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
3.2 Классы CCMenuItemImage, CCMenu
Код:
Инициализируем переменную *pCloseItem. В метод передаем (обычная картинка, картинку, которая будет отображаться при нажатии на картинку, this - это текущий объект(тут более менее понятно), и последнее, menu_selector(HelloWorld::menuClose Callback)). menu_selector(HelloWorld::menuClose Callback) - при нажатии на картинку, будет вызван метод menuCloseCallback(). Мы тут можем выбрать любой свой метод? И так отслеживать нажатия на картинку? menu_selector() - что это за функция? Как это объяснить? Потом устанавливаем позицию отображения на экране нашей картинки.Тут я еще разберусь... не все понятно пока что. Класс CCMenu можно использовать для создания полноценного меню? Как я понял, этот класс как коллекция, в нем можно хранить разные объекты, текст, картинки и может быть еще что-то? И все, что вставлено в него, будет отображаться друг за другом или как-нибудь упорядочено? При помощи функции pMenu->addChild() можно добавлять объекты типа MenuItem? Но прототип функции выглядит так: virtual void addChild(CCNode *child, int zOrder); Так можно или нельзя добавлять к меню, различные объекты меню, типа текста, картинок и т.д. Цитата:
Далее мы создаем объект меню (pMenu), и инициализируем его, передавая в метод creat() класса CCMenu объект: pCloseItem и null. Почему второй параметр нуль? Как я понял по прототипу static CCMenu* create(CCMenuItem *item, ... ); функция принимает переменное число аргументов, то есть, я могу создать сколько угодно объектов MenuItem разного типа (картинка, текст ...), и при создании меню, передать эти объекты в параметры методу CCMenu::create()? Потом добавляем на нашу сцену(или экран) меню, которое хранит в себе все айтемы, которые туда добавили. В нашем случае, добавили только картинку. И последний вопрос: this->addChild(pMenu, 1); При добавлении, используется this. Это текущий объект и он непосредственно имеет доступ к экрану. Через него вызываем метод, в который вставляем объект, который нужно добавить на экран. И второй параметр? Для чего он? |
|
06.01.2014, 02:31 | #15 | ||
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
3.3 Вызовы функций
Код:
1. void schedule (SEL_SCHEDULE selector); 2. void schedule (SEL_SCHEDULE selector, float interval); Описание: 1. Функция с одним параметром. Цитата:
2. С двумя параметрами. Цитата:
schedule_selector - как объяснить, для чего нужна эта функция, или это не функция? Теперь стало понятно, как происходит постоянный вызов функции update(). Последний раз редактировалось niixon; 06.01.2014 в 11:34. |
||
06.01.2014, 11:28 | #16 |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
4. void HelloWorld::addTarget()
Код:
Определяем появление монстра вдоль оси Y Код:
minY – высота монстра деленная на пополам maxY – высота экрана – высота монстра / 2 rangeY – здесь получаем значение… как его объяснить? Получается диапазон между высотой монстра и местом на экране. actualY – а здесь, уже конкретно создается рандомное значение по оси Y. В диапазоне от rangeY(свободного диапазона) до minY(высота монстра) Далее создаем монстра за правым краем, учитывая его рандомное появление по всей оси Y Код:
winSize.width + (target->getContentSize().width/2) – ширина экрана + ширина монстра / 2. (это Х позиция) actualY – (это Y позиция), которую сгенерировал наш рандом Далее определяем скорость перемещения монстра Код:
|
06.01.2014, 12:08 | #17 | |||
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
4.1 Классы CCFiniteTimeAction, CCSequence, CCMoveTo, CCCallFuncN. Создание действия
Код:
CCMoveTo - Moves a CCNode object to the position x,y(перемещение объекта в положение x, y). Цитата:
const CCPoint & position – (ccp(0 - target->getContentSize().width/2, actualY) – здесь координаты появления на экране, откуда начнет свое действие? Так? Значение по Y – это наше значение, которое высчитывали выше. А вот x – target - это наш монстр. Берем его значение ширины, делим на два и это получается значение х? Допустим ширина спрайта 40дп. 40/2 = 20. 0 – 20 = -20. Это вряд ли будет значение появления спрайта по оси х, это больше похоже на координату, куда он должен двигаться(или переместиться). Не очень тут понял. ) CCCallFuncN - описания на оф сайте я не нашел. Цитата:
Теперь можно сделать вывод, что actionMoveDone будет нужен, (не могу четко сформулировать правильную мысль) при окончании перемещения, и как только перемещение должно прекратиться, будет вызван метод spriteMoveFinished(), который и удалит объект со сцены и из массива _targets. CCSequence - Runs actions sequentially, one after another(последовательное выполнение действий. Одно за другим) Цитата:
Последний раз редактировалось niixon; 06.01.2014 в 13:43. |
|||
06.01.2014, 12:52 | #18 |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
5. void HelloWorld::spriteMoveFinished(CCNode* sender)
Код:
Потом делаем (каст) создаем спрайт, который и есть тот объект со сцены, который надо удалить. По его тэгу узнаем кто он (цель или пуля) и методом removeObject() удаляем из массива объектов. Но каким образом функция removeObject() поняла, какой именно объект внутри себя ей надо удалить. Например на сцене находится 3 монстра, в одного из них попала пуля. Вызывается метод spriteMoveFinished() в него передается спрайт(монстр) в которого попали и удаляем его из массива. Но как функция поняла, что удалить надо именно того в кого попали? Я бы понял, если бы мы указали индекс, или id спрайта. Наверное в каждом спрайте(объекте) есть свой идентификатор и функция по нему определяет какой спрайт надо удалить? И еще не понятно, если удалили из массива, то нужно удалить и со сцены? Код удаления со сцены я не увидел пока что. |
06.01.2014, 13:49 | #19 | |
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
4.2 target->runAction( CCSequence::create(actionMove, actionMoveDone, NULL) );
CCAction* runAction(CCAction * action); Через указатель на объект CCSprite вызывается метод runAction(), в котором мы создаем CCSequence(здесь хранится последовательность действий). Таким образом запускается созданный спрайт. То, что мы для него запланировали, запускается через функцию runAction(); Цитата:
|
|
06.01.2014, 14:24 | #20 | |||
Пользователь
Регистрация: 03.08.2012
Сообщений: 23
|
6. HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event)
6.1 Классы CCTouch, CCPoint Код:
Цитата:
Цитата:
CCPoint - на сайте у него нет описания. Для чего этот класс? convertTouchToNodeSpace (CCTouch *touch); - создаем объект класса CCPoint location и инициализируем эту переменную возвращаемым значением из функции convertTouchToNodeSpace, в которую мы передали пришедшее нажатие. Она возвращает объект CCPoint, он наверное хранит в себе координаты нажатия и еще что-нибудь? Код:
Цитата:
Последний раз редактировалось niixon; 06.01.2014 в 14:36. |
|||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разработка игр | 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 |