Uzorak plan razvoja igre za Android. Neuspjeh u duljini godišnje, ili iskustvo razvoja igre za Android

Pozdrav svima.
Ova lekcija je napisana u ožujku 2012. Sada sam odlučio objaviti ga ovaj resurs, Kod se odlučio ne mijenjati, ja ga pitati puno da ne pronađe grešku (ja bih rekao). Malo je rafiniran tekstom lekcije i komentara u kodu. Svrha lekcije nije učiti igru \u200b\u200bkoja u jednoj lekciji je nemoguća u sebi, ali pokazati osnove rada s mobilnim zrakom. Zašto Android, a ne ios? Jer u vrijeme pisanja lekcije, samo je bio. Pod iOS-om sve se radi gotovo na isti način, ali postoje neke razlike koje su napisane na kraju drugog dijela lekcije.
Bit će mi drago na bilo kakve komentare, komentare, naznaku pogrešaka.

Malo teorije.

Adobe Air omogućuje stvaranje na Actionscript 3 i MXML za iOS i Apsoroid aplikacijekoji za korisnika neće razlikovati bilo koga. Oni, kao i bilo koje izvorne aplikacije, mogu se distribuirati branded trgovine Apple AppStore i Google Play. Trgovina ( bivši android Tržište). Iz inačice zraka 3.2 pojavio se potpora Fage3D. Za rad Air Applications na Androidu morate instalirati na uređaj za runtiranje zraka ili prilikom sastavljanja utimenovanje zarobljenika, ugrađeni medij je ugrađen u APK. U isto vrijeme, instalacija zračnog izvođenja nije potrebno za uređaj.

Kada radite s mobilnim uređajima, treba imati na umu da su rezolucije njihovih prikaza u nastavku (već postoje one koje su viši) od monitora računala i njihove fizičke dimenzije su također znatno manje. Tu su i takvi koncepti kao "fizička veličina piksela" i "gustoće piksela", tako da morate obratiti pozornost na veličinu raznih grafičkih elemenata (tipke, znakova igre, itd.). Općenito, ovo je cijela znanost i nećemo se detaljno zadržati.
Metoda ulaza - zaslon osjetljiv na dodir. Za obradu dodirnog unosa postoji poseban događaj osjetljivog na dodir, iako se događaji miša ispravno obrađuju. Tu su i druge značajke koje ću reći tijekom lekcije.
Učinit ćemo vrlo jednostavna igra Za Android. To će biti moguće pokrenuti na pametnim telefonima, tabletama i bilo kojim drugim uređajima.
Okruženje za implementaciju zraka ima neke hardverske i softverske zahtjeve.
Za Android izgledaju ovako:
- Android verzija 2.2 ili više;
- procesor s ARM7 arhitekturom s učestalošću od najmanje 550MHz;
- Najmanje 256 megabajta RAM-a.

Zahtjevi za druge platforme mogu se naći kao referenca.

Da bismo izvršili lekciju, trebat ćemo sljedeće:
- flashDevelop 4.2;
- Flex SDK 4.6;
- Zračni SDK 3.5;
- knjižnica iz Greensocka;
- uređaj na androidu. Možete učiniti i emulator, ali to nije tako zanimljivo;
- instaliran na zračni uređaj.

Verzije su naznačene stvarne u vrijeme objavljivanja lekcije. Već postoje FLEX SDK 4.8, ali u stvari to je isti 4.6. A od 4.8 Imam FlashDevelop počinje absora apsorbirati RAM, nije jasno zašto. Bolje je koristiti zadnja verzija Air SDK, budući da se dodaju nove značajke sa svakim izdanjem i greške su ispravljene. Zračni SDK samo trebate raspakirati Flex SDK mapu s zamjenom datoteke i povezati Flex SDK kako biste plašili.

Što ćemo točno učiniti.

Izrada ćemo biti mala igra. Čini se sljedeće: na vrhu zaslona. Brojke padaju. Dno je platforma, koju trebate uhvatiti ove brojke ili ne uhvatiti ovisno o njihovom tipu. Igra se sastoji od tri ekrana:
- Glavni izbornik s pozadinom, logotipom i dva gumba. Jedan za početak igre, drugi za izlaz iz aplikacije;
- Igra zaslon. Sadrži platformu koja pada brojke kao i pokazatelje trenutne razine i bodova. I izlazni gumb u glavni izbornik;
- Prikaz zaslona broja bodova s \u200b\u200bgumbima za izlaz iz izbornika i "ponovno reproducirati".

Par screenshots:

Početak.

Za početak, provjerite je li uređaj instaliran na uređaju, ako nije instaliran, instalirati. Također instalirajte upravljački program za vaš uređaj za povezivanje s kabelom.

Pokrenite FlashDevelop i stvorite novi Air AS3 mobilni App projekt. Tako izgleda stvoreni projekt:

Ono što vidimo ispred njih:

Mapa šišmiša sadrži nekoliko batch datoteke:
- CreateEcertifinate.bat. Trebate generirati samopotpisanu certifikat za Android. Bez ovog certifikata neće biti moguće prikupiti apk;
- InstallairRuntime.bat. Postavlja vrijeme izvođenja zraka Android uređaj Od% flex_sdk% trčanje android uređaja runtime.apk. Bolje samostalno instalirati najnoviju verziju androida Trgovina igračaka.;
- Packager.bat. Paketi USB flash pogon u APK (Android) ili IPA (iOS);
- Setupapplication.bat. Sadrži razne parametre aplikacije (staze do certifikata, lozinke od njih, naziv aplikacije, itd.);
- Setupsdk.bat. Sadrži put do FlexDK-a. Određuje se automatski, ako se ne odredi, morate se ručno registrirati. I također sadrži put do Androidsdk. Zapravo, potrebne su samo tri datoteke: adb.exe., Adbwinapi.dll i Adbwinusbapi.dll., Štoviše, oni su već sadržani u flashdevelop distribuciji, a put do njih također se propisuje.

U mapi bin. Kompilirana SWF datoteka je postavljena.
U mapi cERT. Certifikati moraju lagati.
Mapa ikone Sadrži skupove ikona.
Dvije standardne mape lib i src Za knjižnice i klase.

Korijenska mapa:
- standard za aplikacije za zrak application.xml. s različitim parametrima aplikacija;
- Packageapp.bat. Omogućuje vam da odaberete platformu i vrstu pakiranja aplikacije. Nakon odabira pakiranja. Pojavljuje se mapa dist. c apk ili IPA;
- Run.bat. Ispunjava aplikaciju na mobilni uređaj i pokreće ga tamo;
- Dvije datoteke Air_android_readme.txt i Air_os_readme.txt s uputama.

Postavljanje projekta.

Otvorite postavke projekta Projekt / prziti., Promijenite boju pozadine na crnu. Rezolucija nema vrijednost. Prilagodit ćemo se trenutnoj.
Izložba izložbe verzije 3.5. Kao rezultat toga, parametri bi trebali izgledati ovako:

Otvorite datoteku application.xml.U njemu, u drugoj liniji, promijenite verziju zraka za 3,5:

Postavke otvorenog zraka - Projekt / Air App svojstes, U prozoru koji se otvara, idite na karticu Početni prozor., U ovom prozoru odaberite Ne-prozorene platforme.
Prebacimo način prikaza na portret. I isključite auto orijentaciju, jer će igra biti samo u portretnom načinu. Izložba načina rada CPU. ili Direktno., Postavke bi trebale izgledati ovako:


Zatim, točno u FlashDevelop dvaput kliknite Otvori datoteku Run.bat. I promijenite niz goto desktop. na goto android-debug, Potrebno je testirati projekt na uređaju. Ako odeš goto desktop.Projekt će biti lansiran na emulatoru.

Sada moramo generirati certifikat. Bez nje, neće biti moguće spakirati aplikaciju v.apk. Ako mapa cERT. Nitko u projektu, ne stvorite ga ručno. To je važno, jer datoteka šišmiša neće biti u mogućnosti doći do nepostojeće mape. Pokrenuti datoteku Šišmiš / creacecertificate.bat.(Desni klik / Izvrši), u mapi cERT. Naš certifikat se pojavljuje sa standardnom lozinkom "FD". Važno je reći da je Android aplikacija mora potpisati certifikat. Ono što smo generirali je takozvani "certifikat za razvoj". U ovoj fazi je dovoljno.

Iz arhive s mjesta Greensock.com Dobijte datoteku greensock.swc., stavite ga u mapu lib I povezivanje s projektom (desni klik / DODAJTE u biblioteku).

S postavljanjem svega. Dodajte željeni raspored i ikone na projekt. Stvorite mapu imovina. I staviti grafiku iz arhive tamo, također zamijeniti ikone. Ili možete izvući vlastite analoge.

