Kaip parašyti savo pirmąjį „Android“ žaidimą „Java“

Autorius: John Stephens
Kūrybos Data: 1 Sausio Mėn 2021
Atnaujinimo Data: 19 Gegužė 2024
Anonim
How to Make a Tic Tac Toe Game in Android [Java 2020]
Video.: How to Make a Tic Tac Toe Game in Android [Java 2020]

Turinys


Yra daugybė būdų, kaip sukurti žaidimą „Android“, ir vienas svarbus būdas yra tai padaryti nuo nulio „Android Studio“ su „Java“. Tai suteikia jums maksimalią kontrolę, kaip norite, kad jūsų žaidimas atrodytų ir elgtųsi, ir procesas išmokys jus įgūdžių, kuriuos galite naudoti ir daugelyje kitų scenarijų - nesvarbu, ar kuriate programos ekraną, ar tiesiog norite pridėkite keletą animacijų. Atsižvelgiant į tai, ši pamoka parodys, kaip sukurti paprastą 2D žaidimą naudojant „Android Studio“ ir „Java“. Visą kodą ir išteklius galite rasti „Github“, jei norite sekti.

Nustatymas

Norėdami sukurti savo žaidimą, mums reikės nagrinėti keletą konkrečių sąvokų: žaidimo kilpų, siūlų ir drobių. Pirmiausia paleiskite „Android Studio“. Jei dar neturite jo įdiegę, peržiūrėkite išsamų mūsų „Android Studio“ įvadą, kuriame aprašomas diegimo procesas. Dabar pradėkite naują projektą ir įsitikinkite, kad pasirinkote šabloną „Tuščia veikla“. Tai yra žaidimas, taigi, žinoma, jums nereikia tokių elementų kaip „FAB“ mygtukas, apsunkinantis reikalus.


Pirmas dalykas, kurį norite padaryti, yra pasikeisti „AppCompatActivity“ į Veikla. Tai reiškia, kad mes nenaudosime veiksmų juostos funkcijų.

Panašiai mes norime, kad mūsų žaidimas būtų rodomas per visą ekraną. Pridėkite šį kodą „onCreate ()“ prieš skambutį į „setContentView“):

„getWindow (). setFlags“ („WindowManager.LayoutParams.FLAG_FULLSCREEN“, „WindowManager.LayoutParams.FLAG_FULLSCREEN“); this.requestWindowFeature (langas.FEATURE_NO_TITLE);

Atminkite, kad jei jūs išrašote tam tikrą kodą ir jis pabraukiamas raudonai, tai greičiausiai reiškia, kad turite importuoti klasę. Kitaip tariant, turite pasakyti „Android Studio“, kad norite naudoti tam tikrus teiginius ir padaryti juos prieinamus. Jei paspausite bet kurioje vietoje pabrauktą žodį ir paspausite „Alt“ + „Enter“, tai bus padaryta automatiškai!

Sukurkite savo žaidimo rodinį

Galite būti pripratę prie programų, kurios naudoja XML scenarijų, kad apibrėžtumėte tokių rodinių, kaip mygtukai, vaizdai ir etiketės, išdėstymą. Štai kokia linija „setContentView“ daro mus.


Bet vėlgi, tai yra žaidimas, reiškiantis, kad jam nereikia turėti naršyklės langų ar slinkti perdirbėjo rodiniais. Vietoj to mes norime parodyti drobę. „Android Studio“ drobė yra tokia pati kaip ir mene: tai laikmena, kuria galime piešti.

Taigi pakeiskite šią eilutę ir skaitykite taip:

„setContentView“ (nauja „GameView“ (ši))

Pamatysite, kad tai dar kartą paryškinta raudona spalva. Bet dabar jei paspausite „Alt“ + „Enter“, neturėsite galimybės importuoti klasės. Vietoj to, jūs turite galimybę kurti klasė. Kitaip tariant, mes ketiname sukurti savo klasę, kuri apibrėžtų, kas bus ant drobės. Tai leis mums atkreipti dėmesį į ekraną, o ne tik rodyti paruoštus vaizdus.

Taigi dešiniuoju pelės mygtuku spustelėkite paketo pavadinimą savo hierarchijoje kairėje ir pasirinkite Nauja> klasė. Dabar jums bus pateiktas langas, kad galėtumėte sukurti savo klasę, ir jūs ketinate tai paskambinti „GameView“. Skiltyje SuperClass parašykite: „android.view.SurfaceView“ o tai reiškia, kad klasė paveldės metodus - savo galimybes - iš SurfaceView.

