A scrolling shooter – 1945 – Con vista

1945Questo 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 numerotipopericolosità 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:

1945
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 Water
spr_island1 island1.png Isola 1
spr_island2 island2.png Isola 2
spr_island3 island3.png Isola 3
spr_myplane myplane_strip3.png Aereo
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

Isola 1obj_island1

Isola 2obj_island2

Isola 3obj_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

Livello

 

Aereoobj_myplane

  • Depth=-100

image Create

Vertical Speed Action Set the vertical speed to -2

image <Left>

Text Expression If x is larger than 40

Start Block Start of a block
Jump to Position Jump relative to position (-4,0)
End Block End of a block

 

image <Right>

Text Expression If x is smaller than room_width-40

Start Block Start of a block
Jump to Position Jump relative to position (+4,0)
End Block End of a block

 

image <Up>

Text Expression If y is larger than view_yview+40

Start Block Start of a block
Jump to Position Jump relative to position (0,-2)
End Block End of a block

 

image <Down>

Text Expression If y is smaller than view_yview+480-120

Start Block Start of a block
Jump to Position Jump relative to position (0,-2)
End Block 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 Event Step

image Set variable view_yview relative to -2

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 Aereo Nemico 1
spr_bullet bullet.png Proiettile
spr_explosion1 explosion1_strip6.png Esplosione 1
spr_explosion2 explosion2_strip7.png Esplosione 2
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

Aereoobj_myplane

image Create

Vertical Speed Action Set the vertical speed to -2
image Set variable can_shoot to 1

image <Space>

If Var Action If can_shoot is equal to 1

Start Block Start of a block
image Create instance of object obj_bullet at relative position (0,-16)
image Set variable can_shoot to 0
image Set Alarm 0 to 15
End Block End of a block

image Alarm 0

image Set variable can_shoot to 1

image <Left>
image <Right>
image <Up>
image <Down>

Come prima.

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>

Evento Space

Aereo Nemico 1obj_enemy1

Step Event Step

If Var Action If y is smaller than view_yview-32

Start Block Start of a block
image Exit this event
End Block End of a block

If Var Action If y is larger than view_yview+480

Start Block Start of a block
image Exit this event
End Block End of a block

Speed Vertical Set the vertical speed to -10
If Var Action If y is larger than view_yview+480

Start Block Start of a block
Destroy Action Destroy the instance
End Block End of a block

Collision Event obj_myplane

Play Sound Play sound snd_explosion2; looping: false
image Create instance of object obj_explosion2 at relative position (0,0)
image Destroy the instance

Collision Event obj_bullet

Play Sound Play sound snd_explosion1; looping: false
image For other destroy the instance
image Create instance of object obj_explosion1 at relative position (0,0)
image 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.

Proiettileobj_bullet

Create Event Create

Speed Vertical Set the vertical speed to -10

 

Step Event Step

If Var Action If y is smaller than view_yview-16

Start Block Start of a block
Destroy Action Destroy the instance
End Block 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.

 

Esplosione 1obj_explosion1

image Animation End

image Destroy the instance

Non fa niente tranne che quando l’animazione dell’esplosione è finita si deve distruggere.

Esplosione 2obj_explosion2

image Animation End

image Destroy the instance
image Sleep 1000 milliseconds
Restart Game 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 Life
spr_bottom bottom.png Vedi sotto.

Pannello

 

Aereo Nemico 1obj_enemy1

Step Event Step

Collision Event obj_myplane


image Set the health relative to -30

 

Collision Event obj_bullet


image 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

image Create

image Set the score to 0
image Set the number of lives to 3
image Set the health to 100
image Set the information in the window caption: don’t… don’t … don’t …

 

Step Event Step

image Set variable view_yview relative to -2
Check Sound If view_yview is smaller than 0

Start Block Start of a block
image Display message: You survived all attacks!
Highscore Action Show the highscore table
Restart Game Restart the game
End Block End of a block

 

image No More Health

image Set the health to 100
Play Sound Play sound snd_explosion2; looping: false
image Change instance into obj_explosion2

 

image No More Lives

Highscore Action Show the highscore table
Restart Game Restart the game

image Draw

image At position (0,view_yview+404) draw image -1 of sprite spr_bottom
image Set the drawing color to 65535 (giallo)
image At position (180,view_yview+440) draw the value of score
image Draw the health bar with size (12,view_yview+449,138,view_yview+459)
with back color none and bar color green to red
image 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 3health 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

Draw 6

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…

