Creați un joc de artilerie de la zero

În acest tutorial vom construi un joc de rezervă pentru doi jucători în Multimedia Fusion 2. Acesta va include fotografiere 360 ​​de grade personalizate și teren distrubuitor. Nu aveți nevoie de experiență de programare anterioară sau de dezvoltare a jocului pentru a urmări împreună cu acest tutorial, iar dacă nu aveți Multimedia Fusion 2, puteți încerca demonstrația gratuită.


A juca acest joc

Luați-l în răsucire la celălalt rezervor - Jucătorul Unu este pe partea stângă, iar Jucătorul 2 este în dreapta. Folosiți mouse-ul pentru a urmări; cu cât este mai mult grila din rezervor, cu atât mai puternic va fi împușcat. Primul jucător care a fost lovit pierde.


Introducere

Vom începe prin aranjarea cadrului nostru, astfel încât jocul să funcționeze fără probleme și apoi vom adăuga primul nostru rezervor. După aceea vom face să tragem niște gloanțe care distrug terenul și, în final, se va adăuga un alt tanc pentru a concura.


Setarea spațiului de lucru

Începeți prin a crea o nouă aplicație în Multimedia Fusion 2 (descărcați demo-ul aici dacă nu îl aveți deja) și denumiți-l Joc de artilerie.

Sub opțiunile Runtime jocului Setați Frame Rate la 60 si Modul de afișare la Direct3D 9. Acestea sunt setările de configurare standard pe care le folosesc în majoritatea jocurilor, deoarece oferă o experiență de joc netedă și beneficiază de accelerația hardware pe computerul jucătorului.

Pentru acest tutorial folosim, de asemenea, o rezoluție de 600x480 care pot fi modificate în setările Window. Modificați dimensiunea cadrului la 600x480 de asemenea.

Pentru a face lucrurile mai puțin profesionale, vom scăpa de asemenea Bară de meniu pentru al opri din afișarea în jocul nostru.


Pasul 1: Creați scenă inițială

Acum, că suntem înființați și gata să mergem, este momentul să importăm anumite active pentru jocul nostru.

Puteți obține toate graficele pe care le folosesc în acest tutorial din sursa de descărcare, sau puteți să vă desenați dacă doriți. Grafica pe care o folosesc au fost adaptate de la unele libere disponibile la OpenGameArt.org

După ce ați salvat imaginile pe computer, trageți-le una câte una în Frame 1. Aceasta va importa în jocul nostru, solicitând o casetă de dialog pentru a seta tipul fiecărui obiect.

Începeți prin importarea Terrain. Setați-l la un obiect de fundal cu ajutorul acestuia Tip de obstacol setat la Obstacol.

Înainte de a importa un tanc de import Player One ca un obiect activ, precum și turretul jucătorului One. Nume-le P1Body și P1Turret respectiv. Stabiliți hotspot-ul turelei la (3,3), și hotspot-ul rezervorului (16,14). Astfel se va asigura că atunci când așezăm turela în rezervor, este așezată corect și se rotește corect.

Bacsis: Pentru a plasa hotspot-ul, faceți mai întâi clic pe pictogramă cu un ochi pe el pentru ao face vizibilă, apoi trageți hotspot-ul în punctul dorit.

De asemenea, importați glonțul și crucea ca obiecte active. Vom importa celălalt rezervor mai târziu. Centrarea hotspotului crucii la (15,15). Deblocați "Creați la pornire" de pe glonț și centralizați punctul hotspot. Asigurați-vă că turela rezervorului se află în spatele corpului în ordinea desenului făcând clic dreapta pe el și trimisându-l În spate, sub Ordin opțiune.

În cele din urmă, schimbați culoarea de fundal a cadrului pe un albastru deschis (faceți clic pe Frame 1 din bara de instrumente Spațiul de lucru și apoi modificați proprietatea corespunzătoare din panoul Proprietăți). Utilizare RGB = 115,176,217. Această culoare va fi importantă mai târziu când adăugăm un teren distructabil.

Aranjați obiectele în cadru astfel încât să arate asemănător cu modul în care le am în această imagine.


Pasul 2: Trageți un glonț

Aici o să facem primul nostru rezervor să tragă un glonț în linie dreaptă. Vom adăuga gravitația la gloanțe mai târziu, precum și o explozie atunci când se va ciocni cu solul.

