I denne opplæringen skal vi bygge et to-spiller tankespill i Multimedia Fusion 2. Det vil inneholde tilpasset 360 graders skyting og ødeleggende terreng. Du trenger ikke noen tidligere programmering eller spillutvikling erfaring for å følge med denne opplæringen, og hvis du ikke har Multimedia Fusion 2 kan du prøve gratis demo.
Ta det i sving for å skyte på den andre tanken - Spiller One er til venstre, og Spiller To er til høyre. Bruk musen til å sikte; Jo lenger bort krysshår er fra tanken din, desto kraftigere blir skuddet. Den første spilleren som blir rammet, mister.
Vi starter med å sette opp vår ramme slik at spillet går jevnt, og så legger vi til vår første tank. Etter det vil vi få det til å skyte noen kuler som ødelegger terrenget, og til slutt vil en annen spiller tank bli lagt til for å konkurrere mot.
Begynn med å opprette et nytt program i Multimedia Fusion 2 (last ned demoen her hvis du ikke allerede har den) og navnet på den Artilleri Game.
Under spillets Runtime-alternativer Angi Rammefrekvens
til 60
og Visningsmodus
til Direct3D 9
. Dette er standardkonfigurasjonsinnstillingene jeg bruker på de fleste spill, da de gir en jevn spillopplevelse og utnytter maskinvareaccelerasjon på spillerens datamaskin.
For denne opplæringen bruker vi også en oppløsning av 600x480
som kan endres i vinduinnstillingene. Endre rammens størrelse til 600x480
også.
For å gjøre ting litt mer profesjonelle, slipper vi også av Menyfelt
å stoppe det fra å vise i vårt spill.
Nå som vi er satt opp og klar til å gå, er det på tide å importere noen eiendeler til spillet vårt.
Du kan få all grafikken som jeg bruker i denne opplæringen fra kilde nedlastingen, eller du kan tegne din egen hvis du vil. Grafikken jeg bruker er blitt tilpasset fra noen gratis tilgjengelige på OpenGameArt.org
Etter at du har lagret bildene på datamaskinen, drar du dem en etter en i ramme 1. Dette vil importere dem til spillet vårt, og du får en dialogboks til å angi type for hvert objekt.
Begynn med å importere terrenget. Sett det til et bakgrunnsobjekt med dets Hindringstype
satt til Hindring
.
Deretter importerer spillerens tank som et aktivt objekt, så vel som spillerens turret. Gi dem navn P1Body
og P1Turret
henholdsvis. Sett turret til turret til (3,3)
, og tanken til (16,14)
. Dette sikrer at når vi setter tårnet på tanken, plasseres det ordentlig og roterer riktig.
Importer også kule og krysshår som aktive objekter. Vi importerer den andre tanken senere. Senter krysshårets hotspot på (15,15)
. Untick "Create at Start" på kulen, og senter sin hotspot. Pass på at tårnetårnet ligger bak kroppen i tegningsordre ved å høyreklikke på den og sende den Tilbake
, under Rekkefølge
alternativ.
Endelig, endre bakgrunnsfargen til rammen til en lyseblå (klikk på Ramme 1 i arbeidsområdet på verktøylinjen, og endre deretter den aktuelle egenskapen fra Egenskaper-panelet). Bruk RGB = 115.176.217
. Denne fargen vil være viktig senere når vi legger til ødeleggende terreng.
Ordne objektene i rammen slik at de ligner på hvordan jeg har dem i dette bildet.
Her skal vi gjøre vår første tankeskudd en kule i en rett linje. Vi legger tyngdekraften til kulen senere, så vel som en eksplosjon når den kolliderer med bakken.
For det første, opprett to alterbare verdier for tanken som kalles DistanceToMouse
og AngleToMouse
: Velg tanken, klikk på "A-Z" -ikonet øverst på Egenskaper-panelet, og klikk på "Nytt" under "Endre verdier". Vi bruker disse til å lagre Avstanden i piksler og Vinkel i grader til musen, henholdsvis.
Deretter opprett fem alterbare verdier for kulen:
TempX
TempY
xSpeed
YSpeed
InitialSpeed
Disse verdiene vil bli brukt til å lagre bulletens bevegelsesinformasjon og implementere vår Custom 360 Degrees Movement.
Det er på tide å skrive noen kode. Vi starter med å bare plassere tårnet og gjøre det mot musen.
Legg avansert retningsobjekt til spillet ditt via Sett inn> Nytt objekt. Vi bruker den til å beregne vinkelen og avstanden til musen fra tanken vår.
Tips: Hvis du bruker demo av Multimedia Fusion 2, har du kanskje ikke tilgang til Advanced Direction Object som er tilgjengelig i Bonus Pack 1. I dette tilfellet, for å beregne vinkelen mellom to objekter, kan du bare bruke denne formelen:360-ATan2 (YMouse-Y ("P1Body"), XMouse-X ("P1Body"))
… i stedet for:Avstand ("Avansert retningsobjekt", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)
Deretter legger du til følgende kode i hendelseseditoren (kom til dette via Vis> Event Editor):
+ Alltid
- [P1Body] Sett DistanceToMouse til:
Avstand ("Avansert retningsobjekt", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)
- [P1Body] Sett AngleToMouse til:
Retning ("Avansert retningsobjekt", X ("P1Body"), Y ("P1Body"), XMouse, YMouse)
- [P1Turret] Still posisjonen ved (0,0) fra P1Body
- [P1Turret] Angi Angle To AngleToMouse ("P1Body")
- [Crosshair] Sett X Koordinere til XMouse
- [Crosshair] Sett Y Koordinere til YMouse
Hvis du kjører spillet ditt nå, bør du se at tanktårnet nå peker mot krysshåret, og at krysshåret er plassert ved musemarkøren.
La oss brenne en kule. Legg til følgende kode:+ Brukerklikk med venstre knapp
- [Opprett] Lag kule på (0,0) fra P1Body
- [Bullet] Angi TempX til X ("Bullet")
- [Bullet] Angi TempY til Y ("Bullet")
- [Bullet] Sett InitialSpeed to Min (DistanceToMouse ("P1Body") / 17.0, 15)
- [Bullet] Sett XSpeed to Cos (AngleToMouse ("P1Body")) * InitialSpeed ("Bullet")
- [Bullet] Set YSpeed to Sin (AngleToMouse ("P1Body")) * InitialSpeed ("Bullet") * - 1
+ Alltid
- [Bullet] Legg til XSpeed ("Bullet") til TempX ("Bullet")
- [Bullet] Legg til YSpeed ("Bullet") til TempY ("Bullet")
- [Bullet] Sett X Posisjon til TempX ("Bullet")
- [Bullet] Still Y-posisjon til Tempy ("Bullet")
Hvis du kjører spillet ditt (via Run-menyen), bør du se tanken skyte en kule i en rett linje uten tyngdekraften.
Først oppretter vi en kule på tankens kropp. Vi bruker deretter verdiene TempX
og TempY
for å lagre kulens nåværende posisjon. Vi setter Bullets innledende hastighet til avstanden fra tanken til musen, med en maksimal effekt på 15. (Avstanden er delt med 17,0 for å skalere dens styrke ned.) Disse er bare verdier som jeg ganske enkelt gjorde etter noen testing. Du kan selv spille med disse to verdiene for å endre hvor raskt kulen brenner.
Vi beregner deretter xSpeed
og YSpeed
fra vinkelen og kraften ved hjelp av trigonometri. Ikke bekymre deg hvis du ikke forstår matematikken bak hvordan dette virker!
Til slutt, i Alltid
Hendelse vi oppdaterer kontinuerlig posisjonen til kula som er lagret i TempX
og TempY
ved å legge til kulen xSpeed
og YSpeed
henholdsvis.
TempX
og TempY
?Vi må lagre våre mellomliggende posisjoner i varierbare verdier for tilpassede bevegelser, siden Multimedia Fusion 2 ikke bruker flyter (tall med desimaltall) for koordinatene - det bruker heltall (hele tall).
Hvis du prøver å sette Bullet X Position til X ("Bullet") + 0.2
du vil se at den ikke vil bevege seg hvor som helst, fordi 0,2 er avrundet til 0, og dermed er Bullet satt til sin nåværende posisjon.
Nå som vi kan skyte en kule, må vi legge til tyngdekraft for å få kulen til å falle når den forlater tankens kanon.
Først trenger vi et sted å lagre noen verdier som vil bli brukt gjennom hele spillet vårt, som tyngdekraftenes styrke. I et MMF2-spill er det mange steder å lagre denne typen informasjon. Noen foretrekker å lage et bestemt objekt bare for å holde verdier. I denne opplæringen skal vi bruke globale verdier - verdier som er tilgjengelige overalt i spillet - for å holde våre viktige verdier.
Gå til de globale verdiene for søknaden din (Klikk på Program i arbeidsområdet på verktøylinjen, velg deretter "A-Z" -ikonet i Egenskaper-panelet) og opprett en ny verdi: Y_Gravity
.
Maksimal hastighet
og bruk den i stedet for "15.0" der vi beregner InitialSpeed
for kulen. Dette gjør at du enkelt kan endre maksimal effekt uten at du må redigere koden din overalt, det vises. MMF2 tillater deg ikke å skrive flyt i Global Verdier, og siden vi vil at vår tyngdekraften skal være mindre enn en, må vi sette den i kode:
Nå må vi ganske enkelt legge til denne tyngdekraften til YSpeed of the bullet på hver ramme.
Legg til linjen:
+Alltid
- [Bullet] Legg til Y_Gravity To YSpeed
Du kan dobbeltklikke på et hvilket som helst arrangement for å gå inn i Listemodus og endre rekkefølgen for hendelseshandlinger. Plasser den nye linjen mellom de eksisterende handlingene som jeg har gjort her.
Nå når du kjører spillet, skal tanken skyte en kule som faller tilbake mot bakken.
Deretter må vi gjøre kulen skape hull i bakken når den kolliderer med den. For å gjøre dette skal vi dra nytte av Multimedia Fusion's "Add to Backdrop" -funksjon.
Legg til i bakgrunnen
limer et aktivt objekts bilde i bakgrunnen permanent når spillet kjører. Det kan påvirke om en bestemt del av bakgrunnen registrerer kollisjoner eller ikke. Det vi skal gjøre er å ha en "hull" form som kutter en sirkel i bakgrunnen så stor som eksplosjonsanimasjonen som følger med den.
Importere explosion_hole.png
som et aktivt objekt ved å dra det inn i rammen. Senter sin hotspot på (32,32)
.
Importere explosion_graphic_1.png
som et annet aktivt objekt. Når du blir spurt om du vil importere explosion_graphic_2.png
, etc., velg Ja.
Sentrere hotspots på disse eksplosjonsgrafikkrammene også.
Koden for å legge til ødeleggende terreng er ganske enkelt. Når en kulde kolliderer med bakgrunnen, trenger vi bare å lage hullobjektet og legge det til bakgrunnen.
Lag hullet når Bullet kolliderer med bakgrunnen:
Legg hullet til bakteppet som "Ikke et hinder" (slik at kuler kan passere gjennom det):
Lag også en grafisk eksplosjon (en som vil vise hvor Bullet treffer) og ødelegge Bullet på slutten. Vi kan også ødelegge hullet når det er lagt til bakgrunnen:
Endelig ødelegge den grafiske eksplosjonen når den er ferdig med å spille animasjonen:
Hvis du kjører spillet, bør du nå ha en tank som er i stand til å sikte og skyte terrenget, skape eksplosjoner og forlate hull.
Endelig skal vi legge til en annen spiller i vårt spill. Vi skal kopiere koden vi allerede har til vår første tank, og bruke den til en annen. Vi skal også ha en ny global variabel for å holde oversikt over hvilken tur det er.
Import Player Two tank body og turret på samme måte som du gjorde med Player One. Plasser den andre tanken på høyre side av rammen.
I Event Editor, kopier koden for den første tanken til den andre, Du må også opprette de endrede verdiene DistanceToMouse
og AngleToMouse
i den andre spillers tank. Jeg har lagt til kommentarer til koden min for å gjøre det enklere å se. Hvis du sitter fast, følg bare den første delen av denne opplæringen igjen, men gjør det for den andre tanken.
Hvis du kjører spillet nå, vil begge tankene brann på samme tid mot krysshåret.
Opprett to nye globale variabler kalt CurrentPlayerTurn
og TurnCooldown
.
TurnCooldown
vil bli brukt til å forhindre at tankene begge brenner samtidig. Når en spiller skyter vil vi sette denne nedkjølingen til en liten verdi, som vil telle ned til null, og vi vil ikke tillate den andre spilleren å skyte til denne verdien når null.
Vi vil bruke CurrentPlayerTurn = 0
å representere spillerens tur og CurrentPlayerTurn = 1
å representere spillerens tur.
Under spillerens skytekode med Brukerklikk med venstre knapp
, legg til tilstanden CurrentPlayerCooldown = 0
slik at en tank bare ser på musen og kan brenne når den har vri kontroll. For å gjøre dette, bruk "Sammenlign til en global verdi" tilstand:
Legg også til tilstanden TurnCooldown = 0
for å sikre at skuddet er avkjølt før du prøver å skyte.
Legg til to flere handlinger til Sett
de TurnCooldown
til en liten verdi på 3 og CurrentPlayerTurn
til 1-CurrentPlayerTurn
. (Dette betyr at hvis CurrentPlayerTurn
er 0 det vil bli satt til 1, og hvis det er 1 vil det bli satt til 0.)
Etter å ha gjort alt dette, her er hva koden din skal se ut som:
Dupliser samme kode for spiller to, men endre tilstanden for å reflektere spiller to snu med CurrentPlayerTurn = 1
Og til slutt legg til en ekstra betingelse for å senke vår nedkjøling når den er større enn null:
Hvis du spiller spillet nå, bør du kunne skyte begge tankene på hverandre, med hvert skudd som veksler dagens tankes tur.
Nå som vi kan skyte, er alt vi trenger å gjøre, legge til en måte å blåse hverandre opp! Dette er ganske enkelt. Vi trenger bare å oppdage om en eksplosjon overlapper en tank, og hvis det er, ødelegger vi tanken og tillater ikke at noen brenner etter det.
Legg til følgende kode:
+ [Explosion_Graphic] overlapper [P1Body]
- Ødelegge [P1Body]
- Ødelegge [P1Turret]
- Sett CurrentPlayerTurn til -1
+ [Explosion_Graphic] overlapper [P2Body]
- Ødelegge [P2Body]
- Ødelegge [P2Turret]
- Sett CurrentPlayerTurn til -1
Slik ser koden ut etter spiller ett:
Å ødelegge spillerne og deres tårn er ganske selvforklarende. Vi satte CurrentPlayerTurn
til -1
slik at spillerne ikke lenger kan brenne (som betingelsene krever CurrentPlayerTurn
å være lik 0
eller 1
).
Hvis du kjører spillet ditt, bør du kunne skifte skudd hverandre til en av dere blåser opp!
Nå har du et fullt funksjonelt to-spiller tankspill som du kan leke med vennene dine. Herfra kan du legge til ting som tilfeldig vindhastighet som påvirker kulens trajectory, nye våpen, lyder, partikkeleffekter og mer!
Ha det gøy med det!