Draw 1 Draw 2
Draw 4 Draw 3

L’evento Draw completo dovrebbe apparire come segue

Draw 5

 

Più nemici

In questa sezione aggiungeremo al nostro gioco nuovi tipi di aereo nemico per arrivare a 4 comportamenti diversi

  1. Il primo, che non spara…
  2. Spara proiettili verso il basso.
  3. Spara proiettili in direzione dell’aereo principale.
  4. 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 Aereo Nemico 2
spr_enemy3 enemy3_strip3.png Aereo Nemico 3
spr_enemy4 enemy4_strip3.png Aereo Nemico 2
spr_enemybullet1 enemybullet1.png Proiettile 1
spr_enemybullet2 enemybullet2.png Proiettile 2
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

 

Proiettile 1obj_enemybullet1

Create Event Create

Speed Vertical Set the vertical speed to 6

 

Step Event Step

If Var Action If y is larger than view_yview+480

Start Block Start of a block
Destroy Action Destroy the instance
End Block End of a block

 

Collision Event obj_myplane

Play Sound Play sound snd_explosion3; looping: false
image Destroy the instance
image 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 -5Relative.

Proiettile 2obj_enemybullet2

Create Event Create

Test Instance Count If the number of instance obj_myplane is larger than 0

Start Block Start of a block
Move Towards Start moving in the direction of position (obj_myplane.x,obj_myplane.y) with speed 8
End Block End of a block

image Else

Start Block Start of a block
Speed Vertical Set the vertical speed to 6
End Block End of a block

Collision Event obj_myplane

Play Sound Play sound snd_explosion3; looping: false
image Destroy the instance
image Set the health relative to -5

 

image Outside Room

Destroy Action Destroy the instance

Move 1L’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ì

Proiettile 2
Con l’evento Outside Room distruggiamo il proiettile se esce dal livello.

Aereo Nemico 2obj_enemy2

Step Event Step


Test Chance With a chance of 1 out 30 do perform the next action

Start Block Start of a block
image Create instance of object obj_enemybullet1 at relative position (0,16)
End Block End of a block

 

Collision Event obj_myplane

 

Collision Event obj_bullet


image 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).

 

Aereo Nemico 3obj_enemy3

Step Event Step


Test Chance With a chance of 1 out 30 do perform the next action

Start Block Start of a block
image Create instance of object obj_enemybullet2 at relative position (0,16)
End Block End of a block

 

Collision Event obj_myplane

 

Collision Event obj_bullet


image 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
Aereo Nemico 3

 

Aereo Nemico 4obj_enemy4

  • Visible (no)

Step Event Step

If Var Action If y is smaller than view_yview+480

Start Block Start of a block
image Exit this event
End Block End of a block

image Set variable visible to 1

Speed Vertical Set the vertical speed to -6
If Var Action If y is smaller than -32

Start Block Start of a block
Destroy Action Destroy the instance
End Block End of a block

Collision Event obj_myplane

If Var Action If visible is equal to 0

Start Block Start of a block
image Exit this event
End Block End of a block

Play Sound Play sound snd_explosion2; looping: false
image Create instance of object obj_explosion2 at relative position (0,0)
image Destroy the instance
image Set the health relative to -30

Collision Event obj_bullet

If Var Action If visible is equal to 0

Start Block Start of a block
image Exit this event
End Block End of a block

Play Sound Play sound snd_explosion1; looping: false
image For other destroy the instance
image Create instance of object obj_explosion1 at relative position (0,0)
image Destroy the instance
image 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

Play Sound Play sound snd_background; looping: true

 

Spari multipli

Sostituisci l’evento <Space> di obj_myplane con il seguente

image <Space>

If Var Action If can_shoot is equal to 1

Start Block Start of a block
If Var Action If score is larger than 400

Start Block Start of a block
image Create instance of object obj_bullet at relative position (-24,-8)
image Create instance of object obj_bullet at relative position (+24,-8)
If Var Action If score is larger than 1000

Start Block Start of a block
image Create instance of object obj_bullet at relative position (0,-48)
End Block End of a block

End Block End of a block

Else Else

Start Block Start of a block
image Create instance of object obj_bullet at relative position (0,-48)
End Block End of a block

image Set variable can_shoot to 0
image Set Alarm 0 to 15
End Block 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

LOADINGScegliamo 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

ICONIcona

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.

textVerrà aperto un piccolo editor dove potrai scrivere le informazioni del gioco

Puoi usare i font, i colori, gli stili e il colore di sfondo.