Mai întâi, creați două valori alterabile pentru rezervorul numit DistanceToMouse și AngleToMouse: selectați rezervorul, faceți clic pe pictograma "A-Z" din partea superioară a panoului Proprietăți și faceți clic pe "Nou" de sub "Valori Alterabile". Vom folosi aceste pentru a stoca distanța în pixeli și Unghi în grade față de mouse, respectiv.

Apoi, creați cinci valori alterabile pentru glonț:

  • TempX
  • TempY
  • XSpeed
  • YSpeed
  • InitialSpeed

Aceste valori vor fi folosite pentru a stoca informațiile de mișcare ale glonțului și pentru a implementa Mișcarea personalizată 360 de grade.

E timpul să scriem un cod. Vom începe prin poziționarea pur și simplu a turelei și direcționarea acesteia către mouse.

Adăugați obiectul direcțional avansat la jocul dvs. prin Insert> Object New. Îl vom folosi pentru a calcula unghiul și distanța față de șoarece din rezervorul nostru.

Bacsis: Dacă utilizați demo-ul Multimedia Fusion 2, este posibil să nu aveți acces la Obiectul avansat de Direcție care este disponibil în Bonus Pack 1. În acest caz, pentru a calcula unghiul dintre două obiecte, puteți pur și simplu utiliza această formulă:
360-ATan2 (YMouse-Y ("P1Body"), XMouse-X ("P1Body"))
… in loc de:
Distanta ("Obiect avansat de directie", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)

Apoi adăugați următorul cod în Editorul de evenimente (accesați acest lucru prin Vizualizare> Editor de evenimente):

+ Mereu
- [P1Body] Setați DistanceToMouse la:
Distanta ("Obiect avansat de directie", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)
- [P1Body] Setați AngleToMouse la:
Direcție ("Obiect avansat de direcție", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)
- [P1Turret] Poziționați poziția la (0,0) de la P1Body
- [P1Turret] Setați unghiul la AngleToMouse ("P1Body")
- [Crosshair] Setați Coordonarea X la XMouse
- [Crosshair] Setați Coordonatul Y la YMouse

Dacă rulați jocul acum, ar trebui să vedeți că turela tancului îndreaptă acum spre cruce și că șurubul este poziționat deasupra cursorului mouse-ului.

Acum haideți un glonț. Adăugați următorul cod:
+ User clicks cu butonul din stânga
- [Creare] Creați Bullet la (0,0) de la P1Body
- [Bullet] Setați TempX la X ("Bullet")
- [Bullet] Setați TempY la Y ("Bullet")
- [Bullet] Setați InitialSpeed ​​la Min (DistanceToMouse ("P1Body") / 17.0, 15)
- [Bullet] Setați XSpeed ​​la Cos (AngleToMouse ("P1Body")) * InitialSpeed ​​("Bullet")
- [Bullet] Setați YSpeed ​​la Sin (AngleToMouse ("P1Body")) * InitialSpeed ​​("Bullet") * - 1

+ Mereu
- [Bullet] Adăugați XSpeed ​​("Bullet") în TempX ("Bullet")
- [Bullet] Adaugă YSpeed ​​("Bullet") la TempY ("Bullet")
- [Bullet] Setați Poziția X la TempX ("Bullet")
- [Bullet] Setați poziția Y la TempY ("Bullet")

Dacă executați jocul (prin meniul Executare), ar trebui să vedeți că rezervorul trage un glonț în linie dreaptă fără gravitate.

Deci, ce face acest cod?

Mai întâi vom crea un glonț la corpul rezervorului. Apoi folosim valorile TempX și TempY pentru a stoca poziția curentă a glonțului. Am stabilit viteza inițială a Bullet-ului la distanța de la rezervor la mouse-ul, cu o putere maximă de 15. (Distanța este împărțită la 17.0 pentru a reduce puterea în jos.) Acestea sunt doar valori pe care le-am făcut doar după câteva testare. Puteți să jucați cu aceste două valori pentru a schimba rapid cât se declanșează glonțul.

Apoi calculam XSpeed și YSpeed din unghiul și puterea folosind trigonometria. Nu vă faceți griji dacă nu înțelegeți matematica din spatele acestui lucru!

În cele din urmă, în Mereu eveniment actualizăm în permanență poziția bulletului stocat în TempX și TempY adăugând gloanțele XSpeed și YSpeed respectiv.

De ce folosiți TempX și TempY?

