Questo tutorial è una rielaborazione di: Game Maker Tutorial – A Scrolling Shooter – Written by Mark Overmars – Copyright © 2007-2009 YoYo Games Ltd
www.yoyogames.com/downloads/tutorials/shooter.zip
Questo tutorial tratta direttamente la versione con vista di 1945.
I giochi del tipo scrolling shooter sono molto popolari e sono piuttosto semplici da realizzare con un ambiente di sviluppo come GameMaker.
In uno scrolling shooter il giocatore controlla un oggetto (aeroplano, navicella spaziale, auto) che si muove su uno sfondo in movimento.
Sullo sfondo appaiono degli ostacoli che devono essere evitati e dei nemici ai quali bisogna sparare.
Spesso appaiono degli oggetti che devono essere raccolti per ottenere dei vantaggi aggiuntivi.
Durante il gioco i nemici aumentano di numero, tipo, pericolosità rendendo sempre più difficile sopravvivere.
In questo tutorial creeremo uno scrolling shooter di nome 1945, nel quale il giocatore vola con un aereo sul mare e degli aerei nemici cercano di distruggerlo.
Ecco come apparirà il gioco:
Il giocatore controlla il grosso aereo giallo che vola in avanti.
Nell’immagine si vedono anche gli aerei nemici.
In basso sono rappresentati il punteggio, il numero di vite rimaste (gli aerei piccoli), e i danni (sotto forma di barretta verde).
Il movimento
Allora, come si realizza uno sfondo scorrevole in GameMaker?
Discuteremo la seguente tecnica tra quelle disponibili
- Creeremo un’immagine molto grande per il livello e ne renderemo visibile solo una piccola parte, una vista.
- La vista si sposta lentamente verso la parte alta del livello.
Crea le risorse di base
TIPO | NOME | FILE | |
---|---|---|---|
Sprite | spr_water | water.png | |
spr_island1 | island1.png | ||
spr_island2 | island2.png | ||
spr_island3 | island3.png | ||
spr_myplane | myplane_strip3.png | ||
Background | back_water | spr_water | |
Object | obj_myplane | spr_myplane | |
obj_island1 | spr_island1 | ||
obj_island2 | spr_island2 | ||
obj_island3 | spr_island3 | ||
obj_controller | <no sprite> | ||
Room | room_game |
obj_island1
obj_island2
obj_island3
- Depth=10000
Le isole sono degli oggetti inanimati, rimangono fissi sullo sfondo.
La profondità, depth, altissima serve a farle stare dietro tutti gli altri oggetti.
room_game
SCHEDA | IMPOSTAZIONI | COMMENTO |
---|---|---|
settings | Width: 640 | |
Height: 4800 | 10 schermate in verticale | |
backgrounds | Draw background color | no |
Visible when room starts | ||
back_water | Tramite il pulsantino a destra | |
Til. Hor. | L’immagine dell’acqua è ripetuta orizzontalmente e verticalmente | |
Tile Vert. | ||
objects | obj_myplane | Al centro in basso… |
obj_islandX | Tante isole dove preferisci | |
views | Enable the use of Views | |
View 0 | ||
Visible when room starts | ||
X: 0 | Posizione iniziale della vista | |
Y: 4320 | ||
W: 640 | Dimensione della vista | |
H: 480 | ||
X: 0 | Nessuna porta | |
Y: 0 | ||
W: 640 | ||
H: 480 | ||
<no object> | Nessun oggetto da seguire |
Ecco le impostazioni della vista
obj_myplane
- Depth=-100
Create
<Left>
Jump relative to position (-4,0)
End of a block
<Right>
Jump relative to position (+4,0)
End of a block
<Up>
Jump relative to position (0,-2)
End of a block
<Down>
Jump relative to position (0,-2)
End of a block
Sistemiamo l’aereo in fondo al livello e gli diamo, nell’evento Create, una velocità verticale di -2 per assicurarci che voli con qualche velocità se l’utente non fa nulla.
Con depth=-100 viene disegnato sopra tutti gli altri oggetti.
Le 4 frecce spostano l’aereo ma fino a una certa distanza (40) dal bordo.
obj_controller
Step
Sposta la vista verso l’alto a ogni passo.
Aerei nemici
Aggiungiamo al gioco degli aerei nemici.
Il nostro aereo può sparare dei proiettili per tentare di colpire e distruggere gli aerei nemici.
Se viene a contatto con uno di essi esplode e ricomincia il gioco.
Aggiungi le risorse
TIPO | NOME | FILE | |
---|---|---|---|
Sprite | spr_enemy1 | enemy1_strip3.png | |
spr_bullet | bullet.png | ||
spr_explosion1 | explosion1_strip6.png | ||
spr_explosion2 | explosion2_strip7.png | ||
Sound | snd_explosion1 | explosion1.wav | |
snd_explosion2 | explosion2.wav | ||
Object | obj_enemy1 | spr_enemy1 | |
obj_bullet | spr_bullet | ||
obj_explosion1 | spr_explosion1 | ||
obj_explosion2 | spr_explosion2 |
obj_myplane
Create
Set variable can_shoot to 1
<Space>
Create instance of object obj_bullet at relative position (0,-16)
Set variable can_shoot to 0
Set Alarm 0 to 15
End of a block
Alarm 0
<Left>
<Right>
<Up>
<Down>
Permettiamo al giocatore di sparare solo 2 proiettili al secondo, cioè, uno ogni 15 passi.
Nell’evento Create dell’aereo principale impostiamo la variabile can_shoot a 1, indicando che si può sparare un proiettile.
Nell’evento del tasto <Space> controlliamo se la variabile can_shoot è uguale a 1.
Se è così creiamo un proiettile davanti all’aereo, impostiamo la variabile can_shoot a 0 indicando che non possiamo più sparare e impostiamo Alarm 0 a 15.
L’allarme scende di un passo alla volta fino a 0 e quando lo raggiunge si verifica un evento Alarm 0.
Nell’evento Alarm 0 impostiamo di nuovo la variabile can_shoot a 1, indicando che possiamo sparare di nuovo.
Ecco tutti gli eventi dell’aereo con in primo piano l’evento <Space>
obj_enemy1
Step
Exit this event
End of a block
If y is larger than view_yview+480
Exit this event
End of a block
Set the vertical speed to -10
If y is larger than view_yview+480
Destroy the instance
End of a block
obj_myplane
Create instance of object obj_explosion2 at relative position (0,0)
Destroy the instance
obj_bullet
For other destroy the instance
Create instance of object obj_explosion1 at relative position (0,0)
Destroy the instance
Si tratta di un piccolo aereo che semplicemente vola verso il basso.
Non spara ma se colpisce l’aereo principale il gioco finisce.
L’aereo nemico è già nel livello da qualche parte ma non si muove se è invisibile.
Quando è in vista comincia a muoversi ma se supera il bordo inferiore si distrugge.
Nella collisione con il proiettile emette un suono, distrugge il proiettile, crea un’esplosione e si distrugge.
Nella collisione con l’aereo principale emette un suono (più potente), crea un’esplosione (più potente) e si distrugge.
obj_bullet
Create
Step
Destroy the instance
End of a block
Nell’evento Create gli diamo una velocità verso l’alto.
Nell’evento Step controlliamo se ha superato il bordo in alto e lo distruggiamo.
obj_explosion1
Animation End
Non fa niente tranne che quando l’animazione dell’esplosione è finita si deve distruggere.
obj_explosion2
Animation End
Sleep 1000 milliseconds
Restart the game
Questo oggetto è un po’ più complicato dell’altro oggetto esplosione perché deve gestire anche la fine del gioco.
Prima distruggiamo l’istanza per farlo scomparire.
Poi aspettiamo un po’ per essere sicuri che è finito il suono dell’esplosione.
L’azione successiva fa ripartire il gioco.
Il tabellone
Per rendere il gioco un po’ più interessante faremo in modo che i nemici provochino dei danni.
Soltanto quando l’aereo ha subito troppi danni allora sarà distrutto.
Inoltre introdurremo le vite e disegneremo un pannello che visualizza tutte queste informazioni.
Aggiungi le risorse
TIPO | NOME | FILE | |
---|---|---|---|
Sprite | spr_life | life.png | |
spr_bottom | bottom.png | Vedi sotto. |
obj_enemy1
Step
obj_myplane
Set the health relative to -30
obj_bullet
Set the score relative to 5
Scontrarsi con un aereo nemico provoca un danneggiamento di 30.
Colpire un aereo nemico fa guadagnare 5 punti.
obj_controller
- Depth=-10000
Create
Set the number of lives to 3
Set the health to 100
Set the information in the window caption: don’t… don’t … don’t …
Step
If view_yview is smaller than 0
Display message: You survived all attacks!
Show the highscore table
Restart the game
End of a block
No More Health
Play sound snd_explosion2; looping: false
Change instance into obj_explosion2
No More Lives
Restart the game
Draw
Set the drawing color to 65535 (giallo)
At position (180,view_yview+440) draw the value of score
Draw the health bar with size (12,view_yview+449,138,view_yview+459)
with back color none and bar color green to red
Draw the lives at (16,view_yview+410) with sprite spr_life
Nell’evento Create si imposta score a 0, il numero di vite a 3, health a 100.
Inoltre si annullano i messaggi corrispondenti nella barra del titolo della finestra perché se ne occuperà l’evento Draw.
Nell’evento Step controlla se la variabile view_yview diventa 0.
Se l’aereo ha raggiunto la cima del livello allora il gioco è finito!
obj_controller controllerà anche quando siamo rimasti senza salute oppure senza vite e lancerà le azioni necessarie.
Per esempio l’evento No More Healthsarà impostato come
L’evento Draw si occupa di disegnare il pannello, la barra orizzontale della salute, le vite rimaste, il punteggio…
Controlla se hai compilato correttamente le azioni…
L’evento Draw completo dovrebbe apparire come segue
Più nemici
In questa sezione aggiungeremo al nostro gioco nuovi tipi di aereo nemico per arrivare a 4 comportamenti diversi
- Il primo, che non spara…
- Spara proiettili verso il basso.
- Spara proiettili in direzione dell’aereo principale.
- Spara e parte dal basso del livello (sarà più difficile da evitare o colpire).
Gli aerei nemici saranno distribuiti nel livello in formazioniche appariranno al momento opportuno…
Aggiungi le risorse
TIPO | NOME | FILE | |
---|---|---|---|
Sprite | spr_enemy2 | enemy2_strip3.png | |
spr_enemy3 | enemy3_strip3.png | ||
spr_enemy4 | enemy4_strip3.png | ||
spr_enemybullet1 | enemybullet1.png | ||
spr_enemybullet2 | enemybullet2.png | ||
Sound | snd_explosion3 | explosion3.wav | |
Object | obj_enemy2 | spr_enemy2 | |
obj_enemy3 | spr_enemy3 | ||
obj_enemy4 | spr_enemy4 | ||
obj_enemybullet1 | spr_enemybullet1 | ||
obj_enemybullet2 | spr_enemybullet2 |
obj_enemybullet1
Create
Step
Destroy the instance
End of a block
obj_myplane
Destroy the instance
Set the health relative to -5
Per fare in modo che l’aereo nemico spari abbiamo bisogno di un oggetto proiettile.
Questo oggetto, nell’evento Create, acquista una velocità verticale verso il basso.
Nell’evento Step curiamo che l’oggetto si distrugga quando finisce in basso fuori dal livello.
Nell’evento di collisione di questo proiettile con l’aereo principale e emettiamo un suono, distruggiamo il proiettile e impostiamo health a -5, Relative.
obj_enemybullet2
Create
Start moving in the direction of position (obj_myplane.x,obj_myplane.y) with speed 8
End of a block
Else
Set the vertical speed to 6
End of a block
obj_myplane
Destroy the instance
Set the health relative to -5
Outside Room
L’evento creazione utilizza l’azione Move Towards per dirigersi verso la posizione dell’aereo principale.
Utilizza obj_myplane.x e obj_myplane.x ma se non ci fosse nessuna istanza dell’oggetto otterremmo un messaggio di errore quindi è meglio se prima controlliamo se l’aereo c’è.
Se l’aereo principale è presente il proiettile si dirigerà verso di esso altrimenti si dirigerà verso il basso.
L’evento Create dovrebbe apparire così
obj_enemy2
Step
With a chance of 1 out 30 do perform the next action
Create instance of object obj_enemybullet1 at relative position (0,16)
End of a block
obj_myplane
obj_bullet
Set the score relative to 10
Siccome il comportamento sarà simile a quello del primo aereo nemico facciamo una copia di questo oggetto (pulsante destro e poi Duplicate) e gli diamo un nuovo nome e una nuova sprite.
Nell’evento Step facciamo in modo che spari proiettili in media una volta ogni 30 passi.
Nell’evento collisione con il proiettile modifichiamo score a 10 (vale di più perché è più pericoloso).
obj_enemy3
Step
With a chance of 1 out 30 do perform the next action
Create instance of object obj_enemybullet2 at relative position (0,16)
End of a block
obj_myplane
obj_bullet
Set the score relative to 20
Facciamo una copia del secondo aereo nemico e, come prima, nell’evento di collisione con il proiettile normale cambiamo il punteggio perché aumenti di 20.
Nell’evento Step utilizziamo di nuovo l’azione dado ma adesso creiamo un proiettile ogni 80 passi, perché il nuovo tipo di proiettile è più difficile da evitare.
L’evento Step del 3° aereo nemico dovrebbe essere
obj_enemy4
- Visible (no)
Step
Exit this event
End of a block
Set variable visible to 1
If y is smaller than -32
Destroy the instance
End of a block
obj_myplane
Exit this event
End of a block
Play sound snd_explosion2; looping: false
Create instance of object obj_explosion2 at relative position (0,0)
Destroy the instance
Set the health relative to -30
obj_bullet
Exit this event
Play sound snd_explosion1; looping: false
For other destroy the instance
Create instance of object obj_explosion1 at relative position (0,0)
Destroy the instance
Set the score relative to 40
Il 4° aereo nemico è il più complesso perché arriva dal basso e si muove verso l’alto.
Lo inseriamo dall’inizio nel livello ma lo rendiamo invisibile.
Inoltre finché è invisibile non reagisce alle collisioni con i proiettili e con l’aereo principale.
Quando si trova nella vista lo rendiamo visibile e lo facciamo muovere (con una velocità più alta).
Finire il gioco
Abbiamo appena realizzato uno scrolling shooter con diversi aerei nemici.
Perché diventi un vero gioco sono necessarie ancora dellerifiniture:
- una musica di sottofondo
- spari multipli
- un’immagine di apertura
- un’icona migliore
- una pagina di help.
Musica
Aggiungi la risorsa
TIPO | NOME | FILE |
---|---|---|
Sound | snd_background | background.mid |
e fai partire l’esecuzione aggiungendo alla fine dell’evento Create dell’oggetto obj_controller l’azione
Spari multipli
Sostituisci l’evento <Space> di obj_myplane con il seguente
<Space>
If score is larger than 400
Create instance of object obj_bullet at relative position (-24,-8)
Create instance of object obj_bullet at relative position (+24,-8)
If score is larger than 1000
Create instance of object obj_bullet at relative position (0,-48)
End of a block
End of a block
Else
Create instance of object obj_bullet at relative position (0,-48)
End of a block
Set variable can_shoot to 0
Set Alarm 0 to 15
End of a block
Se il giocatore ha superato i 400 punti ci saranno 2 spari.
Se il giocatore ha superato i 1000 punti ci saranno 3 spari.
Immagine iniziale
Scegliamo un’immagine che apparirà durante il caricamento del gioco al posto di quella ufficiale (loading…)
L’immagine la trovi nel tutorial: Resources/loading.gif
Selezionala tramite
- Global Game Settings > Loading > Show your own image while loading
- Global Game Settings > Loading > Change Image
Icona
Diamo un’icona specifica alla finestra dell’applicazione.
L’icona la trovi nel tutorial: Resources/Icon.ico
Selezionala tramite Global Game Settings > Loading > Change Icon
Help
Un buon gioco fornisce all’utente delle informazioni su come giocare.
Queste informazioni saranno visualizzate quando l’utente preme il tasto F1.
Per creare le informazioni del gioco fai doppio clic su Game Information nell’albero delle risorse a sinistra sullo schermo.
Verrà aperto un piccolo editor dove potrai scrivere le informazioni del gioco
Puoi usare i font, i colori, gli stili e il colore di sfondo.