Laukelyje Sąsaja (-os) parašysite android.view.SurfaceHolder.Atgalinis. Kaip ir bet kuriai klasei, dabar turime sukurti savo konstruktorių. Naudokite šį kodą:

privatus „MainThread“ siūlas; public GameView (kontekstinis kontekstas) {super (kontekstas); „getHolder“ (). „addCallback“ (tai); }

Kiekvieną kartą, kai mūsų klasė bus pašaukta sukurti naują objektą (šiuo atveju mūsų paviršių), jis paves konstruktorių ir sukurs naują paviršių. Linija „super“ vadina superklase, o mūsų atveju tai yra „SurfaceView“.

Pridėję atgalinį ryšį, mes galėsime perimti įvykius.

Dabar nepaisykite kai kurių metodų:

@Paversti viešą tuštumos paviršiųPakeistas („SurfaceHolder“ laikiklis, vidinis formatas, int plotis, vidinis aukštis) {} @Paskelbti negaliojantį tuščią paviršiųSukurtas („SurfaceHolder“ laikiklis) {} @Atlikti viešojo tuštumos paviršiųNustatytas („SurfaceHolder“ laikiklis) {}

Tai iš esmės leidžia mums nepaisyti (taigi ir pavadinimo) metodų superklasėje (SurfaceView). Dabar jūsų kode neturėtų būti daugiau raudonų pabraukimų. Malonu.

Jūs ką tik sukūrėte naują klasę ir kiekvieną kartą, kai mes apie tai kalbame, ji sukurs jūsų žaidimo drobę, kad tapytumėte. Klasės kurti objektų ir mums reikia dar vieno.

Sukurti siūlai

Bus vadinama mūsų naujoji klasė „MainThread“. Ir jos darbas bus sukurti siūlą. Siūlas iš esmės yra lygiagreti kodo šakutė, kuri gali veikti kartu su pagrindinis jūsų kodo dalis. Galite turėti daugybę gijų, paleidžiančių visus iš karto, tokiu būdu leisdami viskam vykti vienu metu, o ne laikydamiesi griežtos sekos. Tai svarbu žaidimui, nes turime pasirūpinti, kad jis vyktų sklandžiai, net kai daug vyksta.

Sukurkite savo naują klasę taip, kaip jūs darėte anksčiau, ir šį kartą ji pratęsis Siūlas. Konstruktoriui mes tiesiog skambinsime super (). Atminkite, kad tai „super“ klasė, kuri yra „Thread“ ir kuri mums gali padaryti sunkų kėlimą. Tai yra tarsi programos sukūrimas plauti indus, kurie tiesiog skambina Skalbimo mašina().

Kai ši klasė vadinama, ji sukurs atskirą siūlą, kuris bus pagrindinis dalykas. Ir tai yra iš čia kad norime sukurti savo „GameView“. Tai reiškia, kad mes taip pat turime remtis „GameView“ klase ir mes taip pat naudojame „SurfaceHolder“, kuriame yra drobė. Taigi, jei drobė yra paviršius, „SurfaceHolder“ yra molbertas. „GameView“ yra tai, kas visa tai sujungia.

Visas daiktas turėtų atrodyti taip:

viešosios klasės „MainThread“ pratęsia giją {private SurfaceHolder surfaceHolder; privatus „GameView“ žaidimų vaizdas; viešas „MainThread“ („SurfaceHolderfaceHolder“, „GameView gameView“) {super (); this.surfaceHolder = surfaceHolder; this.gameView = gameView; }}

Schweet. Dabar turime „GameView“ ir giją!

Žaidimo kilpos kūrimas

Dabar turime žaliavų, kurių reikia žaidimui, bet nieko nevyksta. Čia įeina žaidimo kilpa. Iš esmės tai yra kodo kilpa, kuri eina apvalia ir patikrina įvestis bei kintamuosius prieš piešiant ekraną. Mūsų tikslas yra tai padaryti kuo nuoseklesnį, kad kadre nebūtų jokių mikčiojimų ar žagsėjimų, kuriuos ištirsiu šiek tiek vėliau.

Kol kas mes vis dar esame „MainThread“ klasę ir mes pakeisime metodą iš superklasės. Tai yra bėgti.

Tai šiek tiek panašu į tai:

@Atšaukti viešą negaliojantį paleidimą () {o (veikia) {drobė = nulis; pabandykite {drobė = this.surfaceHolder.lockCanvas (); sinchronizuotas („surfaceHolder“) {this.gameView.update (); this.gameView.draw (drobė); }} pagauti (išimtis e) {} pagaliau {if (drobė! = nulis) {pabandyti {surfaceHolder.unlockCanvasAndPost (drobė); } pagauti (išimtis e) {e.printStackTrace (); }}}}}

