Cine ar argumenta că programele cele mai utile și necesare pentru orice platformă mobilă - este cu siguranță un joc! Și Android nu este deloc o excepție. Un dispozitiv mobil în zilele noastre este un centru de divertisment în buzunar. Putem spune că cursa modernă pentru productivitate este un rezultat direct al acestei tendințe. Ei bine, și noi și noi vom fi într-o tendință! Dezvoltarea oricărui proces de joc este destul de consumatoare de timp și laborioasă. Un motor de joc de ortografie - poate nu mai puțin complicat.
Așadar, am decis să încerc să scriu motorul meu de joc Android și să împărtășesc această experiență cu dvs.
Mai întâi de toate, este necesar să determinăm ce oportunități va avea motorul nostru? La urma urmei, scopul creației sale este să ne ușureze dezvoltarea jocului în viitor. Nu vom scrie un motor tridimensional. Prea greu pentru noi incepatori. Prin urmare, încercați să creați un simplu motor 2D pentru animația sprite. Poate în acest proces îl vom extinde. Funcționalul său va include următoarele:
- Lucrul cu sistemul însuși, cum ar fi: crearea unei suprafețe pentru desen, urmărirea redării.
- Lucrați cu primitive grafice - (un punct, o linie, un dreptunghi, un cerc, o elipsă).
- Abilitatea de a muta primitivi.
- Lucrați cu sprite (încărcați, mutați, rotiți, redimensionați).
Toate acestea sunt destul de simple pentru a organiza funcțiile încorporate ale sistemului, dar dacă aveți de gând să scrieți mai mult de un joc, atunci faceți-l de fiecare dată este destul de obositor. Prin urmare, simpla concluzie că toate aceste funcții ar trebui aruncate în biblioteca lor de clasă mică. Asta e creatura cu care ne confruntăm. În paranteze, să încercăm să dăm seama de unde se dezvoltă în acest androdiu 🙂 Așadar, creăm un nou proiect Android:
În parametrii acestui proiect, specificați numele proiectului și pachetul implicit:Ei bine, proiectul a fost creat, acum ne îndreptăm către cea mai simplă și cea mai elementară clasă a motorului nostru. Deci se numește mBasic. Toate celelalte clase de lucru cu primitivi vom moșteni din această clasă în viitor. Iată codul lui:
Deci, am definit o clasă abstractă (aceasta înseamnă că în programele noastre nu putem instanța o astfel de clasă direct), în care am definit mai multe tipuri diferite de primitive ca constante. TYPE_POINT - punct, TYPE_LINE - segment, TYPE_POLYLINE - polilinie, TYPE_RECT - dreptunghi, TYPE_CIRCLE - cerc, TYPE_SIMPLESPRITE - sprite simplu. De fapt, nu cred că vom avea nevoie de toate aceste tipuri de primitivi în lucrul la joc, dar doar în caz, să fie. De asemenea, în această clasă, definim o metodă abstractă de actualizare (), care va fi utilizat pentru a actualiza parametrii primitiv nostru și o altă boolean metodă este ales (float f, float g) - pentru a le vom folosi pentru a determina doarece aparține dacă punctul cu coordonatele f și g la primitiv nostru. Ei bine, hai să setăm metoda draw (Canvas c, Paint p). Vom avea nevoie de el pentru a atrage primii noștri. Parametrii metodei sunt obiecte tip Canvas (pânza pe care vrem să desenați) și Paint (a cărui perie vrem să o desena). Ambele metode sunt abstracte, apoi le vom implementa în clasele corespunzătoare.
Acum să începem să implementăm biblioteca noastră. Să începem cu clasa mPoint - această clasă va fi responsabilă pentru lucrul cu punctul. Parametrii x și y - acest lucru este de înțeles, poziția punctului de pe ecran (sau în afara acestuia). dx și dy reprezintă viteza unui punct în direcția fiecărei axe. axX și axY este accelerația unui punct dacă acesta este mai mare decât unul, atunci punctul va fi accelerat, dacă este mai mic decât unul, apoi încetinește. (de ce trebuie să facem acest lucru mai târziu). Clasa mPoint se va moșteni din clasa mBasic. Și vom specifica mai mulți constructori diferiți, astfel încât nu ar fi plictisitor :-). Ca rezultat, obținem următoarea clasă:
Și ce face metoda update () pe care am moștenit-o de la clasa părinte? El povestește noile coordonate ale punctului, având în vedere viteza și accelerația acestuia. Rețineți că în fiecare constructor specificăm strict tipul de obiect creat:
Așa că ne vom salva în viitor din mai multe probleme. Am implementat, de asemenea, metoda darw (Canvas c, Paint p) în implementarea sa utilizând metoda standard a Canvasului: Canvas.drawPoint (float x, float). Printre altele, am cerut câteva metode accesoriale. Practic, cred că întregul cod este destul de transparent și nu va provoca dificultăți.
Acum implementați clasa care va fi responsabilă pentru lucrul cu segmentele. Iată codul său:
Ei bine, nu este nimic complicat deloc aici! Linia în înțelegerea noastră este definită de capetele segmentului. De fapt, aici există două puncte p1 și p2 - care sunt capetele segmentului nostru. Câțiva constructori diferiți în care sunt specificați aceste puncte și o metodă pentru actualizarea poziției punctelor (deoarece clasa mLine este moștenită de la mBasic, atunci această metodă trebuie implementată și aici). La fel ca în cazul desenării unui punct, am folosit metoda standard darwLine ().
Ți-a plăcut? A fost util? Distribuiți!
Pentru viitor, este probabil mai ușor să operați cu vectorul de accelerație decât să stocați accelerația de-a lungul celor două axe.
Puteți să-l (accelerare) intră în clasa de bază - și apoi putem construi mișcări foarte complexe de obiecte, de exemplu, toate linia întreruptă se deplasează pe calea lor proprie, cu o accelerație și punct în plus se mută fiecare cu propria sa. Ceva asemănător poate fi văzut în Lumea Goo.
Dacă implementați imediat un vector, la nivelul superior va fi mult mai ușor să lucrați.
Doar IMHO mea, desigur.
Da, ideea este bună! De asemenea, m-am gandit sa fac acest lucru in primul rand, atunci ceva a fost prea lenes. 🙂 Daca il implementati, va fi grozav, dar daca trimiteti si codul sursa pentru mine, va fi grozav!
În ceea ce privește calculele de viteză și accelerație în metoda de actualizare, clasa mPoint - mi se pare că viteza nu ar trebui multiplicată prin accelerare, ci adăugată. Imaginați-vă un obiect care trimite în lumea reală, accelerația este de 10 m / s ^ 2 (9.8). În momentul de față, corpul cade la o viteză de 10 m / s, într-un al doilea 20 m / s, apoi 30, etc. Dacă înmulțim viteza cu accelerația, atunci ajungem într-un al doilea 100, apoi 1000, etc. Nu e prea cool? În plus, dacă, pe baza formulelor dvs., luați viteza inițială a obiectului = 0, atunci indiferent cât de mult îi înmulțim cu accelerația, viteza va rămâne zero. În general, cursul fizicii școlare)
Da 🙂 Ei bine, în principiu, este logic 🙂 Nu mă deranjez prea mult acolo ca scris și scris 🙂 Studiat 🙂
Da. Sunt de acord. Logica este că prima diferență este identică.
Îndrăznesc să corectez: nu accelerați la viteza pe care trebuie să o adăugați și accelerarea înmulțită de timp, deoarece viteza și accelerația au unități de măsură diferite. Viteza se obține la un anumit moment Vt = V + a * t. Ei bine, și pentru codificare aveți dreptate folosim «this.dx + this.axX», deoarece credem că actualizarea va avea loc în fiecare secundă.
Buna ziua.
La bătrânețe am decis să fac programare. Experiența în C este, iar în Java în timp ce stejarul-stejar.
Cea mai nubiană întrebare:
Am creat proiectul, apoi scrieți imediat codul. Și unde să îl inserați? Am înțeles că este necesar să mergi la Project -> în taticul SCR -> spațiul de nume dvs. -> acolo a crea un nou fișier cu codul java și lipiți-l. Și apelați fiecare fișier în consecință. Am dreptate sau nu? Și dacă este necesar, atunci undeva să folosiți ceva de tip # include ca în Cu ++? Sau Eclipse colectează totul într-o grămadă mare? Neponyatnenko.
Acum, puțin mai puțin decât întrebarea Noob. În prima listă, este posibil să se folosească enum pentru a reduce semnificativ dimensiunea codului cu conservarea completă a semnificației?
Ei bine, la început - în toate articolele, ar fi bine să faceți o legătură cu "cuprinsul" la începutul și la sfârșitul articolului.
Cu întrebarea mea nubian parțial extras - descărcat de la ultimul tutore proiectul dvs. și a arătat ca acolo este făcut. Deci, așa cum am crezut 🙂
De asemenea, se găsește în antetul elementului de blog "lecții pe androyd", așadar problema rezolvării problemei găsirii unui cuprins)
Da. Însuși a sărit. Unde am scris despre metoda cu inexactitate - acolo este necesar să luăm modulul din diferență și să îl comparăm cu delta.
Toate cele trei înregistrări trebuie să fie înghesuiți în fișiere separate? și cum să numești aceste fișiere? unde vor fi localizate aceste fișiere? în general, ceva ce nu înțeleg ...
Și nu ați putea scrie o altă clasă care să afișeze pur și simplu primitivii implementați în motor? Cred că de data aceasta nu va dura mult din timpul tău, dar va fi un bun exemplu al muncii de la ore.