portaldacalheta.pt
  • Основен
  • Инженерно Управление
  • Мобилен Дизайн
  • Разпределени Екипи
  • Пъргав
Подвижен

Как да изградим безкраен бегач на iOS: Cocos2D, автоматизация и др



Разработването на iOS игри може да бъде обогатяващо преживяване както от лична, така и от финансови растеж. По-рано тази година внедрих игра, базирана на Cocos2D, Пчелна раса , до App Store. Геймплеят му е прост: безкраен бегач, в който играчите (в случая пчелите) събират точки и избягват препятствия. Вижте тук за демонстрация.

В този урок ще обясня процеса, който стои зад разработването на игри за iOS, от Cocos2D до публикуването. За справка, ето кратко съдържание:



  • Спрайтове и физически обекти
  • Кратко въведение в Cocos2D
  • Използване на Cocos2D с раскадки
  • Геймплей и (кратко) описание на проекта
  • Автоматизирайте заданията. Използвайте инструменти. Успокой се.
  • Фактуриране в приложението
  • Мултиплейър геймплей с Game Center
  • Стая за подобрения
  • Заключение

Спрайтове и физически обекти

Преди да влезем в грубите подробности, ще бъде полезно да разберем разликата между спрайтове и физически обекти.



За всеки даден обект, който се появява на екрана на безкрайна игра бегач, графичното представяне на този обект се означава като спрайт , докато многоъгълното представяне на този обект във физическия двигател се нарича a физически обект .



Така спрайтът се изчертава на екрана, подкрепен от съответния му физически обект, който след това се обработва от вашия физически двигател. Тази настройка може да се визуализира тук, където спрайтовете се показват на екрана, с техните физически многоъгълни аналози, очертани в зелено:

В iOS игри с безкрайни бегачи, спрайтове и физически обекти съжителстват.



По подразбиране физическите обекти не са свързани със съответните им спрайтове, което означава, че вие ​​сте разработчик на iOS може да избере кой двигател на физиката да използва и как да свързва спрайтове и тела. Най-често срещаният начин е да подкласирате спрайта по подразбиране и да добавите конкретно физическо тяло към него.

Имайки това предвид ...



Кратък урок за разработването на игри Cocos2D iOS

Cocos2D-iphone е рамка с отворен код за iOS, която използва OpenGL за хардуерно графично ускорение и поддържа Бурундук и Box2D двигатели по физика.

На първо място, защо се нуждаем от такава рамка? Е, за начало, рамките прилагат често използваните компоненти за разработване на игри. Например Cocos2D може да зарежда спрайтове (по-специално, спрайт листове ( защо? )), стартирайте или спрете физически двигател и се справяйте правилно с времето и анимацията. И прави всичко това с код, който е прегледан и тестван задълбочено - защо да отделяте собственото си време за пренаписване на вероятно по-нисък код?



Може би най-важното обаче - Разработката на игри Cocos2D използва графично хардуерно ускорение . Без такова ускорение, всяка игра с безкраен бегач на iOS с дори умерен брой спрайтове ще работи със значително лоша производителност. Ако се опитаме да направим по-сложно приложение, тогава вероятно ще започнем да виждаме ефект на „bullet-time“ на екрана, т.е. множество копия на всеки спрайт, докато се опитва да анимира.

И накрая, Cocos2D оптимизира използването на паметта оттогава кешира спрайтове . По този начин, всички дублирани спрайтове изискват минимална допълнителна памет, което очевидно е полезно за игри.



Използване на Cocos2D с раскадки

След всички похвали, които съм хвърлил на Cocos2D, може да изглежда нелогично препоръчваме да използвате Storyboards . Защо просто не манипулирате обектите си с Cocos2D и т.н.? Е, честно казано, за статичните прозорци често е по-удобно да се използва Interface Builder на Xcode и неговия механизъм на Storyboard.

Първо, това ми позволява да плъзгам и позиционирам всичките си графични елементи за безкрайната ми игра на бегач с мишката. Второ, Storyboard API е много, много полезен. (И да, знам за Кокосов строител ).



Ето един бърз поглед към моя Storyboard:

За да научите как да направите безкрайна бягаща игра, започнете с добър Storyboard.

Основният контролер на изгледа на играта просто съдържа сцена Cocos2D с някои HUD елементи отгоре:

Началото на нашия урок Cocos2D е от контролера на изгледа.