Doći do koda.

A sada najvažnija stvar i zanimljiva - pišemo kodeks. Igra klase izgledaju ovako:

Itemtype. - Vrste objekata. Oni koji najviše padaju na vrhu zaslona
Konstante paketa (/ ** * statički konstantan za određivanje vrste objekta igre. * * @Author iluzor * / javni klasactType (/ ** normalan objekt. Dodaje jedinicu za bodove * / javno statičko const dobro: string \u003d "Goodyitem" ; / ** "vrlo dobar" objekt. Dodaje 5 to bodova * / javni statički const vrlo_good: String \u003d "VrhoodItem"; / ** "Angry" objekt. Uzmi jedinicu iz naočala * / javnih statičkih konstantnih zlih: String \u003d " zloslona;))
ScreenType. - Vrste zaslona. Imamo ih troje i opisani su gore
Paket konstanti (/ ** * Statične konstante za određivanje tipa zaslona * * @Author iluzor * / javni razred ScREAL: (/ ** Glavni izbornik * / Javni statički CONSTIN Main_MENU: String \u003d "Mainmenu"; / ** igra zaslon * / Javno navođenje Const Game_Screen: String \u003d "Gamescreen"; / ** zaslon s prikazom rezultata igre * / javnog statičkog consport_screen: string \u003d "screscreen";))))
Gameevent - Igra događaji
Paket događanja (** * * * * * * * * * * @Author iluzor * / javna klasa GameEvent proširuje događaj (/ ** iz igre u glavnom izborniku putem gumba MENU * / Javni statički COST EXIT_GAME: String \u003d "EXITGAME"; / ** Igranje * / Public Static Const Game_Over: String \u003d "GameOver"; Javna funkcija GameEEVent (Vrsta: String, Bubbles: Boolean \u003d FALSE, CALSE): Boolean \u003d False) (Super (vrsta, mjehurići, odustajanje) ;) Funkcija javnog nadjačanja Clone (): događaj (povratak novog GameEvent (vrsta, mjehurići, odustani);) javni nadjačaj funkcija tostring (): niz (povratak formittring ("Gameevent", "tip", "mjehurići", , "Eventfase");)))))
Sada razmislite o paketu elementi, To su različiti grafički elementi koji se koriste u igri.

