Како написати своју прву Андроид игру на Јави

Аутор: John Stephens
Датум Стварања: 1 Јануар 2021
Ажурирати Датум: 19 Може 2024
Anonim
Как выучить JavaScript? Самый аху#### способ!
Видео: Как выучить JavaScript? Самый аху#### способ!

Садржај


Постоји пуно начина за креирање игре за Андроид, а један важан начин је да се то уради од почетка у Андроид студију са Јава. То вам даје максималну контролу над начином на који желите да ваша игра изгледа и понаша се, а процес ће вас научити вештинама које можете да користите и у низу других сценарија - било да стварате екран за прскање за апликацију или само желите да додајте неке анимације. Имајући то у виду, овај туториал ће вам показати како да направите једноставну 2Д игру користећи Андроид Студио и Јава. Све кодове и ресурсе можете пронаћи на Гитхуб-у ако желите да следите даље.

Подешавати

Да бисмо креирали нашу игру, мораћемо да се позабавимо са неколико конкретних концепата: петље игре, нити и платна. За почетак покрените Андроид Студио. Ако га немате инсталиран, погледајте наш потпуни увод у Андроид Студио који прелази поступак инсталације. Сада покрените нови пројекат и обавезно изаберите предложак 'Празна активност'. Ово је игра, тако да, наравно, нису вам потребни елементи попут дугмета ФАБ који комплицирају ствари.


Прво што желите да урадите је да промените АппЦомпатАцтивити до Активност. То значи да нећемо користити функције акционе траке.

Слично томе, такође желимо да нашу игру направимо преко целог екрана. Додајте следећи код онЦреате () пре позива на сетЦонтентВиев ():

гетВиндов (). сетФлагс (ВиндовМанагер.ЛаиоутПарамс.ФЛАГ_ФУЛЛСЦРЕЕН, ВиндовМанагер.ЛаиоутПарамс.ФЛАГ_ФУЛЛСЦРЕЕН); тхис.рекуестВиндовФеатуре (Виндов.ФЕАТУРЕ_НО_ТИТЛЕ);

Имајте на уму да ако напишете неки код и он се подвуче црвеном бојом, то вероватно значи да треба да увезете класу. Другим речима, требате да кажете Андроид Студио-у да желите да користите одређене изјаве и учините их доступним. Ако само кликнете било где на подвучену реч, а затим притиснете Алт + Ентер, онда ће се то аутоматски урадити за вас!

Стварање вашег приказа игре

Можда ћете бити употребљени за апликације које користе КСМЛ скрипту за дефинисање изгледа приказа као што су тастери, слике и налепнице. То је оно што је линија сетЦонтентВиев ради за нас.


Али опет, ово је игра што значи да не треба имати прозоре прегледача или померање погледа рециклаже. Уместо тога, желимо да покажемо платно уместо њега. У Андроид студију је платно исто као у уметности: то је медиј на којем можемо цртати.

Зато промените тај ред да бисте прочитали овако:

сетЦонтентВиев (нови ГамеВиев (ово))

Открићете да је ово још једном подвучено црвеном бојом. Али Сада ако притиснете Алт + Ентер, немате могућност да увезете класу. Уместо тога, имате могућност да креирати класа. Другим речима, направимо сопствену класу која ће дефинисати шта ће се догађати на платну. То је оно што ће нам омогућити да привучемо на екран, а не само да приказујемо готове приказе.

Тако лево кликните на име пакета у вашој хијерархији лево и изаберите Нова> класа. Сада ће вам се приказати прозор за креирање класе и назваћете га ГамеВиев. Под СуперЦлассом напишите: андроид.виев.СурфацеВиев што значи да ће класа наследити методе - њене способности - од СурфацеВиев.

У пољу (интерфејс) ћете писати андроид.виев.СурфацеХолдер.Цаллбацк. Као и код свих класа, и сада морамо да створимо наш конструктор. Користите овај код:

приватни МаинТхреад нит; јавни ГамеВиев (контекст контекста) {супер (контекст); гетХолдер (). аддЦаллбацк (ово); }

Сваки пут када је наша класа позвана да направи нови објект (у овом случају наша површина), покренут ће конструктор и створит ће нову површину. Редак 'супер' зове суперкласу, а у нашем случају то је СурфацеВиев.

Додавањем повратног позива, можемо пресрести догађаје.

Сада пребрисати неке методе:

@Оверриде јавна неважећа површинаПромењена (СурфацеХолдер држач, инт формат, инт ширина, инт висина) {} @Оверриде јавна празнина површинаСправљено (СурфацеХолдер Држач) {} @ Овервериде публиц воид сурфацеДестроиед (Држач СурфацеХолдер) {}

У основи нам омогућују прегласавање (отуда и имена) метода у суперкласи (СурфацеВиев). Сада не бисте требали да имате више црвених подвлака у коду. Леп.