Обърнете внимание на белия фон: това е сцена Cocos2D, която ще зареди всички необходими графични елементи по време на изпълнение. Други изгледи (индикатори на живо, глухарчета, бутони и др.) Са всички стандартни изгледи на какао, добавени към екрана с помощта на Interface Builder.

Няма да се спирам на подробностите - ако се интересувате, примери можете да намерите в GitHub.

Геймплей и (кратко) описание на проекта

(За да осигуря повече мотивация, бих искал да опиша безкрайната си игра на бегач малко по-подробно. Чувствайте се свободни да пропуснете този раздел, ако искате да продължите към техническата дискусия.)

По време на игра на живо пчелата е неподвижна, а самото поле всъщност се втурва, носейки със себе си различни опасности (паяци и отровни цветя) и бонуси (глухарчета и техните семена).

Cocos2D има обект на камера, който е проектиран да следва героя; на практика беше по-малко сложно да се манипулира CCLayer, съдържащ света на играта.

Контролите са прости: докосването на екрана премества пчелата нагоре, а друго докосване - надолу.

Самият световен слой всъщност има два подслоя. Когато играта започне, първият подслой се попълва от 0 до BUF_LEN и се показва първоначално. Вторият подслой се попълва предварително от BUF_LEN до 2 * BUF_LEN. Когато пчелата достигне BUF_LEN, първият подслой се почиства и незабавно отново се попълва от 2 * BUF_LEN на 3 * BUF_LEN и се представя вторият подслой. По този начин редуваме слоевете, като никога не задържаме остарели обекти, важна част от избягването на изтичане на памет.

Моята игра с безкрайни бегачи се състои от многослоен свят.

По отношение на двигателите по физика използвах Chipmunk по две причини:

  1. Написано е на чисто Objective-C.
  2. И преди съм работил с Box2D, затова исках да сравня двете.

Физическият двигател наистина се използваше само за откриване на сблъсък. Понякога ме питат: „Защо не написахте собственото си откриване на сблъсък?“. В действителност няма много смисъл от това. Физическите двигатели са проектирани за тази цел: те могат да откриват сблъсъци между тела със сложни форми и да оптимизират този процес. Например, двигателите на физиката често разделят света на клетки и извършват проверки за сблъсък само за тела в същите или съседни клетки.

Автоматизирайте заданията. Използвайте инструменти. Успокой се.

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

Но понякога автоматизацията може да бъде и компромис между перфекционизма и спазването на крайния срок. В този смисъл перфекционизмът може да бъде убиец на Angry Birds.

Например, в друга игра за iOS, която в момента разработвам, изградих рамка за създаване на оформления с помощта на специален инструмент (наличен на GitHub ). Тази рамка има своите ограничения (например, няма хубави преходи между сцените), но използването й ми позволява да правя моите сцени в десета от времето.

Така че, докато не можете да изградите своя собствена суперрамка със специални суперинструменти, все пак можете и трябва да автоматизирате колкото се може повече от тези малки задачи.

Перфекционизмът може да бъде убиецът на Angry Birds. Времето е решаващ ресурс в разработването на iOS игри. Tweet

При изграждането на този безкраен бегач автоматизацията отново беше ключова. Например, художникът ми би ми изпратил графики с висока разделителна способност чрез специална папка Dropbox. За да спестя време, написах някои скриптове за автоматично изграждане на набори от файлове за различните целеви резолюции, изисквани от App Store, добавяйки също -hd или @ 2x (споменатите скриптове са базирани на ImageMagick ).

По отношение на допълнителните инструменти открих TexturePacker за да бъде много полезен - той може да пакетира спрайтове в спрайт листове, така че приложението ви да консумира по-малко памет и да се зарежда по-бързо, тъй като всички ваши спрайтове ще се четат от един файл. Той също така може да експортира текстури в почти всички възможни рамкови формати. (Обърнете внимание, че TexturePacker не е безплатен инструмент, но мисля, че си струва цената. Можете също така да проверите безплатни алтернативи като ShoeBox .)

Основната трудност, свързана с физиката на играта, е да се създадат подходящи полигони за всеки спрайт. С други думи, създаване на многоъгълно представяне на някаква неясно оформена пчела или цвете. Дори не се опитвайте да правите това на ръка - винаги използвайте специални приложения, които са много. Някои дори са доста ... екзотични - като създаване на векторни маски с Inkspace и след това импортирането им в игра.

За моето собствено безкрайно разработване на игра за бегачи създадох инструмент за автоматизиране на този процес (вж тук за правилно използване), което аз наричам Andengine Vertex Helper . Както подсказва името, първоначално е проектиран за Рамка на Andengine , въпреки че днес ще работи подходящо с редица формати.