Dugme. - Klasa gumba. Sadrži grafička slika i tekst. Ima dvije države: pritisnute / ne pritisnute
Elementi paketa (uvoz com.greensock.TweendLite; uvoz Flash.display.Bitmap; uvoz Flash.display.Sprite; uvoz Flash.events.events.events.events.TouchEvent; Uvoz Flash.Text.Text.Text.Texts; Uvoz alata.Tools; / ** * Klasa gumba, koji se koristi u izborniku i drugdje. * * @Author iluzor * / Tipka za javne klase Proširi Sprite (/ ** @Private tekst za prikaz na * / privatno VAR tekst : String; / ** @Private bitmap za gumb / privatni VAR tipkovni gumb: Bitmap; / ** * Dizajner sluša scenu. * Ovdje pozornica trebamo u slučaju slavine na gumb i odmaknite prst od Gumb * * @param Tekst tekst za prikaz na gumb * / javna funkcija gumba (Text: String) (this.text \u003d Text: AddEventListener (event.addded_to_stage, dodatak);) / ** * @private dodajte na scenu . * Dodavanje grafike i tekstualnog polja. * * @Param e događaj Dodaj na scenu * / privatnu funkciju Donošenje (e: događaj): prazni (izventirani tvari (event.addded_to_stage, dodatak); Pomoću gumba \u003d bitmaps.buttonbitmap; // dodajte bitmap gumbag.smooth \u003d TRUE; Adhild (gumba); Var Textfield: Textfield \u003d Tools.generateTextfield (50, tekst); // Generirajte tekstualno polje ... Textfield.x \u003d (gumymage.Width - Textfield.Width) / 2; // ... pozicioniranje i dodajte na zaslon Textfield.y \u003d (gumymage.height - Textfield.Height) / 2; Addchild (Textfield); This.addeventlistener (touchvent.touch_begin, touchbegin); // dodirivanje gumba AddEventListener (event.Removed_from_Stage, uklonjeno nakon toga); // Uklanjanje slušatelja iz pozornice) / ** * Animiranje alfa na pola * * @param E prst Dodirni događaj na * / privatni gumb Touchbegin gumb (e: touchvent): praznina (tweente.to (gumba, (alfa : .5)); Faza.AdDeventListener (TouchEvent.Touch_End, dodir); // Ukloni prst s zaslona nakon dodirivanja gumba) / ** * Povratak Alpha u jedinicu * * @param E otisvjetni događaj * / privatna funkcija Dodir (E: TouchEvent): praznina (tweente.to (gumba, ,.3, (alfa: 1)); faza.RemoveeventListener (TouchEvent.Touch_End, dodir)) / ** * Kada izbrišete pozornicu, ne ubijete više Neophodni slušatelji * * @ param e događaj brisanje s scene * / privatne funkcije uklonjenofrom (e: događaj): Void (EventEventListener (Event.Removed_from_Stage, uklonjeno); this.removeeventListener (Touchevent. Touch_begin, touchbegin); Faza.RemoveventListener (TouchEvent.Touch_End, dodir)))))))))
Artikal. - objekt koji pada odozgo tijekom igre. Možda tri vrste, opisane su u kodu
Elementi paketa (uvozne konstante Oblik (/ ** AMETIPE TIP TIP.ITEMTYPE * / javni VAR tip: String; / ** amethema brzina * / javna VAR brzina: UINT; / ** * U dizajneru, grafička stavka je izvučena. * * @Param tipa tipa tipa AETEMA * / Javna funkcija Stavka (vrsta: string) (thip.Type \u003d tip; prekidač (vrsta) (// Provjerite koji tip se prenosi na konstruktor // i ovisno o tome nacrtamo odgovarajuću grafiku. Slučaj itemtType.good: // nacrtajte zeleni kvadrat things.graphics.beginfinfill (0x00a400); thig.graphics.Drawrect (0, 0, 14, 14); this.graphics.endfill (); pauzu; slučaj). Slučaj kvadrat s thing.graphics sjaj. početak (0x01a6Fe); thig.graphics.Drawrect (0, 0, 14, 14); this.graphics.ddfill (); this.filters \u003d; pauza; Krasn Grafički krug (0xff0000); grafike.Drawcircle (0, 0, 7); grafike.Idfill (); Pauza; )))))))))))
Platforma. - "Glavni lik" igre. Mala platforma koja upravlja igraču.
Elementi paketa (uvoz Flash.display.shape, uvoz Flash.filters.glowfilter; / ** * platforma za ribolov, koji se nalazi na dnu zaslona. * Sve je vrlo jednostavno, nacrtani bijeli pravokutnik i filtar sjaj se primjenjuje. * Odvojena klasa kako bi se platforma doživljavala kao zasebna jedinica za igru. * * @author iluzor * / platforma za javnu klasu (this.graphics.clear (); ; ovo. grafike.Drawrect (0, 0, 110, 24); this.graphics.ddfill (); this.filters \u003d;))))))
Paket alati. s alatima.

Klasa Bitmaps. Sadrži priključenu grafiku i metode za dobivanje izvana
Paket alati (uvoz Flash.display.Bitmap; / ** * "Generator" bitmapa od priloženih datoteka * * @author Illuzor * / Bitmaps javnih klasa (/ ** @Private priložene datoteke datoteke File * / Private Static Var BackInBitMit: klasa ; / ** @Private priložene grafike datoteke * / privatna statička var gumbat će: klasa; / ** @private priložene datoteke grafike logotip * / privatni statički var logobitmap: klasa; / ** bitmap pozadini * / javna statička funkcija dobiti backIctMap () : Bitmap (povrat novog backItMitmap () kao bitmap;) / ** bitmap gumbi * / javna statička funkcija Get ButtonBitMap (): Bitmap (Povratak novog gumba () kao bitmap;) / ** bitmap logotip * / javna statička funkcija dobiti logobitmap (): Bitmap (vratiti novi logobitmap () kao bitmap;)))
Klasa Alati. Sadrži druge alate. Do sada, samo follinski generator
Paket alati (uvoz Flash.text.textfield; Uvoz Flash.Text.Text.Textformat; / ** * Klasa s malim alatima. * Do sada, sadrži samo generator tekstualnog polja. * * @Author iluzor * / javni klasni alati (/ * * * Tekst Phildo Generator za određene parametre * * @param Veličina veličine fonta * @param tekst tekst za prikaz * @param u boji teksta boja * @return konfigurirani tekstni okvir * / javna statička funkcija GenerateTextfield (veličina: UINT, TEXT: String \u003d " ", Boja: UINT \u003d 0xfffff): Textfield (var Textformat: Textformat \u003d novi textformat (); textformat.color \u003d boja; textformat.size \u003d veličina; var Textfield: Textfield \u003d New Textfield. .defaultTextformat \u003d TextFormat; Textfield.Text \u003d Text; Textfield.Width \u003d Textfield.Textwidth +4; Textfield.Height \u003d Textfield.Textheight \u003d Textfield.Textheght +4; povratak Textfield;))
Aplikacije aplikacija iz paketa ekrani.

Glavni izbornik. - Glavni izbornik igre. Prikazuje se odmah nakon lansiranja. Sadrži gumbe, pozadinu i logotip.
Ekrani paketa (uvoz Flash.display.Bitmap; uvoz Flash.display.Sprite; Uvoz Flash.events.events.events.event; uvoz Flash.display.displayobject; uvoz alati.bitmaps; uvoz elemenata.Button; / ** * klasa glavne igre Izbornik. * Bit će pozadinu, logotip i dva gumba. * * @author iluzor * / mainmenu javne klase proširuje sprite (/ ** gumb za reprodukciju * \u200b\u200b/ javni VAR PlayButton: gumb; / ** "Gumb * / javnost VAR EXITBUTTON: / ** * U konstruktoru samo slušajte dodati na scenu * / javnu funkciju mainmenu () (addEventListener (event.addded_to_stage, dodatak);) / ** * stvoriti i dodati pozadinu, logotip, tipke * * @Param e događaj dodan na scenu * / privatnu funkciju Adddedtostage (e: događaj): praznina (EventEventListener (event.added_to_Stage, Addtostage); // Napravite bitmap pozadine i dodajte je u scenu VAR pozadinu: bitmap \u003d bitmaps. AckeyBitmap; pozadina.Smooting \u003d TRUE; Addchild (pozadina); placebackrolilište (pozadina); // stvoriti bitmap logotipa, postavite veličinu u odnosu na širinu scene // postavite položaj i dodajte u scenu var logo: bitmap \u003d bitmaps.logobitmap; logo.smooth \u003d TRUE; logo.Width \u003d faza.stagewidth * .7; logo.scaley \u003d logo.scalex; logo.x \u003d (Faza.stageWidth - logo.Width) / 2; logo.y \u003d faza.stageheight / 5; Addchild (logo); // kontejner za gumbe za praktično pozicioniranje ovih gumba VAR GumbiContainer: Sprite \u003d New Sprite (); Adhild (gumbicontainer); // Stvaranje gumba "Reprodukcija" i "Exit", odgovara njihovoj veličini i dodajte u PlayButton \u003d Contert ("Reprodukcija"); Gumbiccontainer.addchild (PlayButton); playButton.Width \u003d faza.stagewidth / 2; PlayButton.scaley \u003d PlayButton.scalex; ExitButton \u003d Novi gumb ("Izlaz"); GumbicContainer.addchild (ExitButton); ExitButton.y \u003d Gumbicontainer.Height + 25; ExitButton.Width \u003d faza.stagewith / 2; ExitButton.scaley \u003d ExitButton.scalex; // Pozicioniranje spremnika s gumbima Gumbicontainer.x \u003d (Faza.stageWidth - gumbicContainer.Width) / 2; gumbiccontainer.y \u003d (faza.stageheight - gumbicContainer.Height) / 2 + faza.stagewidth / 6; ) / ** * Ova značajka čini da se displayobject prenese na njega ispunjava cijelu scenu * bez mijenjanja omjera. U našem slučaju, ovo je pozadinska slika * * @param ScaleDobject Displayobject za montažu * / privatnu funkciju Plastebook (ScaleDobject: DisplayObject): Void (ScaleDobject.scalex \u003d ScaleDobjekt.scaley \u003d 1; var skala: ako (ScaleDobject.Width / scaleDobject. Visina\u003e Faza.stageWidth / Faza.stageHeight) (skala \u003d faza.stageHeight / ScaleDobject.Height;) Drugo (ScaleDobject.stageWidth / ScaleDobject.Width;) ScaleDobject.x \u003d (Faza.stageWidth - ScaleDobject.Width) / 2; ScaleDobject.y \u003d (Faza.stageHeight - ScaleDobject.Height) / 2;))))
U klasi Gamescreen. Gameplay prolazi. Ameme padaju na vrh. Ovisno o njihovom tipu, morate ih uhvatiti ili izbjeći. Upravlja ciklusom igre
Uvoz Constants.TweendLite; Uvoz konstanti. Uvoz Elements.Button; Uvoz Elements.Platform; Uvoz Elements.Atem; uvoz događaja.gameevent; uvoz flash.display.events.events.eveents.moseevent ; Uvoz Flash.events.Terevent; Uvoz Flash.TouchEvent; Uvoz Flash.Text.Textfield; Uvoz Flash.utils.Timer; Uvoz alati.Tools; / ** * Glavna klasa igra. Što radi proces igre: * Na dnu zaslona nalazi se platforma koja se može premjestiti u lijevo / desno za pomicanje prsta preko zaslona u bilo kojem dijelu zaslona. * Takozvani atemi padaju odozgo, što mogu biti tri vrste: * - ItemType.good - običan predmet. Prilikom prikupljanja dodaje jedinicu na naočale, prilikom prolaska (skrb za donju granicu zaslona) * uzima jedinicu iz bodova * - itemtype.y_good - "Ojačani" ahem. Prilikom prikupljanja dodaje 5 na naočale. Prilikom prijenosa ništa se ne događa. * - ItemType.evil - "Zli" Aytem. Kada se prikupljate Čini jedinicu od naočala. Kada se ne dogodi ništa. * * Kada je vrijednost bodova manja od pet, gubitak se broji, a rezultat igre se smatra maksimalnim brojem bodova. * Uz svaku novu razinu stavki, oni se kreću brže nego u prethodnom. * * Od gore navedenog s lijeve strane postoji idiot spaljenih naočala, na desno odozgo izlaznog gumba u glavni izbornik. * Na dnu u središtu ispod platforme nalazi se pokazatelj trenutne razine. * * * @Author iluzor * / javna klasa Gamescreen proširuje Sprite (/ ** @Private platforme i stavke kontejner * / privatni VAR GameContainer: Sprite; / ** gumb za izlaz iz glavnog izbornika * / privatni VAR Mynubutton: / ** @Private platforma * / privatna var platforma: platforma; / ** @Private igra tajmer. Trebate dodati novi atema * / privatni VAR gametimer: Timer; / ** @Privirati trenutni broj * / privatni Var tekući listlelvelvel : UINT; / ** @Private struje Broj bodova * / privatni var struje: Int; / ** @Private tekstni okvir za prikaz razine broja * / privatni var LeveltiptExt: Textfield; / ** @Private tekstni okvir za prikaz bodova * / Privatni var Robne vrijednosti: Textfield; / ** Maksimalni broj bodova * / Public VaR MaxScore: UINT; / ** * U konstruktoru, slušati scenu. * / Public Funkcija Gamescreen () (Event.added_to_Stage, dodatakTostage );) / * * * Stvaranje stavki zaslona * * @param e događaj Scena * / privatna funkcija dodavanjaTtostage (e: događaj): praznina (događaj. Dodao_to_stage, dodatnaTtaya); GameContainer \u003d New Sprite (); // Adchchild kontejner (GameContainer); Platforma \u003d nova platforma (); // stvoriti platformu koja prilagođava svoju veličinu i položaj i dodavanje platforme.Width \u003d Faza.stageWidth * .18 na scenu; platform.scaley \u003d platforma.scalex; platform.x \u003d (faza.stagewidth - platforma.Width) / 2; platform.y \u003d faza.stageheight * .88; Adhild (platforma); Recoretext \u003d Tools.generateTexfield (30, "Ocjena: 0"); // tekstualne točke bodova sreo.width \u003d faza.stagewidth / 2; recoreExt.x \u003d recokext.y \u003d 10; Addchild (rezultati); LevelText \u003d Tools.generateTextfield (30, "Razina: 1"); // Tekst polje LevelText.Width \u003d LevelText.textwidth + 4; LevelText.x \u003d (Faza.stageWidth - LevelText.Width) / 2; levelText.y \u003d faza.stageheight - LevelText.Height - 20; Addchild (LevelTstext); Menigutton \u003d Novi gumb ("MENU"); // Gumb za izlaz u glavni izbornik. Addchild (Menibutton); menubutton.Width \u003d faza.stagewith / 3.2; menabutton.scaley \u003d menabutton.scalex; menubutton.x \u003d faza.stagewidth - Menabutton.Width - 10; Menubutton.y \u003d 10; startnewvel (); // pokrenuti novu razinu mekubutton.addeventListener (touchvent.touch_tap, EXITGAME); // događaj pritiskom na izlaznu tipku u pozornici. // događaj pozornosti kretanja na pozornici.AdDeventListener zaslon (miseevent.Mouse_Up, pokretni); // prstima događaj iz ekrana AddEventListener (Event_Frame, Updateme); // Ažuriranje statusa igre AddEventListener (događaj.Removed_from_Stage, uklonjeno nakon toga); ) / ** * @private premještanje platforme ovisno o položaju prsta na zaslonu. * * @Param e navoj na zaslonu ili ga uklanjanje sa zaslona * / privatne funkcije MOMEPLatForm (E: Vjesti): Void (EF (miša\u003e Mynubutton.y + Menabutton.Height) tweenlite.to (platforma, .36, (X: mišax + -platform.width / 2));) / ** * @private lansiranje nove razine. Svaka se razina sastoji od 20 atems * / privatnih funkcija Startnewlevewleve (): Void (VAR interval: UINT \u003d 2300; // Ako interval timera poziva (2300 - struje * 350< 250) { // чем выше уровень, тем меньше интервал interval = 350; } else { interval = 2300 - currentLevel * 350; } gameTimer = new Timer(interval, 20); // создаём и запускаем таймер. gameTimer.start(); gameTimer.addEventListener(TimerEvent.TIMER, addItem); gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } /** * @private Создаём новый айтем по таймеру * * @param e событие тика таймера */ private function addItem(e:TimerEvent):void { var randomRange:Number = Math.random(); // случайное значене var itemType:String = ItemType.GOOD; // тип нового айтема. по умолчнанию все айтемы обычные if (randomRange > 0,65 && randumange.< .95) { // если случайное значение в заданном диапазоне (30%)... itemType = ItemType.EVIL; // айтем злой } else if (randomRange >\u003d .95) (// 5% aleta omogućuje im "ojačani" itemType \u003d imemtype.y_good;) var stavka: stavka \u003d nova stavka (itemtType); // stvoriti novu slučajnost s generiranom stavkom.x \u003d faza.StageWidth * math.random (); // staviti na slučajno .x artikl.y \u003d -Item.height; // a p.y.speed \u003d tekućine + 1 biti uklonjen izvan scene scene. // stavka brzina gamecotainer.addchild (stavka); // i dodajte ga na scenu) / ** * @private kada je tajmer diplomirao na poslu, očistite ga, što nije potrebno i pokrenuti novu razinu * * @param e događaja događaja * / privatna funkcija Cilenda (E: Timerevent): Void (Gametimer.removeeventListener (Timerent.Timer, AdyTem); Gametimer.removeeventListener (TimerVent.timer_Complete, Cilerend); Gametimer \u003d null; // Obriši slušati shemerel ++ timera; // povećanje Razina po jedinici LevelText.Text \u003d "Razina:" + niz (tekućine + 1); // ažurirati tekst razine LevelText.Width \u003d LevelText.textwidth +4; Startnewvel (); // pokrenuti novu razinu) / ** * @Private Ciklus igre * Ažuriramo položaj atems. Ako su otišli izvan scene, izbrišite. * Vratite ih sudare s platformom * * @param e enterframe događaj * / privatna funkcija updatemame (e: događaj): praznina (// u ciklusu prolazimo kroz sadržaj kontejnera za igru, osim za platformu (i \u003d 1 ) za (var i: int \u003d 1; ja< gameContainer.numChildren; i++) { var tempItem:Item = gameContainer.getChildAt(i) as Item; // берём айтем tempItem.y += (tempItem.speed * 3) * .8; // увеличиваем его.y координаты в зависимости от его скорости. if (tempItem.y > Faza.stageheight) (// Ako je otišao scene ... GameContainer.removechad (tempitem); // ... uklonite ga ... ako (tempitem.type \u003d\u003d imemtype.good) struje currentcore--; // .. i ako se ispostavilo da je uobičajeno, oduzeti jedinicu iz naočala.) Ako (tempitem.hittestobject (platforma)) (// Ako je ATEP uhvatio platforma // ovisno o svom tipu, proizvodimo akciju . // Mislim da ništa ne objašnjava prekidač (tempitem.type) (slučajtType.good: Currentcore ++; Pauza; Slučaj stopeType.y_Good: Currentcore + \u003d 5; pauza; Slučaj itemtType.evil: currentscore--; Pauza;) // također prilikom udarca u platformu, više ne treba, izbrišemo ga s scene GameContainer.removeChecha (tempitem);)) Recoretext.text \u003d "Ocjena:" + strujecore; // Ažurirajte tekstni okvir s uputama (maxcore< currentScore) maxScore = currentScore; // записываем максимальное количество очков if (currentScore < -5) { // если количество очков меньше, чем -5.. dispatchEvent(new GameEvent(GameEvent.GAME_OVER)); //... генерируем событие проигрыша } } /** * @private генерируем событие выхода из игры * * @param e событие прикосновения к кнопке выхода в меню */ private function exitGame(e:TouchEvent):void { dispatchEvent(new GameEvent(GameEvent.EXIT_GAME)); } /** * @private удаляем все ненужные больше слушатели * * @param e событие удаления со сцены */ private function removedFromStage(e:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStage); removeEventListener(Event.ENTER_FRAME, updateGame); stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveplatform); stage.removeEventListener(MouseEvent.MOUSE_UP, moveplatform); menuButton.removeEventListener(TouchEvent.TOUCH_TAP, exitGame); gameTimer.stop(); gameTimer.removeEventListener(TimerEvent.TIMER, addItem); gameTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, cicleEnd); } } }
Screscreen. Nakon gubitka. Prikazuje tekstni okvir s konačnim rezultatom i gumbima za povratak na izbornik i ponovite igru
Ekcini paketa (uvoz Elements.button; uvoz Flash.display.Sprite; Uvoz Flash.events.events.event; Uvoz Flash.Text.textfield; uvoz alata.Tools; / ** * zaslon za prikaz rezultata igre u obliku Broj postignutih točaka. * Sastoji se od teksta "Vaša ocjena:" i "Menu" i "Ponovno" gumbe * * @Author iluzor * / javna klasa screscreen proširuje Sprite (/ ** @private broj bodova za prikaz * / privatno Var rezultat: UINT; / ** tipka "MENU" * / Public VAR MUBUBTTON: / ** ponovno "Gumb * / Public VaR PonovnoButton: / ** * U konstruktoru čekamo dodavanje u pozornicu. Ovdje je potrebna pozornici za postavljanje elemenata * @param bodove broj bodova za prikaz * / javne funkcije screscreen (rezultat: UINT) (thisc.score \u003d rezultat; addEventListener (event.added_to_stage, dodatak);) / ** * stvoriti tekstualni okvir za prikaz bodova i gumba za ponavljanje igre i povratak na glavni izbornik. * * @param e događaj dodaje na scenu * / privatnu funkciju ATPLOSTAG E (e: događaj): praznina (događaj.addded_to_Stage, dodatak); // Tekst polje će prikazati broj var Sprect bodova birani: Textfield \u003d Tools.generateTextfield (40, "Vaš rezultat:" + rezultat); Scorext.x \u003d (Faza.stageWidth - Recotext.Width) / 2; Recorexext.y \u003d (faza.stageheight - SPREEText.Height) / 2 - Faza.stageMeight / 6; Addchild (rezultati); // gumb za izlaz iz Mynubutton \u003d Novi gumb ("MENU"); Addchild (Menibutton); Menubutton.Width \u003d faza.stagewidth / 2; menabutton.scaley \u003d menabutton.scalex; Menabutton.x \u003d (faza.stagewidth - Menubutton.Width) / 2; menubutton.y \u003d smanjenje + rezultati + 30; // "Reproduciraj više" ponovnoumton \u003d novi gumb ("ponovno"); Adchild (opetbutton); opetbutton.Width \u003d faza.stagewith / 2; opetbutton.scaley \u003d opetbabutton.scalex; opetbutton.x \u003d (faza.stagewidth - opetbabutton.Width) / 2; opetButton.y \u003d Menubutton.y + Menabutton.Height + 30; )))))))))
I zadnje klase Glavni. Iz korijena. Glavna igra klase. Koristi se za uključivanje zaslona i čišćenje s tim smjenama. Poslušaju gumbe zaslona za tisak i događaje igre. Ovisno o njima briše scenu i prikazuje željeni zaslon.
Paket (uvoz konstantis.screntype; uvoz događaje.GameEvent; Uvoz Flash.deSktop.nativeapplication; Uvoz Flash.display.Sprite; uvoz Flash.display.Stagealign; Uvoz Flash.display.Stagescalemode; Uvoz Flash.events.events.events.events.events.events.events. Events.Toulets.Toulets; Uvoz Flash.ultitouch; uvoz Flash.ui.multitouchenputMode; uvoz ekrana; uvoz ekrana; uvoz ekrana. Uvoz ekrana; uvoz ekrana; / ** * osnovna igra klase. Upravlja prikaz različitih ekrana igara. * Igra predstavlja sljedeće: Na dnu zaslona je "platforma", koja se može premjestiti. * Od gore navedenih "objekata" od tri vrste: crvena, zelena, plava. Morate uhvatiti njihovu platformu. * * FlashDevelop 4.0.1 i Flex SDK 4.6 * Uz korištenje biblioteke iz Greensock - http://www.greensock.com/v11/ * * @author iluzor * @version 0.6 * / Javna klasa Glavno proširuje Sprite (/ ** @Private Glavni zaslon izbornika * / privatni var menocrsak: mainmenu; / ** @private igra zaslon * / Privatni Var Gamescreen: Gamescreen; / ** @Private zaslon zaslona igre (lopore naočale) * / privatni var screscreen: screscreen; / ** @Private ove varijabilne trgovine Tekst Vrijednosti Vrsta * iz konstants.Screntype, koji se prikazuje u ovaj trenutak * Potreba za Corre čišćenje od slušatelja i objekata zaslona * / privatni var struje zaslon: niz; / ** * glavni dizajner * / javna funkcija glavna (): praznina (faza.scalemode \u003d stazecalemode.no_scale; faza.Align \u003d Sernign.Top_left; // događaj deaktivacija aplikacije. to jest, izlazi iz njega ili preklapanje (Nag "Home Button" "ili" natrag ") faza.AdDeventListener (event.deactivate, deaktivirajte); \u200b\u200b// tip ulaza. Touch_point je postavljen prema zadanim postavkama i to nam odgovara multitouch.inputmode \u003d multitouchinputmode.touch_point; showmenu (); / Prikaži glavnog izbornika.) / ** * @Private Prikaži glavni izbornik * / privatni fond showmenu (): prazni (currentscreen \u003d screeny.main_menu; // nanesite tipovi zaslona Menuscreen \u003d Novi Mainmenu (); Izbornik i dodajte ga na Adchild sceni (menocrsran); menoscreen.playButton.addeventListener (Touchevent.Touch_tap, StartGame); // Dodaj slušalice na tipke MENUSCREEN.EXITBUTTON.AdDeventListener (ToucTent.touch_tap, deaktivirati);) / ** * @Private Prikaži zaslon igre * * @param e događaj Dodirnite na gumb PlayB Utton Glavni izbornik * / Privatna funkcija StartGame (e: Touchevent): praznina (jasno (); // čist struje currentcreen \u003d screeny.game_screen; // Primijenite vrstu zaslona gameskreen \u003d nova Gamescreen (); // stvoriti zaslon za igru \u200b\u200bi dodati adhild (Gamescreen) na pozornicu; Gamescreen.addeventListener (GameEvent.exit_game, Exitgame); // događaj izlaz iz igre na GAMESCREEN.AdDeventListener gumb (GameEEvent.game_Over, GameOver); // Gubitak događaj) / ** * @Private izlaz iz igre pritiskom na tipku * * @param e izlaz iz igre iz igre * / privatne funkcije EXITGAME (E: GameEEVEnt): Void (Clear (); // Clean Showmenu (); // prikazati glavni izbornik) / ** * @private igra se reproducira, pokazujući rezultat * * @param e događaj gubitak * / privatnu funkciju GameOver (E: GameEEVent): Void (Var rezultat: UINT \u003d Gamescreen. Maxcore; // Broj točaka. Izađite iz zaslona za igru \u200b\u200biz MAXSCORE CLEAR varijable; // Očistite struju Currentscreen \u003d ScreenCyc.screen; // nanesite screscreen \u003d novi tip screscreen zaslona; // stvoriti i prikazati zaslon s rezultatima Adchchild ( Screscreen); screscreen.menubutton. AddEventListener (touchevent.touch_tap, exitScore); // slušatelji screscreen.againbutton.adDeventListener Rezultati zaslona (Touchevent.Touch_tap, StartGame) , * Morate učiniti isto kao i kad pritisnete izlaznu tipku iz igre, tako jednostavno nazovite ExitGame () * * @param e događaj Dodirnite na izlazni gumb na zaslonu rezultata * / Privatni fond ExitScore (E: Touchevent): Void (Exitgame (null);) / ** * @private čišćenje od nepotrebnih slušatelja i objekata na zaslonu * ovisno o trenutnom zaslonu. * / Privatna funkcija Clear (): praznina (prekidač (struja (struja) (Slučaj Screenpeype.Main_menu: Menuscreen.playButton.RemoveeventListener (Touchevent.Touch_tap, STARTGAME); Menuscreen.exitton.removeeventListener (TouchVent.touch_tap, deaktivirati); ; Menuscreen \u003d null; pauza; Slučaj Scortenype.Game_screen: Gamescreen.removeeventListener (GameEEVent.exit_game, EXITGAME); Gamescreen.removeeventListener (GameEEVent.game_over, GameEGENG (Gamescreen); Gamescreen \u003d null; Slučaj; Screscreen.menubutton.remeveeventListener (Touchevent.Touch_tap, EXITSCORE); Screscreen.againButton.RemoveeventListener (Touchevent.Touch_tap, StartGame); RemoveCHEEN \u003d NULL; BREAL;) / ** * Izlaz iz aplikacije kroz na nativeapplication * Klikom na "Home" ili "Natrag" aplikacija se zatvara * * @param e deaktiving događaj * / privatna funkcija deaktivirati (e: događaj): praznina (NativeApplication.nativeAplication.e Xit (); )))))))))

Kompilacija i lansiranje.

Projekt je konfiguriran, grafika je nacrtan, kod je napisan. Sve je to. Možete testirati igru. Uzimamo pametni telefon, idite Mogućnosti razvoja., upaliti USB način debug., Povezujemo ga kabel na računalo.

Sada trebate napraviti neke akcije u flashdevelop.
- dovršite projekt Projekt / Buildproject.(F8). U mapi bin. Pojavit će se flash pogon;
- Trčanje Packageapp.bat., Unesite "2", pritisnite ENTER. Čekamo do projekta u APK-u i pojavljuje se u mapi dist.;
- Odaberite u izborniku Debug / pokretanje udaljenog sesije;
- Trčanje Run.bat. - Aplikacija će popuniti uređaj, počinje tamo i povezati se s debugger.

Sve se može testirati, koristiti debugger pa čak i uhvatiti tragove ravno s uređaja. Profiler, nažalost, ne radi.

Sve ove 4 akcije mogu se napraviti na drugi način. Samo odaberite Projekt projekta / test(F5). Sve će se automatski izvršiti.

Kada je aplikacija testirana i završena, pokrenite Packageapp.bat.Uvodim jedinicu. U mapi dist. Pojavit će se APK.

Kraj prvog dijela.

Ova lekcija počinje niz članaka o pisanju arkadnih igara za Android. Osnova je uzeo ciklus koji je napisao i objavio svoj blog Tamas Jano., Materijal je orijentiran prvenstveno na početnike programere koji žele isprobati svoju snagu u stvaranju Android igara. Stavio sam cilj ispred nas kako bih stvorio najjasniji i pristupačniji udžbenik na našoj stranici za mladu ruski govoreći publiku, pa se stvarno nadam za vašu kritiku, pitanja i komentare. Materijal objavljen u ovom ciklusu će se stalno reciklirati, uzimajući u obzir vaša pitanja, želje i komentare. Nadam se da zajedno možemo uspješno provesti ovaj mali eksperiment.

Alexander Ledkov

Ideja i arhitektura

Prije kretanja izravno u programiranje, odlučimo o našim zadacima i opisuju našu buduću igru. Ideja je jednostavna: glavni lik se bori s horde robota koji ga žele uništiti. Ima tri života i laserska puška. Roboti ne znaju pucati. Sve što mogu - uhvatiti naš junak i otkinuti glavu ... dobro, ili nešto drugo. Upravljanje znakovima se provodi uz pomoć dviju "senzornih joysticks" koje ste ih vjerojatno sreli u takvim igrama. U donjem lijevom kutu bit će postavljen joystick, odgovoran za pomicanje heroja. U donjem desnom kutu - za oružje.


Simuliramo situaciju igre. Naš lik je u središtu zaslona. Roboti svakih 1/10 sekundi približavaju ga. Svaka deseta sekunda također provjeravamo li se zaslon ne pojavi. Ako se to dogodilo - premjestimo naš karakter u neophodnom smjeru ili napravi udarac. Ako je napravljen snimak, svaka krpelja (1/10 sekunde) provjerimo sudar metaka s neprijateljima. Ako je metak pao u robot - onda robot i metak eksplodira ako nema robota i metak se preseli na nove pozicije (robot se pomiče na 5 piksela po krpelji, a metak je 50 piksela). Također provjeravamo nismo uhvatili robota našeg junaka. Ako sam uhvaćen - igra završava.

U najjednostavnijem slučaju, arhitektura igre može biti predstavljena kao sljedeći moduli koji se nazivaju ciklički:

  1. Upravljački modul, Koordinate zaslon zaslona čitaju se ovdje.
  2. Motor za igru, Ovdje moramo ažurirati stanje igre objekata, to jest, izračunati njihove nove koordinate, provjeriti zdravlje, sudare i slično.
  3. Audio modul.
  4. Grafički modul, Ovdje se na temelju trenutnog stanja formira i prikazuje novi okvir.

Razmotrimo detaljnije.

Upravljački modul

U našoj igri, poruka se generira kada je korisnik dotaknut na dva područja na zaslonu. Program prati događaje ontouch i zapisuje koordinate svakog dodira. Ako su koordinate unutar kontrolnog područja, šaljemo odgovarajuću naredbu za igre na sreću. Na primjer, ako je došlo do kruga, moramo premjestiti naš lik na odgovarajuću stranu. Ako je došlo do kruga u krug koji kontrolira oružje, šaljemo naredbu motoru za rješavanje snimke događaja.

Motor za igru

Modul za logiku igre je odgovoran za promjenu stanja svih znakova u igri, pod kojim razumijem svaki objekt, imati stanje (naš junak, roboti, laserski snimci).

Pogledajmo interakciju upravljačkog modula i motora igre. Slika u nastavku prikazuje krug kontroler. Svijetlo zelena mrlja simbolizira touch područje. Upravljački modul prijavljuje reprodukciju koordinata dodira (DX i DY - udaljenosti u pikselima iz središta kruga). Na temelju tih koordinata, igra motor izračunava smjer i brzinu kretanja našeg heroja. Na primjer, ako DX\u003e 0, naš lik se pomiče udesno, DY\u003e 0 - na vrhu.

Audio modul

Ovaj modul upravlja zvukom, ovisno o situaciji igre. Zvukovi mogu generirati različite objekte igre, ali budući da je broj zvučnih kanala ograničen (broj audio kanala odgovara broju zvučnih datoteka koje se mogu izgubiti istodobno), audio modul mora odlučiti koji zvuči za gubitak, a koji nisu , Na primjer, robot predstavlja veliku opasnost za naš junak, tako da moramo privući pozornost igrača na njegov izgled, na primjer, da se uključite zvuk sirena, i naravno, jednostavno moramo izraziti sve snimke našeg karaktera.

Grafički modul

Ovaj modul je odgovoran za izlaz igre na zaslonu telefona. U Androidu postoji nekoliko načina za formiranje slike na zaslonu. Možete nacrtati izravno na platnu dobivenu iz pogleda ili koristiti zaseban grafički međuspremnik i vi, a zatim prenositi prikaz, a možete koristiti značajke OpenGL knjižnice. Korisno prilikom razvoja igre stalno mjeri FPS - broj okvira u sekundi, koji daje vašem grafičkom motoru. Vrijednost od 30 FPS znači da je u jednoj sekundi naš program uspio ažurirati zaslon 30 puta. Trčati naprijed to reći mobilni uređaj 30 FPS je više od pristojnog pokazatelja.

Stvoriti projekt-prazan za buduće android igre

Ovdje neću detaljno slikati proces android postavke SDK i Eclipse, izvan raketnih okvira, ostavit ću i elementarne akcije stvaranje androida Projekt. Na internetu postoji veliki broj lekcija i članaka posvećenih ovoj temi.

Stvorite novi projekt. U polje Naziv projekta unesite Droidz., Kao ciljna platforma, odaberite Android 2.2 ili više. U nazivu paketa - " ru.mobilab.gamesmentample"Ne zaboravite staviti oznaku o stvaranju aktivnosti. Kao ime glavne aktivnosti, unesite Droidzactivity..

Otvorite SRC / ru.mobilab.gamesmentable / droidzactivity.java datoteku

uvoz android.app.agitivity;
uvoz android.os.bundle;

droidZaktivnost javne klase proširuje aktivnost (
/ ** naziva se kada se aktivnost prvi put stvori. * /
@Verride
Javna praznina (snop savedinstancestat) (
super.oncreate (savedstancestat);
}
}

Metoda ocreate se naziva prilikom stvaranja aktivnosti tijekom lansiranja aplikacije. Ova metoda se može promatrati kao pravo na ulazak u program. Razred r.java automatski generira pomračenje i sadrži reference na resurse. Svaki put kad promijenite resurse u Eclipse Class r ponovno sastavljeni.

Glavni ciklus igre

U bilo kojoj igri mora postojati ciklus koji će zabilježiti korisničke naredbe, obraditi ih, promijeniti ih prema stanju objekta igre, prikazati novi okvir na zaslonu i reproducirati zvučnu podršku. Već smo stvorili najjednostavniji projekt za Android. Sada ćemo stvoriti realizaciju ciklusa gamiranja.

Kao što se sjećate, sve se događa u Android unutar aktivnosti. Aktivnost stvara pogled - objekt u kojem se događa sve najzanimljivije. To je kroz njega da možemo dobiti informacije o dodiru zaslona, \u200b\u200bovdje možete prikazati sliku na zaslonu.

Otvorimo datoteku droidzactivity.java. U dizajneru razreda vidjet ćete liniju

SetconntentView (r.layout.main);

ovaj niz odabire objekt trenutnog prikaza za aktivnost. Stvoriti novi objekt Za prikaz. Najviše jednostavan način Primanje prikaza - Izradite vlastiti razred na temelju Područje. U našem razredu implementiramo sučelje površineholder.callback kako bismo ubrzali pristup promjenama površine, na primjer, kada se uništi prilikom promjene orijentacije uređaja.

Maingamepanel.java.

paket ru.mobilab.gamesmentable;






Površiničar.Callback (


Super (kontekst);
// dodajte ovu klasu kao što sadrži funkciju suprotnog
// poziv za interakciju s događajima
// napravite gamepanel, tako da može obraditi poruke
Postavi (istinito);
}

@Verride
}

@Verride
}

@Verride
}

@Verride

}

@Verride
}
}

U navedenom popisu prikazuje se predložak razreda koji moramo implementirati. Pogledajmo sadržaj dizajnera pažljivije. Crta

Getholder (). AddCallback (ovo);

Postavlja trenutnu klasu (maingamepanel) kao rukovatelj događaja s površine.

Postavi (istinito);

Ova linija čini naš razred fokusiranje. To znači da može primiti fokus, a time i događaje.

Napravimo tok unutar kojeg će se naš ciklus igre aktivno provesti. Odjel igre je donekle paralelna s tokovima - općenito prihvaćeno u modernoj golevoj praksi. Stvoriti za našu strujnu klasu teithread.java

Paket ru.mobilab.gamesmentable;

javna klasa mainhread proširuje nit (

// zastava označava da igra radi.

Privatni boolean trčanje;
Javna praznina Setrunning (Boolean trčanje) (
this.Running \u003d trčanje;
}

@Verride
Javna praznina () () (
Dok (trčanje) (
// osvježiti stanje igre objekata
// prikaz grafike na zaslonu
}
}
}

Kao što možete vidjeti, ova klasa je značajno jednostavnija od prethodnog. Unutra smo napravili metodu pokretanja (). Protok se izvodi dok se ova metoda ne provede, tako da smo organizirali beskonačnu petlju u njemu. Dodali smo logičnu promjenu varijable, koja služi kao izlazni pokazatelj iz ciklusa. Sada dovršiti tok, samo trebate promijeniti vrijednost ove varijable negdje na lažnim.

Nakon što smo stvorili struju, morate ga pokrenuti. Pokrenimo ga prilikom učitavanja zaslona. Promijenite klasu Maingamepanela

Paket ru.mobilab.gamesmentable;

uvoz android.content.context;
uvoz android.graphics.canvas;
uvesti android.view.motionevent;
uvoz android.view.surfaceholder;
uvoz android.View.surfaceview;

javna klasa Maingamepanel proširuje poremećaje Područje
Površiničar.Callback (

Privatno mainhread niti;

Javna maingamepanela (kontekst kontekst) (
Super (kontekst);
Getholder (). AddCallback (ovo);

// stvoriti tok za ciklus igre
Nit \u003d novi mainhead ();

Postavi (istinito);
}

@Verride
Javna prazna surfacehanged (nositelj površine, int format, int širina, INTE visina) (
}

@Verride
Javna prazna surfakecreatirana (držač površine) (
Nit.Setraunning (TRUE);
nit.start ();
}

@Verride
Javna prazna površina (držač površine) (nositelj površine) (
// pošaljite tok do naredbe za zatvaranje i čekati,
// dok nit nije zatvoren.
Boolean pokušaj \u003d true;
Dok (ponovno pokušajte) (
pokušajte (
nit.Jiin ();
Ponoviti \u003d false;
) Ulov (prekidEException e) (
// Pokušajte ponovno zaustaviti tok navoja
}
}
}

@Verride
Javni boolean ontouuchevent (MotionEvent događaj) (
Povratak super.touchevent (događaj);
}

@Verride
Zaštićena praznina na kopnu (platno platno) (
}
}

Najavili smo nit objekta

Privatno mainhread niti;

i stvorio ga u dizajneru

Nit \u003d novi mainhead ();

u metodi surfakecreatied, instalirali smo zastavu na istinitu i pokrenuli tok. Do tog vremena, nit objekta već je sigurno stvoren i može ga lansirati bez straha.

Prije zatvaranja površine naziva se metoda. Nije dovoljno samo ukloniti zastavu. Moramo biti sigurni da je tok stvarno zatvoren. Samo blokiramo potok i čekamo dok ne umre.

Dodajte interakciju s zaslonom

Da biste pokazali kako u Android procesu dotakne, napišite mali primjer. Program ćemo napustiti kada će korisnik dotaknuti dno zaslona. Ako se dodir dogodio negdje gore - jednostavno ćemo prikazati odgovarajuće koordinate u dnevnik. Dodajte sljedeće linije na Exterhread klase:

Privatni površinski površina;
privatni maingamepanel gamepanel;

javna mainhead (površinski površina, maingamepanel Gamepanel) (
Super ();
this.surfaceholder \u003d površina;
This.gamepanel \u003d gampanel;
}

dakle, definirali smo varijable Gamepanela i površine, uzimajući odgovarajuće vrijednosti od parametara konstruktora. Moramo se sjetiti tih vrijednosti tada biti u mogućnosti blokirati površinu na vrijeme povlačenja, a to se može učiniti samo kroz površine.

Promijenite liniju u klasi maingamepanel dodavanjem novo najavljenih parametara na dizajner

Nit \u003d novi mathead (getholder (), ovo);

Prenosimo trenutni rukovatelj i ploču na novi dizajner. To će nam omogućiti da imamo pristup iz potoka. U Gamepanelu ćemo stvoriti metodu ažuriranja i prebaciti ga iz potoka, ali još uvijek ostaviti sve što jest.

Zapisivanje

U nastavku napisujemo pomoćni kod koji se prijavljuje je snimanje posebnih redova za ispravljanje pogrešaka s tekstom koji odražava stanje našeg programa, u posebnu datoteku, koja se tada može promatrati i pokušati shvatiti što se dogodilo u programu. Dodajte konstantu oznake za uklanjanje klase. Svaka klasa će imati vlastitu konstantu s oznakom imena, koja će sadržavati ime odgovarajuće klase. Koristimo okvir Android zapisivanja za prijavu, u ovoj knjižnici, svaki dnevnik mora imati dva parametra. Prvi parametar određuje mjesto gdje se bilježi zapisnik. Bilo je to za te svrhe koje smo stvorili konstantnu oznaku. Drugi parametar je stvarna poruka koju želimo snimiti u dnevniku. Korištenje nastavnih imena kao prvi parametar - praksa je vrlo uobičajena u Java mediju.

Da biste pregledali dnevnike snimljene tijekom izvršenja, morate odabrati izbornik
Windows -\u003e Prikaži pogled -\u003e Ostalo ...
i onda se otvorio dijalog
Android -\u003e Logcat
U prozoru koji se otvara, ne možete samo pregledati dnevnike, već i za filtriranje i pretraživanje.

Vratimo se na naš kôd. Promjene u Mainremead.java

Paket ru. Mobilab. Gamestraleaple; Uvezi Android. UTIL. Dnevnik; Uvezi Android. POGLED. Površina; javna klasa mainhrehleds nit (privatni statički završni string oznaka \u003d mainhread klasa GetIppleName (); .. privatni površinski površina površina Površina, Maingamepanel Gamepanel) (Super (); to. Površiničar \u003d površina; to. Gamepanel \u003d Gamepanel;) @ nadjačavanje javnog praznine (Trčanje) (Tickcount ++; // ovdje će se ažurirati stanje igre // i formirajte okvir za prikaz na zaslonu ) Dnevnik. D (oznaka ", petlja igra izvršena" + Tickcount + "Times"); ))))

Kao što možete vidjeti, definirali smo oznaku i nazvali naredbu dnevnika unutar metode pokretanja, što čini odgovarajući unos u datoteku dnevnika. Prikazani smo u vrijednosti log tarika varijable, koja je zapravo brojač ciklusa i pokazuje koliko puta je ciklus igre uspio pokrenuti tijekom programa

Bacite natrag u datoteku maingamepanel.java i pronađite metodu ontoučeve, koja je na zaslonu Dodirnite rukovatelj.

Javni boolean ontouucevent (MotionEvent događaj) (ako (događaj. Gettion () \u003d\u003d MotionEvent. Action_down) (ako (događaj. Gety ()\u003e Getheight () - 50) (nit.) (Lažno); ). Zahtjev ();) drugo (log. d (oznaka, "koornicama: x \u003d" + događaj. getx () + ", y \u003d" + događaj. gety ());)).)) povratak super. ontouuće (događaj );););)