Pamatysite daug pabraukimų, todėl turime pridėti dar keletą kintamųjų ir nuorodų. Eikite atgal į viršų ir pridėkite:

privatus „SurfaceHolder“ paviršiaus savininkas; privatus „GameView“ žaidimų vaizdas; privatus boolean bėgimas; viešos statinės drobės drobė;

Nepamirškite importuoti drobės. Drobė yra dalykas, kurį iš tikrųjų piešime. Kalbant apie „lockCanvas“, tai svarbu, nes būtent tai, kas iš esmės užšaldo drobę, leidžia mums piešti. Tai svarbu, nes priešingu atveju galėtumėte turėti keletą gijų, bandančių piešti iš karto. Tiesiog žinokite, kad norėdami redaguoti drobę, pirmiausia turite užraktas drobė.

Atnaujinimas yra metodas, kurį ketinsime sukurti, ir čia vėliau įvyks įdomus dalykas.

bandyti ir pagauti tuo tarpu tai yra tiesiog „Java“ reikalavimai, parodantys, kad mes norime pabandyti tvarkyti išimtis (klaidas), kurios gali atsirasti, jei drobė nėra paruošta

Galiausiai norime sugebėti pradėti savo giją, kai mums jos reikia. Norėdami tai padaryti, mums čia reikės kito metodo, kuris leistų mums viską pradėti. Štai ką bėgimas kintamasis skirtas (atminkite, kad loginis rodiklis yra kintamojo tipas, kuris visada yra teisingas arba klaidingas). Pridėkite šį metodą prie „MainThread“ klasė:

public void setRunning (boolean isRunning) {running = isRunning; }

Tačiau šiuo metu vis tiek reikėtų pabrėžti vieną dalyką atnaujinti. Taip yra todėl, kad dar nesukūrėme atnaujinimo metodo. Taigi pop vėl „GameView“ ir dabar pridėkite metodą.

viešas negaliojantis atnaujinimas () {}

Mes taip pat turime pradžia gija! Mes tai padarysime savo paviršiusSukurtas metodas:

@Paversti viešą tuščią paviršiųSukurtas („SurfaceHolder“ laikiklis) {thread.setRunning (true); siūlas.start (); }

Mes taip pat turime sustabdyti siūlą, kai paviršius sunaikinamas. Kaip jau spėjote atspėti, tai mes tvarkome paviršius vaizduojamas metodas. Tačiau matant, kad tai gali užtrukti kelis kartus, norint sustabdyti siūlą, mes įtrauksime tai į eilutę ir naudosime bandyti ir pagauti vėl. Patinka taip:

@Vaikinti viešą tuščią paviršiųDestroyed („SurfaceHolder“ laikiklis) {boolean retry = true; while (bandyti dar kartą) {pabandyti {thread.setRunning (false); siūlas.join (); } pagauti („InterruptedException e“) {e.printStackTrace (); } pakartoti = klaidinga; }}

Ir galiausiai, eikite prie konstruktoriaus ir būtinai sukurkite naują savo gijos egzempliorių, kitaip gausite baimę dėl niekinių rodyklių išimties! Tada „GameView“ sutelksime dėmesį, ty jis gali tvarkyti įvykius.

gija = nauja „MainThread“ („getHolder“), ši); setFocusable (true);

Dabar gali pagaliau iš tikrųjų išbandyk šį dalyką! Teisingai, spustelėkite paleisti ir viskas turėtų iš tikrųjų paleisti be klaidų. Pasiruoškite būti išpūstas!

Tai… tai… tuščias ekranas! Visas tas kodas. Už tuščią ekraną. Bet tai tuščias ekranas galimybė. Turite paruošti savo paviršių ir naudoti žaidimo kilpą, kad galėtumėte tvarkyti įvykius. Dabar liko tik tai, kad viskas įvyks. Net nesvarbu, ar iki šiol nesekėte visko vadove. Esmė ta, kad jūs galite tiesiog perdirbti šį kodą ir pradėti kurti šlovingus žaidimus!

Daryti grafiką

Teisingai, dabar turime tuščią ekraną, ant kurio turime piešti, viskas, ką turime padaryti, - piešti ant jo. Laimei, tai paprasta dalis. Viskas, ką jums reikia padaryti, tai nepaisyti mūsų piešimo metodo „GameView“ klasę ir pridėkite keletą gražių nuotraukų:

@Paversti viešą tuštumų piešinį (drobė drobė) {super.draw (drobė); if (drobė! = nulis) {canvas.drawColor (Color.WHITE); Dažų dažai = nauji dažai (); „paint.setColor“ („Color.rgb“ (250, 0, 0)); drobė.drawRect (100, 100, 200, 200, dažai); }}

Vykdykite tai, ir dabar balto ekrano viršutiniame kairiajame kampe turėtumėte būti raudonos spalvos kvadratas. Tai tikrai yra patobulinimas.

Teoriškai galėtumėte sukurti beveik visą savo žaidimą, įklijuodami jį į šį metodą (ir nepaisydami jo „onTouchEvent“ tvarkyti įvestį), tačiau tai nebūtų baisiai geras būdas viską tvarkyti. Įdėję naują „Dažą“ į savo kilpą, viskas sulėtės ir net jei įdėsime jį kur nors kitur, įdėdami per daug kodo piešti metodas būtų negraži ir sunku laikytis.

Vietoj to, daug prasmingiau žaidimų objektus tvarkyti su savo klasėmis. Pradėsime nuo to, kuris parodo veikėją, ir ši klasė bus vadinama „CharacterSprite“. Eik į priekį ir padaryk tai.

Ši klasė nubraižys drobę ant drobės ir atrodys taip

viešos klasės „CharacterSprite“ {privatus „bitmap“ vaizdas; public CharacterSprite (bitmap bmp) {image = bmp; } public void draw (drobė drobė) {canvas.drawBitmap (vaizdas, 100, 100, nulis); }}

Dabar, jei norite tai naudoti, pirmiausia turėsite įkelti bitkoiną ir tada paskambinti į klasę „GameView“. Pridėti nuorodą į privatus CharacterSprite characterSprite ir tada paviršiusSukurtas metodas, pridėkite eilutę:

characterSprite = naujas CharacterSprite (BitmapFactory.decodeResource (getResources (), R.dravable.avdgreen));

Kaip matote, mūsų įkeliamas bitkoinas yra saugomas ištekliuose ir vadinamas avdgreen (jis buvo iš ankstesnio žaidimo). Dabar viskas, ką jums reikia padaryti, tai perduoti tą bitkoiną naujai klasei piešti metodas su:

„characterSprite.draw“ (drobė);

Dabar spustelėkite paleisti ir ekrane turėtumėte pamatyti savo grafiką! Tai „BeeBoo“. Aš jį piešiau savo mokyklos vadovėliuose.

O kas, jei norėtume priversti šį mažą vaikiną pajudėti? Paprasta: mes tiesiog sukuriame x ir y kintamuosius jo pozicijoms ir tada keičiame šias reikšmes an atnaujinti metodas.

Taigi pridėkite nuorodas į savo „CharacterSprite“ ir tada nubrėžkite savo bitmap x, y. Sukurkite atnaujinimo metodą čia ir dabar mes tik bandysime:

y ++;

Kiekvieną kartą žaidimo kilpa pajudinsime simbolį žemyn ekrano. Prisiminti, y koordinatės matuojamos iš viršaus taip 0 yra ekrano viršuje. Žinoma, turime paskambinti atnaujinti metodas „CharacterSprite“ nuo atnaujinti metodas „GameView“.

Dar kartą paspauskite „play“ ir dabar pamatysite, kad vaizdas lėtai atsekė ekraną. Kol kas nesame laimėję nė vieno žaidimo apdovanojimo, tačiau tai yra pradžia!

Gerai, kad viskas susitvarkė Lengvai Įdomiau, kad čia tiesiog numesiu „atšokančio kamuolio“ kodą. Tai leis mūsų grafikos paveikslėliams atsiriboti nuo ekrano kraštų, kaip ir senosios „Windows“ ekrano užsklandos. Žinote, keistai hipnotizuojantys.

public void update () {x + = xVelocity; y + = yVelocity; if ((x> ekrano plotis - image.getWidth ()) || (x & lt; 0)) {xVelocity = xVelocity * -1; } if ((y> screenHeight - image.getHeight ()) || (y <0)) {yVelocity = yVelocity * -1; }}

Taip pat turėsite apibrėžti šiuos kintamuosius:

private int xVelocity = 10; private int yVelocity = 5; privatus vidinis ekrano plotis = Resources.getSystem (). getDisplayMetrics (). private int screenHeight = Resources.getSystem (). getDisplayMetrics (). heightPixels;

Optimizavimas