В нашия случай трябва да използваме шаблона plist:

%.5f%.5f

След това създаваме plist файл с описания на обекти:

jet_ant vertices -0.182620.08277 -0.14786-0.22326 0.20242-0.55282 0.470470.41234 0.038230.41234

И обект за зареждане:

- (void)createBodyAtLocation:(CGPoint)location{ float mass = 1.0; body = cpBodyNew(mass, cpMomentForBox(mass, self.sprite.contentSize.width*self.sprite.scale, self.sprite.contentSize.height*self.sprite.scale)); body->p = location; cpSpaceAddBody(space, body); NSString *path =[[NSBundle mainBundle] pathForResource:@'obj _descriptions' ofType:@'plist']; // e = 0.7; shape->u = 1.0; shape->collision_type = OBJ_COLLISION_TYPE; cpSpaceAddShape(space, shape); }

За да проверите как спрайтовете съответстват на физическите им тела, вижте тук .

Много по-добре, нали?

В обобщение, винаги автоматизирайте, когато е възможно. Дори прости скриптове могат да ви спестят много време. И важното е, че това време може да се използва за програмиране, вместо щракване с мишката. (За допълнителна мотивация, ето a жетон XKCD .)

Фактуриране в приложението

Събраните топки в играта действат като валута в приложението, което позволява на потребителите да купуват нови кожи за своята пчела. Тази валута обаче може да бъде закупена и с реални пари. Важен момент, който трябва да се отбележи по отношение на фактурирането в приложението, е дали трябва да извършвате проверки от страна на сървъра за валидност на покупката. Тъй като всички закупувани стоки са по същество равни по отношение на геймплея (само променящи външния вид на пчелата), няма нужда да се извършва сървърна проверка за валидност на покупката. В много случаи обаче определено ще трябва да го направите.

Освен това Рей Вендерлих има перфектното урок за таксуване в приложение .

Мултиплейър геймплей с Game Center

В мобилните игри, общуване е нещо повече от просто добавяне на бутон Facebook „Харесване“ или настройка на класации. За да направя играта по-вълнуваща, внедрих мултиплейър версия.

Как работи? Първо, двама играчи са свързани с помощта на създаването на мачове в реално време на iOS Game Center. Тъй като играчите наистина играят една и съща игра на безкраен бегач, трябва да има само един набор от обекти на играта. Това означава, че инстанцията на единия играч трябва да генерира обектите, а другата игра ще ги отчете. С други думи, ако устройствата на двамата играчи генерираха игрови обекти, би било трудно да синхронизирате преживяването.

основни принципи на гещалт психологията

Имайки това предвид, след установяване на връзката и двамата играчи си изпращат произволно число. Играчът с по-голям брой действа като „сървър“, създавайки игрови обекти.

Спомняте ли си дискусията за порционирано световно поколение? Къде имахме два подслоя, единият от 0 до BUF_LEN, а другият от BUF_LEN до 2 * BUF_LEN? Тази архитектура не беше използвана случайно - беше необходимо да се осигури плавна графика за забавени мрежи. Когато се генерира част от обектите, тя се опакова в plist и се изпраща на другия играч. Буферът е достатъчно голям, за да позволи на втория играч да играе дори с мрежово забавяне. И двамата играчи си изпращат текущата си позиция с период от половин секунда, като също изпращат своите движения нагоре-надолу веднага. За да се изглади опитът, позицията и скоростта се коригират на всеки 0,5 секунди с плавна анимация, така че на практика изглежда, че другият играч се движи или ускорява постепенно.

Със сигурност има още съображения, които трябва да бъдат направени по отношение на безкрайния игрален режим на мултиплейър, но се надяваме, че това ви дава представа за видовете предизвикателства.

Стая за подобрения

Игрите никога не са завършени. Разбира се, има няколко области, в които бих искал да подобря своя, а именно:

  1. Проблеми с контрола: потупването често е неинтуитивен жест за играчи, които предпочитат да плъзгат.
  2. Световният слой се премества с помощта на действието CCMoveBy. Това беше добре, когато скоростта на световния слой беше постоянна, тъй като действието CCMoveBy се задейства с CCRepeatForever:

    -(void) infiniteMove{ id actionBy = [CCMoveBy actionWithDuration: BUFFER_DURATION position: ccp(-BUFFER_LENGTH, 0)]; id actionCallFunc = [CCCallFunc actionWithTarget:self selector:@selector(requestFillingNextBuffer)]; id actionSequence = [CCSequence actions: actionBy, actionCallFunc, nil]; id repeateForever = [CCRepeatForever actionWithAction:actionSequence]; [self.bufferContainer runAction:repeateForever]; }

    Но по-късно добавих световно увеличение на скоростта, за да направя играта по-трудна, докато продължава:

    -(void) infiniteMoveWithAccel { float duration = BUFFER_DURATION-BUFFER_ACCEL*self.lastBufferNumber; duration = max(duration, MIN_BUFFER_DURATION); id actionBy = [CCMoveBy actionWithDuration: duration position: ccp(-BUFFER_LENGTH, 0)]; id restartMove = [CCCallFunc actionWithTarget:self selector:@selector(infiniteMoveWithAccel)]; id fillBuffer = [CCCallFunc actionWithTarget:self selector:@selector(requestFillingNextBuffer)]; id actionSequence = [CCSequence actions: actionBy, restartMove, fillBuffer, nil]; [self.bufferContainer runAction:actionSequence]; }

    Тази промяна доведе до разкъсване на анимацията при всяко рестартиране на действието. Опитах се да поправя проблема, но без резултат. Моите бета тестери обаче не забелязаха поведението, затова отложих корекцията.

  3. От една страна, няма нужда да пиша собствено упълномощаване за мултиплейър, когато използвам Game Center или стартирам собствен сървър за игри. От друга страна, това направи невъзможно създаването на ботове, което бих искал да променя.

Заключение

Създаването на ваша собствена инди безкрайна игра бегач може да бъде страхотно изживяване. И след като стигнете до стъпката на публикуване на процеса, това може да бъде прекрасно усещане, когато пуснете собственото си творение в дивата природа.

Процесът на преглед може да варира от няколко дни до няколко седмици. За повече информация има полезен сайт тук който използва данни от тълпа, за да изчисли текущите времена за преглед.

Освен това препоръчвам да използвате AppAnnie да проучи различна информация за всички приложения в App Store и да се регистрира в някои аналитични услуги като Flurry Analytics също може да бъде полезно.

И ако тази игра ви е заинтригувала, не забравяйте да проверите Пчелна раса в магазина.

Атрибути на клас Python: Прекалено задълбочено ръководство

Технология

Атрибути на клас Python: Прекалено задълбочено ръководство
Урок за обратното проектиране на частния API на вашия софтуер: Хакване на вашия диван

Урок за обратното проектиране на частния API на вашия софтуер: Хакване на вашия диван

Технология

Популярни Публикации
Плащане напред: Разбиране на изкупувания с ливъридж
Плащане напред: Разбиране на изкупувания с ливъридж
Индустриален анализ и Porter’s Five Force: По-задълбочен поглед върху силата на купувача
Индустриален анализ и Porter’s Five Force: По-задълбочен поглед върху силата на купувача
Разширена реалност vs. Виртуална реалност vs. Смесена реалност: Уводно ръководство
Разширена реалност vs. Виртуална реалност vs. Смесена реалност: Уводно ръководство
Ще отвори ли Spotify не-IPO пътя за технологичните компании?
Ще отвори ли Spotify не-IPO пътя за технологичните компании?
Прогнозиране на харесвания: Вътре в алгоритмите на прост механизъм за препоръки
Прогнозиране на харесвания: Вътре в алгоритмите на прост механизъм за препоръки
 
Ефективни стартови платки: какви са те и как да ги изградим
Ефективни стартови платки: какви са те и как да ги изградим
Ръководител на клиентския опит
Ръководител на клиентския опит
Игла в купа сено: чудесен урок за мащабен текстов алгоритъм за търсене
Игла в купа сено: чудесен урок за мащабен текстов алгоритъм за търсене
Структурата на данните Trie: Пренебрегван скъпоценен камък
Структурата на данните Trie: Пренебрегван скъпоценен камък
Краят на уеб формите
Краят на уеб формите
Популярни Публикации
  • обектен модел на страницата на уеб драйвер на селен
  • използване на github за хостване на уебсайт
  • Glas Steagall Act отменя последствия
  • llc тип c или s
  • променете css променлива с javascript
  • инструменти за тестване на единици за net
Категории
  • Инженерно Управление
  • Мобилен Дизайн
  • Разпределени Екипи
  • Пъргав
  • © 2022 | Всички Права Запазени

    portaldacalheta.pt