Управо сте створили нову класу и сваки пут када се на то обратимо, она ће направити платно на којем ће се ваша игра насликати. Часови креирати објеката и треба нам још један.

Стварање нити

Зваће се наша нова класа МаинТхреад. А његов посао ће бити да створи нит. Конац је у основи сличан паралелном виљушку кода који може истовремено да се покреће поред главни део вашег кода. Можете имати пуно нити које покрећу све одједном, омогућавајући да се ствари одвијају истовремено, а не да се придржавате строге секвенце. Ово је важно за игру, јер се морамо потрудити да се она настави несметано одвијати, чак и када се пуно ради.

Креирајте своју нову класу баш као и раније, а овај пут ће се продужити Конац. У конструктору ћемо тек назвати супер (). Запамтите, то је супер класа, која је нит и која може да уради све тегобе за нас. Ово је попут стварања програма за прање посуђа које само зове машина за прање веша().

Када се ова класа назове, створиће се посебна нит која се покреће као одељак главне ствари. И то је од овде да желимо да направимо наш ГамеВиев. То значи да такође морамо упутити на ГамеВиев класу и користимо и СурфацеХолдер који садржи платно. Дакле, ако је платно површина, СурфацеХолдер је сталак. И ГамеВиев је оно што све заједно сачињава.

Комплетна ствар треба да изгледа овако:

јавна класа МаинТхреад проширује нит {привате СурфацеХолдер сурфацеХолдер; приватни ГамеВиев гамеВиев; јавна МаинТхреад (СурфацеХолдер сурфацеХолдер, ГамеВиев гамеВиев) {супер (); тхис.сурфацеХолдер = површинаХолдер; тхис.гамеВиев = гамеВиев; }}

Слатко. Сада имамо ГамеВиев и нит!

Прављење петље за игру

Сада имамо сировине које су нам потребне за израду наше игре, али ништа се не догађа. Овде долази петља за игре. У основи, ово је петља кода која се креће у круг и проверава уносе и променљиве пре него што цртате екран. Наш циљ је да то учинимо што доследнијим, тако да у раму не буде муцања и штуцања, што ћу истражити мало касније.

За сада смо још увек у МаинТхреад класе, а ми ћемо пребрисати методу из преткласа. Овај је трцати.

И иде мало овако:

@Оверриде јавно воид рун () {вхиле (трчање) {цанвас = нулл; покушајте {цанвас = тхис.сурфацеХолдер.лоцкЦанвас (); синхронизован (површински носач) {тхис.гамеВиев.упдате (); тхис.гамеВиев.драв (платно); }} хватање (Изузетак е) {} коначно {иф (цанвас! = нулл) {пробајте {сурфацеХолдер.унлоцкЦанвасАндПост (цанвас); } хватање (изузетак е) {е.принтСтацкТраце (); }}}}}

Видећете много подвлачења, тако да морамо додати још неколико променљивих и референци. Вратите се на врх и додајте:

приватни СурфацеХолдер сурфацеХолдер; приватни ГамеВиев гамеВиев; приватно бооле трчање; јавно статично платно од платна;

Не заборавите да увозите платно. Платно је ствар на којој ћемо заправо цртати. Што се тиче „лоцкЦанвас“, ово је важно јер оно у основи замрзава платно да би нам омогућило да цртамо на њему. То је важно јер у супротном можете имати више нити одједном покушавајући нацртати на њему. Само знајте да, да бисте уредили платно, прво морате закључати платно.

Ажурирање је метода коју ћемо створити и овде ће се дешавати забавне ствари.

Тхе покушати и улов у међувремену су једноставно захтеви Јаве који показују да смо вољни да испробамо изузеће (грешке) који би се могли догодити ако платно није спремно итд.

Коначно, желимо да можемо покренути нит када нам затреба. Да бисмо то учинили, требат ће нам овдје друга метода која нам омогућава да покренемо ствари. То је оно што трчање променљива је за (имајте на уму да је Боолеан тип променљиве која је увек истинита или лажна). Додајте ову методу у МаинТхреад класа:

јавни воид сетРуннинг (боолеан исРуннинг) {руннинг = исРуннинг; }

Али у овом тренутку треба још истакнути једну ствар и то је то ажурирање. То је зато што још увек нисмо креирали метод ажурирања. Тако да се вратите ГамеВиев и сада додајте метод.

јавно неважеће ажурирање () {}

И ми то требамо почетак нит! Урадићемо ово у нашем површински обрађено метода:

@Оверриде јавна неважећа површинаЦреате (СурфацеХолдер Држач) {тхреад.сетРуннинг (труе); тхреад.старт (); }