Trebuie să stocăm pozițiile noastre intermediare în valori alterabile pentru mișcările personalizate, deoarece Multimedia Fusion 2 nu le folosește flotoare (numere cu puncte zecimale) pentru coordonatele sale - utilizează numere întregi (numere întregi).

Dacă încercați să setați Poziția X a Bulletului la X ("Bullet") + 0,2 veți vedea că nu se va mișca nicăieri, deoarece 0.2 este rotunjită până la 0 și, prin urmare, Bullet-ul este setat la poziția sa actuală.


Pasul 3: Adăugați gravitatea

Acum, că putem trage un glonț, trebuie să adăugăm gravitatea pentru a face ca glonțul să cadă odată ce acesta părăsește tunul tancului.

În primul rând, avem nevoie de un loc pentru a stoca câteva valori care vor fi folosite în timpul jocului nostru, cum ar fi puterea gravitației. Într-un joc MMF2 există numeroase locuri pentru a stoca acest tip de informații. Unii oameni preferă să creeze un obiect specific doar pentru a ține valori. În acest tutorial vom folosi Valorile Globale - valori care sunt disponibile de oriunde pe tot parcursul jocului - pentru a ne menține valorile importante.

Accesați Valorile Globale pentru aplicația dvs. (Faceți clic pe Aplicația din Bara de instrumente pentru spațiu de lucru, apoi selectați pictograma "A-Z" din panoul Proprietăți) și creați o nouă valoare: Y_Gravity.

Bacsis: Dacă doriți să faceți codul mai ușor de citit, puteți adăuga și o altă valoare globală pentru Viteza maxima și folosiți-o în loc de "15.0" unde se calculează InitialSpeed pentru glonț. Acest lucru vă va permite să schimbați cu ușurință puterea maximă fără a fi nevoie să vă modificați codul oriunde apare.

MMF2 nu vă permite să tipăriți flotoare în Valorile Globale și din moment ce dorim ca gravitatea noastră să fie mai mică decât una, va trebui să o setăm în cod:

Acum, pur și simplu, trebuie să adăugăm această gravitate la YSpeed ​​a glonțului pe fiecare cadru.

Adăugați linia:

+Mereu
- [Bullet] Adaugă Y_Gravity la YSpeed

Puteți să faceți dublu clic pe orice eveniment pentru a intra în Mod List și pentru a modifica ordinea acțiunilor evenimentului. Plasați noua linie între acțiunile existente așa cum am făcut aici.

Acum, când executați jocul, rezervorul dvs. ar trebui să tragă un glonț care se întoarce spre pământ.


Pasul 4: Distrugeți terenul

Apoi trebuie să facem glonțul să creeze găuri în pământ atunci când se ciocnește cu el. Pentru a face acest lucru vom beneficia de funcția "Add to Backdrop" a Multimedia Fusion.

Adăugați în Backdrop pastreaza permanent imaginea unui obiect activ pe fundal atunci cand jocul ruleaza. Poate afecta dacă o anumită parte a fundalului înregistrează o coliziune sau nu. Ceea ce vom face este să avem o formă de "gaură" care taie un cerc în fundal la fel de mare ca animația de explozie care îl însoțește.

Adăugați o gaură

Import explosion_hole.png ca Obiect activ prin glisarea lui în cadru. Centrează hotspot-ul său la (32,32).

Import explosion_graphic_1.png ca un alt obiect activ. La întrebarea dacă doriți să importați explosion_graphic_2.png, etc, alegeți da.

Centrează și hotspoturile de pe aceste raze grafice de explozie.

Codul pentru adăugarea unui teren distrubuitor este destul de simplu. Atunci când un glonț se ciocnește cu fundalul, trebuie doar să creăm obiectul și să îl adăugăm în fundal.

Creați gaura atunci când colțul se colizează cu fundalul:

Adăugați gaura în fundal ca "Nu este un obstacol" (astfel încât gloanțele să poată trece prin ea):

Creați de asemenea o explozie grafică (una care va arăta unde a lovit Bullet-ul) și distrugeți Bullet-ul la sfârșit. De asemenea, putem distruge gaura după ce a fost adăugată în fundal:

În cele din urmă, distrugeți explozia grafică după terminarea jocului:

Dacă executați jocul trebuie să aveți acum un rezervor capabil să focalizați și să trageți terenul, creând explozii și lăsând găuri.


Pasul 5: Adăugați un alt jucător