Yra gausiai čia reikia gilintis nuo grotuvo įvesties iki vaizdų mastelio keitimo ir daugybės simbolių, judančių visame ekrane, tvarkymo. Šiuo metu veikėjas šokteli, bet jei labai atidžiai pažiūrėsite, tai šiek tiek mikčioja. Tai nėra baisu, tačiau tai, kad matote plika akimi, yra įspėjamasis ženklas. Greitis emuliatoriuje taip pat labai skiriasi, palyginti su fiziniu įrenginiu. Dabar įsivaizduokite, kas nutiks, kai turėsite tonų vyksta ekrane iškart!

Yra keli šios problemos sprendimai. Ką aš norėčiau pradėti, tai sukurti asmeninį sveikąjį skaičių „MainThread“ ir paskambink targetFPS. Tai turės 60 vertės.Aš stengsiuosi, kad mano žaidimas vyktų tokiu greičiu, o aš tikrinsiu, ar jis yra. Tam aš taip pat noriu privataus dvigubo skambučio vidutinisFPS.

Aš taip pat ketinu atnaujinti bėgti metodas, skirtas išmatuoti, kiek laiko trunka kiekviena žaidimo kilpa ir po to Pauzė laikinai tą žaidimo kilpą, jei ji lenkia tikslą FPS. Tada mes apskaičiuosime, kiek laiko jis truks dabar paėmė ir išspausdino, kad galėtume tai pamatyti žurnale.

@Atšaukti viešą negaliojančią paleidimą () {long startTime; ilgaiMillis; ilgai laukti laiko; ilgas totalTime = 0; int frameCount = 0; ilgas targetTime = 1000 / targetFPS; o (veikia) {startTime = System.nanoTime (); drobė = nulis; pabandykite {drobė = this.surfaceHolder.lockCanvas (); sinchronizuotas („surfaceHolder“) {this.gameView.update (); this.gameView.draw (drobė); }} pagauti (išimtis e) {} pagaliau {if (drobė! = nulis) {pabandyti {surfaceHolder.unlockCanvasAndPost (drobė); } pagauti (išimtis e) {e.printStackTrace (); }}} timeMillis = (System.nanoTime () - startTime) / 1000000; waitTime = targetTime - timeMillis; pabandykite {this.sleep (waitTime); } pagauti (išimtis e) {} totalTime + = System.nanoTime () - startTime; frameCount ++; if (frameCount == targetFPS) {averageFPS = 1000 / ((totalTime / frameCount) / 1000000); „frameCount“ = 0; totalTime = 0; „System.out.println“ (vidutinisFPS); }}}

Dabar mūsų žaidimas bando užfiksuoti jo FPS iki 60 ir turėtumėte pastebėti, kad paprastai šiuolaikiniame įrenginyje jis matuoja gana stabilų 58–62 FPS. Emuliatoriuje galite gauti kitokį rezultatą.

Pabandykite pakeisti tą 60 į 30 ir sužinokite, kas atsitiks. Žaidimas sulėtėja ir jis turėtų dabar perskaitykite 30 jūsų logcat.

Minčių uždarymas

Yra keletas kitų dalykų, kuriuos galime padaryti ir optimizuodami našumą. Čia yra puikus tinklaraščio įrašas šia tema. Stenkitės niekada nekurti naujų „Paint“ ar bitkoinų pavyzdžių kilpos viduje ir atlikite visus veiksmus lauke prieš prasidedant žaidimui.

Jei planuojate sukurti kitą populiarų „Android“ žaidimą, tada yra be abejo lengvesniais ir efektyvesniais būdais šiomis dienomis. Tačiau neabejotinai vis dar yra scenarijų, pagal kuriuos galima piešti ant drobės, ir tai yra labai naudingas įgūdis įtraukti į savo repertuarą. Tikiuosi, kad šis vadovas šiek tiek padėjo ir linkiu kuo geriausios kloties būsimose kodavimo įmonėse!

KitasPradinis „Java“ vadovas

„ony“ pradeda avo 3D ToF fotoaparatų gamybą 2019 metam.Pranešama, kad fotoaparatai šiai metai pairody priekyje ir gale.3D ToF kamero įgalina partenį veido atpažinimą ir galimybę nukaityti objektu 3D f...

Nauja „ony“ vaizdo įraša parodė galima funkcija, kuria įgalino „3D ToF“ fotoaparatų technologija.Motyvuoti cenarijai apima virtualių objektų pridėjimą prie realau paaulio objektų ir amenukių nuotraukų...

Daugiau Informacijos