Такође морамо да зауставимо нит када је површина уништена. Као што сте можда претпоставили, средимо то у документу површинаДестроиед метод. Али с обзиром да заправо може бити потребно више покушаја заустављања нити, ово ћемо ставити у петљу и користити покушати и улов опет. Овако:

@Оверриде јавна воид површинаДестроиед (носилац СурфацеХолдер) {боолеан ретри = труе; вхиле (покушај) {покушај {тхреад.сетРуннинг (лажно); тхреад.јоин (); } ухватити (Прекинути Ексцепција е) {е.принтСтацкТраце (); } покушај = лажно; }}

И на крају, идите до конструктора и обавезно направите нову инстанцу своје нити, иначе ћете добити страшан изузетак нултог показивача! А онда ћемо ГамеВиев учинити фокусираним, што значи да може поднијети догађаје.

нит = нови МаинТхреад (гетХолдер (), ово); сетФоцусабле (труе);

Сада можете напокон У ствари тестирајте ову ствар! То је тачно, кликните покрени и то требало би заправо покренути без икаквих грешака. Припремите се за пухање!

То је ... то је ... празан екран! Сав тај код. За празан екран. Али, ово је празан екран прилика. Подигли сте површину и трчали помоћу петље за игре да бисте управљали догађајима. Сада је преостало само да се ствари догоде. Није чак важно ако нисте пратили све до сада. Поента је да овај код можете једноставно рециклирати и започети стварање сјајних игара!

Радим графику

Сада имамо празан екран који треба да нацртамо, све што треба да урадимо је да нацртамо на њему. Срећом, то је једноставан део. Све што требате је да надјачате методу извлачења у нашој ГамеВиев класа, а затим додајте неколико лепих слика:

@Оверриде јавно неважеће цртање (Цанвас цанвас) {супер.драв (платно); иф (цанвас! = нулл) {цанвас.дравЦолор (Цолор.ВХИТЕ); Паинт паинт = нова боја (); паинт.сетЦолор (Цолор.ргб (250, 0, 0)); цанвас.дравРецт (100, 100, 200, 200, боја); }}

Покрените ово и сада бисте требали имати прилично црвени квадрат у горњем левом делу иначе белог екрана. Ово је сигурно побољшање.

Теоретски бисте могли да створите поприлично целу своју игру тако што ћете је залијепити у ову методу (и прескочити) онТоуцхЕвент бавити се уносом), али то не би било страшно добар начин да се ствари почну радити. Постављање нове боје у нашу петљу знатно ће успорити ствари, чак и ако је ставимо негде другде, додајући превише кода у извући метода би постала ружна и тешко је следити.

Уместо тога, има много више смисла управљати предметима игре сопственим часовима. Почећемо са оним који показује лик и ова класа ће се звати ЦхарацтерСприте. Само напред и направи то.

Ова класа ће нацртати сприте на платну и изгледаће тако

јавна класа ЦхарацтерСприте {приватна Битмап слика; јавни знак карактера (Битмап бмп) {имаге = бмп; } јавно неважеће цртање (Цанвас цанвас) {цанвас.дравБитмап (слика, 100, 100, нула); }}

Да бисте ово користили, прво морате учитати битмапу, а затим позвати класу ГамеВиев. Додајте референцу на приватни знак карактераСприте а затим у површински обрађено метода, додајте линију:

знакСприте = нови знак карактера (БитмапФацтори.децодеРесоурце (гетРесоурцес (), Р.дравабле.авдгреен));

Као што видите, битна мапа коју учитавамо чува се у ресурсима и зове се авдгреен (била је из претходне игре). Сада све што требате да урадите је да проследите ту битмапу новој класи у извући метода са:

знакСприте.драв (платно);

Сада кликните Покрени и на екрану бисте требали видети вашу графику! Ово је БееБоо. Цртао сам га у школским уџбеницима.

Шта ако желимо да се овај мали крене? Једноставно: ми само креирамо к и и променљиве за његове позиције, а затим мењамо ове вредности у ан ажурирање метод.

Зато додајте референце својим ЦхарацтерСприте а затим нацртајте своју битну карту к, и. Овде направите метод ажурирања и за сада ћемо покушати само:

и ++;

Сваки пут када се покрене петља за игру, ми ћемо померати лик низ екран. Запамтити, и координате се мере одозго 0 је врх екрана. Наравно да морамо звати ажурирање метода у ЦхарацтерСприте од ажурирање метода у ГамеВиев.

Поново притисните репродукцију и сада ћете видети да ваша слика полако иде низ екран. Још увек не освајамо награде за игре, али то је почетак!

Ок, да направим ствари мало што је занимљивије, овде ћу само бацити неки код 'одскочне лопте' Ово ће учинити да се наш графички приказ извршава око ивица по ивицама, попут оних старих Виндовс сцреенсавера. Знате, чудно хипнотичке.