În cele din urmă vom adăuga un alt jucător la jocul nostru. Vom copia codul pe care l-am primit pentru primul nostru rezervor și îl vom aplica pe altul. De asemenea, vom avea nevoie de o nouă variabilă globală pentru a urmări care este rândul său.

Adăugați graficele jucătorului doi

Importați corpul rezervorului playerului și turela în același mod ca și în cazul playerului One. Așezați al doilea rezervor pe partea dreaptă a cadrului.

În editorul de evenimente, copiați codul pentru primul rezervor în cel de-al doilea, va trebui, de asemenea, să creați valorile alterabile DistanceToMouse și AngleToMouse în rezervorul celui de-al doilea jucător. Am adăugat comentarii la codul meu pentru a fi mai ușor de văzut. Dacă rămâneți blocat, urmați din nou prima parte a acestui tutorial, dar faceți-l pentru al doilea rezervor.

Dacă executați jocul acum, ambele tancuri se vor aprinde în același timp spre cruce.

Creați noi variabile

Creați două noi variabile globale numite CurrentPlayerTurn și TurnCooldown.

TurnCooldown va fi folosit pentru a împiedica tancurile de la ambele arderi în același timp. Ori de câte ori un jucător împușcă, vom seta această cooldown la o valoare mică, care va conta la zero și nu vom permite celuilalt jucător să tragă până când această valoare ajunge la zero.

Noi vom folosi CurrentPlayerTurn = 0 pentru a reprezenta rândul jucătorului 1 și CurrentPlayerTurn = 1 să reprezinte rândul jucătorului doi.

Sub codul de fotografiere al jucătorului One cu User clicks cu butonul Stânga, adăugați condiția CurrentPlayerCooldown = 0 astfel încât un rezervor să privească numai mouse-ul și poate să declanșeze când are controlul. Pentru aceasta, utilizați condiția "Comparați cu o valoare globală":

Adăugați, de asemenea, condiția TurnCooldown = 0 pentru a vă asigura că filmul sa răcit înainte de a încerca să fotografiați.

Adăugați încă două acțiuni la A stabilit TurnCooldown la o valoare mică de 3, și CurrentPlayerTurn la 1-CurrentPlayerTurn. (Aceasta înseamnă că dacă CurrentPlayerTurn este 0, acesta va fi setat la 1 și dacă este 1 acesta va fi setat la 0.)

După ce faceți toate acestea, iată cum ar trebui să arate codul dvs.:

Duplicați același cod pentru Player Two, dar schimbați condiția pentru a reflecta rândul jucătorului doi CurrentPlayerTurn = 1

Și, în sfârșit, adăugați încă o condiție pentru a scădea cooldown-ul nostru ori de câte ori este mai mare decât zero:

Dacă joci jocul acum ar trebui să poți trage ambele rezervoare unul la celălalt, fiecare lovitură schimbând rândul curent al rezervorului.


Pasul 6: Adăugați condiția Win

Acum că putem trage, tot ce trebuie să facem este să adăugăm o modalitate de a ne arunca unul pe altul! Acest lucru este destul de simplu. Trebuie doar să detectăm dacă o explozie se suprapune peste un rezervor și dacă este, distrugem rezervorul și nu lăsăm pe nimeni să tragă după el.

Adăugați următorul cod:

+ [Explosion_Graphic] se suprapune [P1Body]
- Distruge [P1Body]
- Distruge [P1Turret]
- Setați CurrentPlayerTurn la -1

+ [Explosion_Graphic] se suprapune [P2Body]
- Distrugeți [P2Body]
- Distrugeți [P2Turret]
- Setați CurrentPlayerTurn la -1

Iată cum arată codul Player One:

Distrugerea jucătorilor și a turlelor lor este destul de explicativă. Am setat CurrentPlayerTurn la -1 astfel încât jucătorii nu mai pot declanșa foc (așa cum o cer condițiile CurrentPlayerTurn pentru a fi egal cu 0 sau 1).

Dacă executați jocul dvs. ar trebui să vă puteți împușca unul pe celălalt până când unul dintre voi aruncă în aer!


Concluzie

Acum aveți un joc rezervor complet cu două jucători pe care îl puteți juca cu prietenii. De aici puteți adăuga elemente cum ar fi viteza aleatorie a vântului care afectează traiectoria bulletului, arme noi, sunete, efecte particulare și multe altele!

Distrează-te cu asta!