Prvo, provjeravamo je li došlo do zaslona (Mousevent.action_down). Ako se to dogodi, provjerite y koordinata i ako je na dnu zaslona (50 piksela s dna), šaljemo naredbu niti za dovršetak (instaliranje varijable s pokretanjem), a zatim nazovite metodu do kraja () za glavnu aktivnost koja zatvara cijeli program.

Komentar. Početak koordinatnog sustava na zaslonu je u gornjem lijevom kutu. Osovina Y je usmjerena prema dolje, X os je ispravna. Širina i visina zaslona mogu se dobiti pomoću getwidth () i getheight () metodama, respektivno.

Promijenite DroidZactivity.java dodavanjem naredbe za unos za prijavu

Paket ru. Mobilab. Gamestraleaple; Uvezi Android. App. AKTIVNOST; Uvezi Android. OS. Paket; Uvezi Android. UTIL. Dnevnik; Uvezi Android. POGLED. Prozor; Uvezi Android. POGLED. WindowManager; Javna klasa DroidZactivityEletnds aktivnost ( / ** Poziv pri izradi aktivnosti. * / Privatna statička konačna oznaka \u003d droidzactivity. Klasa. GetyMplename (); @ Nadjačati javnu prazninu (super. Oteći (savedinstancestat); // Zahtjev za onemogućavanje strida zaglavlja RequestWindowfeature (prozor. Značajka_no_title); // Prijevod aplikacije u cijelom zaslonu getwindow (). Setflags (WindowManager. Layouts. Flag_fullscreen, WindowManager. Layoutparams. Flag_fullscreen); // Instalirajte maingamepanel kao pogled SetconntentView (nova maingamepanela (ovo)); Dnevnik. d (oznaka, dodano "); ) @ Nadjačavanje zaštićene praznine ondestroy () (log. D (oznaka, "uništavanje ..."); super. Endestroy ();) @ nadjačavanje zaštićene praznine () (log. D (oznaka ", ); Super. Onstop ();))

Počnimo zahtjev. Nakon početka trebate vidjeti crni zaslon. Pomaknite nekoliko puta na vrhu zaslona, \u200b\u200ba zatim na dnu. Program se zatvara. Vrijeme je za provjeru dnevnika.

Nakon pregleda dnevnika dobit ćete jasnu ideju o redoslijedu pokretanja metoda. Također možete vidjeti koliko puta tijekom programa rada upravlja ciklusom igre. Ova brojka ne znači ništa, sljedeći put ćemo donijeti korisnije informacije u dnevnik: FPS i UPS (ažuriranja u sekundi).

Rezimirati. Stvorili smo aplikaciju preko cijelog zaslona. Objavio je razred koji se izvodi u zasebnoj niti i sadržavat će motor za igru. Napisano najjednostavnija metoda Obrada zaslona i kompetentno zatvorena aplikacija.

Sljedeći put kad krenemo na crtanje. Izvorni kod ove lekcije može se preuzeti.

Prijevod i prilagodba: Alexander Ledkov

Kako stvoriti igru \u200b\u200bza Android?











Stvaranje igre za sve operacijski sustav uključuje znanje o programiranju. Čak i za najjednostavnije igre poput Flappy ptice, potrebno je znati njegove temelje. Pogledajmo kako se igra stvara primjerom operativnog sustava Android.

Motor

Prva faza u pisanju igre je instalirati motor. Mreža ima mnogo motora napisanih na raznim programskim jezicima. Naravno, plaćeni motori imaju više funkcija, razlikuju se u stabilnijim operacijama i otvorenim mogućnostima. Međutim, njihov trošak može biti vrlo velik. Stoga ćemo, kao primjer, uzeti besplatni libgdx motor.

Ovaj motor ima prilično velike mogućnosti i ima upute za uporabu na ruskom jeziku. Motor je multiplatform i stoga igra koja će biti napisana na njemu će biti u mogućnosti instalirati na druge platforme.

Okruženje za programiranje

Također vrlo važna točka je korištenje programskog okruženja. Pod ovim pojmom podrazumijeva alat u kojem će se pojaviti igra. U slučaju motora libgdx, programski medij će biti exlipce. Budući da je motor za igru \u200b\u200bnapisan na programskom jeziku Java, onda će koristiti programsko okruženje, morat ćete koristiti osnovne vještine i programiranje znanja na ovom jeziku. Stoga, ako ne znate Azov, morat ćete ih učiti.

Stvaranje projekta

Da biste napisali igru \u200b\u200bna Android, kao i na bilo kojoj drugoj platformi, prvo morate stvoriti projekt. Učini to lakšim. U slučaju libgdx, dovoljno je raspakirati motor u mapu i pronaći istu datoteku u njemu. Zatim ćete morati kliknuti na gumb "Projekt", a već ćete se naći u koraku od stvaranja projekta. Tada će biti potrebno samo odabrati platformu za igru \u200b\u200bi odrediti naziv projekta. U konfiguraciji morate odrediti gdje će biti objavljena igra u programskom okruženju. Sam motor će stvoriti projekt i reći mi ako učinite nešto pogrešno. Zatim možete otići u programsko okruženje i početi pisati igru.

Kao što možete vidjeti, stvaranje igre za Android i bilo koji drugi OS jednostavno je nemoguće bez znanja o osnovama programskih jezika. Međutim, sada motori postaju sve bolji i prikladniji za one koji samo pokreću put u ovom pitanju. Primjer ovog motora je i proizvođač igara. O ovom motoru i o stvaranju igre na njemu možete čitati u članku.

Prvo morate prikupiti sve alate bez kojih to nije potrebno. Ovaj članak će razmotriti stvaranje igre za Android s jedinstvom 3D.

Ako ste početnik, onda za vas na kraju ovog članka postoji niz videozapisa, gdje detaljno opisuje korak-po-korak razvoj vlastite igre od nule.

Izradite vlastitu igru \u200b\u200bna Androidu trebate korak po korak, prema glavnim točkama:

Umetnite Unity 3D grafički urednik za Android i instalirajte na računalo. Program možete preuzeti za stvaranje Android igara s službenog jedinstva.

Morate dobiti program Java JDK video upravljač prema referenci: http://www.orcle.com/technetwork/java/javase/downloads/index.html
U prozoru za preuzimanje odaberite "Download JDK". Ne morate prenijeti JRE motor, to je kompliciraniji u radu i namijenjen je profesionalcima.

Sljedeća trebate alat za ispravljanje pogrešaka Android SDK.Možete ga pronaći s sljedeće veze: http://developer.android.com/sdk/index.html
Odaberite preuzimanje u tablici za instalirani operativni sustav.
Preporučljivo je čitati upute korak po korak Instaliranjem aplikacije na ovim stranicama.

U konačnici, još uvijek morate izvršiti sljedeće postavke:
Vozač za Android uređaj.
Komunikacijski uređaj s Android adb.
Pokrenite USB ispravljanje pogrešaka.

Vozač za Android uređaj je potreban kada razvijete igru \u200b\u200bna računalu.

Dodajte ga putem stavke "Ostali uređaji" u prozoru Upravitelja uređaja.

Ako su upravljački programi već instalirani s vašeg Android telefona, morate ih ažurirati, slijedeći stavke:

Android Telefon\u003e Android Composite ADB sučelje\u003e Svojstva\u003e Vozač\u003e Update upravljački program.

Komunikacijski uređaj s Android adb omogućuje prijenos aplikacije s računala na uređaj Android.

Mi prolazimo uz put c: programske datoteke android-sdk-Windows-alate-alat oznake datoteke: adb.exe, adbwinapi.dll, adbwinusbapi.dll, kopirajte ih i umetnite u mapu c: programske datoteke -Sdk -windows platforme-alati \\

Otvorena naredba Windows.

Idemo na adresu:


Ako se prikaže instalirani program, kao što je prikazano, onda je sve učinjeno ispravno.

U suprotnom, ponovite stavku ažuriranja upravljačkog programa za Android uređaje i kopirajte adb datoteke.

Pokrenite USB ispravljanje pogrešaka.

Postavka se odvija na uređaju Android, kliknite na kartice zauzvrat:

Postavka\u003e Programi\u003e Razvoj\u003e USB ispravljanje pogrešaka

Sada je sve spremno pokrenuti grafički urednik

USAL jelovnik jedinstva 3D programa na engleskom jeziku.


Stvorite novu igru \u200b\u200bprojekta za Android

Neka ime u prozoru s adresom.
Uvezite vrstu ekspanzije aplikacije, dovoljno je provjeriti popis na popisu.
Za Android telefoni - standardna imovina (mobilna). UpityPackage

Prije izrade nove animacije morate konfigurirati program za Android uređaje.

Morate odabrati Android ciljnu platformu u postavkama "Build Settings", a zatim označite "Debug Build" i kliknite Switch Platform.


Klikom na istom skočnom prozoru "Postavke player", u bočnom izborniku "Inspektor" za prikaz:

prethodno dano ime projekta za Android;
Montirana rezolucija videozapisa;
Zadana orijentacija zaslona;
mogućnost odabira ikona za igru;

Sada o samom alatu za stvaranje igara za Android.

Malo o strukturi glavnog programa:

Središte zaslona pokazuje prozor vrste - radni prostor.
U gornjoj kartici izbornika:
"Scena" - ovdje simuliramo animaciju buduće igre.
"Igra" - omogućuje vam pregled uzorka u pokretu.
Kartice na dnu zaslona:
"Hijerarhija" - prikazuje sve vaše akcije s modelom u redoslijedu hijerarhije.
"Projekt" - sadrži gotove modele za stvaranje animacije.
Bočni izbornik "Inspektor" omogućuje vam da obavite: kontrolu nad kretanjem objekta koji se stvara; Postavljanje prikaza s fotoaparata.

Podstavku "Glavna kamera" Kartice "Hijerarhija" uključuje u prozoru hotela, pogled s fotoaparata.

Sada proučite program izbornika da biste stvorili igru \u200b\u200bna Android jedinstvu 3D.
Koristite gotove materijale na kartici projekta i izradite vlastite.

U ovom materijalu, mi ćemo razmotriti alate koje možete koristiti za razvoj igara za Android, kao i pokriti nekoliko okvira i pokušati vam poslati na vašu ideju na pravi put.

Iskreno, ovaj članak neće biti bilo koji vodič ili uputa, najvjerojatnije od ovog članka ćete razumjeti što Googleu napraviti igru \u200b\u200bkoju ste zamislili i to je to. Počnimo.

Što učiniti igre na androidu?

1. Jedinstvo

Počnimo, mi smo vjerojatno iz najboljeg juniorskog motora za igre koje danas postoji i na kojem već postoji mnogo prikladnih igara ne samo na mobilnim platformama (Android i IOS), već iu društvene mreže I na računalima.

Jedinstvo (jedinstvo) to će biti prikladno za vas bez obzira na to koji kompleks projekt koji ste zamislili. Ovaj motor je vrsta aligatora na tržištu univerzalnog motora. Motor se stalno ažurira i nadopunjuje novim impresivnim sposobnostima. UNITI ima dobru 2D i 3D komponentu, a s verzijom 4 ima punopravni 2D čitač i radi s fizičkim motorom.

Kao što je jedinstvo još nije rekao jednom, to je univerzalni motor - pod riječju univerzal podrazumijeva ne samo širok raspon njegove uporabe, već mogućnost da odmah sastavljaju stvorenu igru \u200b\u200bza nekoliko platformi, što je nesumnjivo vrlo dobra pomoć Među ostalim motorima.