јавно неважеће ажурирање () {к + = кВелоцити; и + = брзина; иф ((к & гт; сцреенВидтх - имаге.гетВидтх ()) || (к <0)) {кВелоцити = кВелоцити * -1; } иф ((и & гт; сцреенХеигхт - имаге.гетХеигхт ()) || (и <0)) {иВелоцити = иВелоцити * -1; }}

Такође ћете морати да дефинишете ове променљиве:

приватни инт кВелоцити = 10; приватни инт иВелоцити = 5; привате инт сцреенВидтх = Ресоурцес.гетСистем (). гетДисплаиМетрицс (). видтхПикелс; привате инт сцреенХеигхт = Ресоурцес.гетСистем (). гетДисплаиМетрицс (). хеигхтПикелс;

Оптимизација

Постоји доста више завирити овде, од руковања подацима играча, скалирања слика, управљања мноштвом знакова који се крећу по екрану одједном. Тренутно лик скаче, али ако погледате врло пажљиво, постоји лагано муцање. Није страшно, али чињеница да то можете видети голим оком нешто је од знака упозорења. Брзина такође знатно варира на емулатору у поређењу с физичким уређајем. Сада замислите шта се дешава када имате тона догађа се на екрану одједном!

Постоји неколико решења за овај проблем. Оно што желим да почнем је да створим приватни цео број МаинТхреад и назовите то таргетФПС. Ово ће имати вредност 60.Покушаћу да моја игра буде покренута овом брзином и у међувремену ћу проверити да ли је. За то желим и приватни двоструки звани просечниФПС.

Такође ћу да ажурирам трцати методом за мјерење колико дуго траје свака петља игре и затим пауза та петља игре привремено ако је испред таргетФПС. Затим ћемо израчунати колико дуго Сада узео је и затим то одштампао како бисмо га видели у дневнику.

@Оверриде публиц воид рун () {лонг стартТиме; дуго времеМиллис; дуго чекање; лонг тоталТиме = 0; инт фрамеЦоунт = 0; лонг таргетТиме = 1000 / таргетФПС; док (трчање) {стартТиме = Систем.наноТиме (); цанвас = нулл; покушајте {цанвас = тхис.сурфацеХолдер.лоцкЦанвас (); синхронизован (површински носач) {тхис.гамеВиев.упдате (); тхис.гамеВиев.драв (платно); }} хватање (Изузетак е) {} коначно {иф (цанвас! = нулл) {пробајте {сурфацеХолдер.унлоцкЦанвасАндПост (цанвас); } хватање (изузетак е) {е.принтСтацкТраце (); }}} тимеМиллис = (Систем.наноТиме () - стартТиме) / 1000000; ваитТиме = таргетТиме - тимеМиллис; пробајте {тхис.слееп (ваитТиме); } хватање (Изузетак е) {} тоталТиме + = Систем.наноТиме () - стартТиме; фрамеЦоунт ++; иф (фрамеЦоунт == таргетФПС) {просјечноФПС = 1000 / ((укупноТиме / фрамеЦоунт) / 1000000); фрамеЦоунт = 0; тоталТиме = 0; Систем.оут.принтлн (просјечниФПС); }}}

Сада наша игра покушава да фиксира ФПС на 60 и требали бисте установити да генерално мери прилично стабилних 58-62 ФПС-а на модерном уређају. На емулатору можете добити другачији резултат.

Покушајте да промените тих 60 до 30 и видите шта се догађа. Игра се успорава и то требало би сада прочитајте 30 у вашем логцату.

Завршне мисли

Постоје још неке ствари које можемо да урадимо да бисмо побољшали перформансе. Овде је сјајна објава на блогу. Покушајте да се суздржите од стварања нових примерака Паинт или битмапа унутар петље и урадите све иницијализације напољу пре него што игра почне.

Ако планирате да креирате следећу хит Андроид игра, онда је ту сигурно лакших и ефикаснијих начина да се то данас реши. Али дефинитивно још увек постоје сценарији употребе случајева за цртање на платну и врло је корисна вештина додавања вашем репертоару. Надам се да је овај водич донекле помогао и да вам желим срећу у вашим предстојећим пројектима кодирања!

СледећиВодич за почетнике за Јаву

Ажурирано, 28. јануара 2019, 05:50 ЕТ:Самсунг сада објављује Андроид Пие ажурирање на Галаки Ноте 9 у Великој Британији. Корисник Твиттера упозорио је ажурирање на њега раније данас и недавно објављен...

Ноте 9 је био најбољи Андроид паметни телефон 2018. године писцима, али и нашим читаоцима. Галаки Ноте 10 је сада одмах иза угла, али овај Самсунг Галаки Ноте 9 договор у Амазону је преслатки да би г...

Чланци Портала