-
Notifications
You must be signed in to change notification settings - Fork 0
Tutorial Maze_it
Select your language / Choisissez votre langue / Wählen Sie Ihre Sprache:
English | Français | Deutsch | Italiano | Español | Português | Slovenščina | Українська | Русский
In questo tutorial, creerai un Gioco del Labirinto dove il giocatore naviga attraverso i corridoi per raggiungere l'uscita evitando ostacoli e raccogliendo monete. Questo tipo di gioco classico è perfetto per imparare il movimento fluido, il rilevamento delle collisioni e il design dei livelli.
Cosa imparerai:
- Movimento fluido del giocatore con input da tastiera
- Gestione delle collisioni con i muri
- Rilevamento dell'obiettivo (raggiungere l'uscita)
- Oggetti collezionabili
- Sistema di timer semplice
Difficoltà: Principiante Preset: Preset Intermedio (l'azione Execute Code usata per il timer non è inclusa nel preset Principiante)
- Il giocatore si muove attraverso un labirinto usando i tasti freccia
- I muri bloccano il movimento del giocatore
- Raccogli monete per punti
- Raggiungi l'uscita per completare il livello
- Completa il labirinto il più velocemente possibile!
| Elemento | Scopo |
|---|---|
| Giocatore | Il personaggio che controlli |
| Muro | Ostacoli solidi che bloccano il movimento |
| Uscita | Obiettivo che termina il livello |
| Moneta | Oggetti collezionabili per il punteggio |
| Pavimento | Sfondo visivo (opzionale) |
Tutti gli sprite di muri e pavimenti devono essere 32x32 pixel per creare una griglia corretta.
- Nell'Albero delle Risorse, fai clic destro su Sprites e seleziona Create Sprite
- Nominalo
spr_player - Fai clic su Edit Sprite per aprire l'editor
- Disegna un piccolo personaggio (cerchio, persona o forma a freccia)
- Usa un colore vivace come blu o verde
- Dimensione: 24x24 pixel (più piccolo dei muri per una navigazione più facile)
- Fai clic su OK per salvare
- Crea un nuovo sprite chiamato
spr_wall - Disegna un pattern solido di mattoni o pietra
- Usa colori grigi o scuri
- Dimensione: 32x32 pixel
- Crea un nuovo sprite chiamato
spr_exit - Disegna una porta, bandiera o marcatore di obiettivo luminoso
- Usa colori verdi o dorati
- Dimensione: 32x32 pixel
- Crea un nuovo sprite chiamato
spr_coin - Disegna un piccolo cerchio giallo/dorato
- Dimensione: 16x16 pixel
- Crea un nuovo sprite chiamato
spr_floor - Disegna un semplice pattern di piastrelle
- Usa un colore neutro chiaro
- Dimensione: 32x32 pixel
![]()
Il muro blocca il movimento del giocatore.
- Fai clic destro su Objects e seleziona Create Object
- Nominalo
obj_wall - Imposta lo sprite su
spr_wall - Seleziona la casella "Solid"
- Non servono eventi

L'uscita termina il livello quando il giocatore la raggiunge.
- Crea un nuovo oggetto chiamato
obj_exit - Imposta lo sprite su
spr_exit
Event: Collision with obj_player
- Add Event → Collision → obj_player
- Add Action: Output → Show Message
- Message:
You Win!
- Message:
- Add Action: Room → Next Room (o Restart Room per un singolo livello)
Il testo di Show Message è una stringa statica fissa — non può includere un valore dinamico come il tempo trascorso. Il timer resta visibile nell'HUD (Passo 7) fino alla vittoria, quindi il giocatore ha già visto il proprio tempo.

Le monete aggiungono al punteggio quando vengono raccolte.
- Crea un nuovo oggetto chiamato
obj_coin - Imposta lo sprite su
spr_coin
Event: Collision with obj_player
- Add Event → Collision → obj_player
- Add Action: Score → Set Score
- New Score:
10 - Seleziona "Relative" per aggiungere 10 punti
- New Score:
- Add Action: Instance → Destroy Instance
- Applies to: Self

Il giocatore si muove fluidamente usando i tasti freccia.
- Crea un nuovo oggetto chiamato
obj_player - Imposta lo sprite su
spr_player
Aggiungi quattro eventi Keyboard (held) più un evento No Key, ciascuno con un'azione Move → Set Horizontal/Vertical Speed:
| Evento | Azione |
|---|---|
| Keyboard (held) → Right Arrow | Set Horizontal Speed a 4
|
| Keyboard (held) → Left Arrow | Set Horizontal Speed a -4
|
| Keyboard (held) → Down Arrow | Set Vertical Speed a 4
|
| Keyboard (held) → Up Arrow | Set Vertical Speed a -4
|
| Keyboard: No Key | Set Horizontal Speed a 0 e Set Vertical Speed a 0
|
Event: Collision with obj_wall
- Add Event → Collision →
obj_wall - Add Action: Move → Stop Movement
Qui non serve alcun codice manuale per controllare la posizione. Il ciclo
di movimento di questo motore già impedisce che un'istanza venga spostata
dentro un oggetto solido prima che il frame venga disegnato (obj_wall è
Solid), quindi il giocatore non può mai realmente sovrapporsi a un muro —
l'evento di collisione sopra si limita ad azzerare qualsiasi velocità
residua, così il giocatore non continua a "spingere" contro di esso.

Il game controller gestisce il timer e visualizza le informazioni.
- Crea un nuovo oggetto chiamato
obj_game_controller - Non serve uno sprite
Event: Create — avvia il timer, usando Control → Execute Code (l'azione Execute Code di questo progetto esegue vero Python, non GameMaker Language):
self.timer = 0.0Event: Step — lo incrementa ad ogni frame:
self.timer += 1.0 / game.fpsEvent: Draw — costruisce l'HUD con veri comandi della coda di disegno. Aggiungi tre azioni Draw → Draw Text:
| Azione Draw Text | Testo | Posizione |
|---|---|---|
| 1ª | Score: |
X 10, Y 10
|
| 2ª | Time: |
X 10, Y 30
|
| 3ª | Coins: |
X 10, Y 50
|
poi tre azioni Draw → Draw Variable subito dopo, per mostrare i valori dinamici accanto a ogni etichetta:
| Azione Draw Variable | Variabile | Posizione |
|---|---|---|
| 1ª | score |
X 70, Y 10
|
| 2ª | self.timer |
X 70, Y 30
|
| 3ª | (vedi sotto) | X 70, Y 50
|
Non esiste un contatore integrato "monete rimanenti" a cui puntare Draw Variable — aggiungi un'altra azione Control → Execute Code, subito prima delle azioni Draw Variable, per calcolarlo in una variabile d'istanza che Draw Variable può poi leggere:
self.coins_left = sum(
1 for inst in game.current_room.instances
if inst.object_name == 'obj_coin'
)(poi imposta il campo Variable della 3ª azione Draw Variable su self.coins_left).

- Fai clic destro su Rooms e seleziona Create Room
- Nominalo
room_maze - Imposta la dimensione della stanza (es: 640x480)
- Abilita "Snap to Grid" e imposta la griglia su 32x32
Costruisci il tuo labirinto seguendo queste linee guida:
- Crea il bordo - Circonda la stanza con muri
- Costruisci corridoi - Crea percorsi attraverso il labirinto
- Posiziona l'uscita - Mettila alla fine del labirinto
- Spargi le monete - Posizionale lungo i percorsi
- Posiziona il giocatore - Vicino all'ingresso
- Aggiungi il game controller - Ovunque (è invisibile)
W W W W W W W W W W W W W W W W W W W W
W P . . . . W . . . . . . . W . . . . W
W . W W W . W . W W W W W . W . W W . W
W . W . . . . . . . . . . . . . . W . W
W . W . W W W W W . W W W W W W . W . W
W . . . W . . . . . . . . C . W . . . W
W W W . W . W W W W W W W . . W W W . W
W C . . . . W . . . . . W . . . . . . W
W . W W W W W . W W W . W W W W W W . W
W . . . . . . . . C . . . . . . . . . W
W . W W W W W W W W W . W W W W W W . W
W . . . . . . . . . . . W . . . . . . W
W W W W W W W W W W W . W . W W W W . W
W . . . . . . . . . . . . . W . C . E W
W W W W W W W W W W W W W W W W W W W W
W = Muro P = Giocatore E = Uscita C = Moneta . = Vuoto

- Fai clic su Run o premi F5 per testare
- Usa i tasti freccia per navigare nel labirinto
- Raccogli monete per punti
- Trova l'uscita per vincere!
Crea un semplice nemico che pattuglia:
- Crea
spr_enemy(colore rosso, 24x24) - Crea
obj_enemycon spritespr_enemy
Event: Create — Add Action: Move → Start Moving Direction
(Directions: right, Speed: 2)
Event: Collision with obj_wall — Add Action: Move → Reverse Horizontal (fa girare il nemico quando colpisce un muro — nessun codice necessario; combinato con la collisione solida integrata del Passo 6.2, il nemico non può mai attraversare un muro)
Event: Collision with obj_player — Add Action: Room → Restart Room
Nell'evento Create di obj_game_controller, aggiungi Score →
Set Lives (Value: 3).
Nell'evento Collision with obj_player di obj_enemy, sostituisci
Restart Room con due azioni: Score → Set Lives (Value: -1,
Relative selezionato), poi Move → Jump to Start Position
(applicata al giocatore tramite Applies to: Other) per far riapparire
il giocatore invece di riavviare l'intero labirinto.
Aggiungi un altro evento a obj_game_controller: Other Events →
No More Lives — questo si attiva automaticamente non appena le vite
raggiungono 0, quindi non serve controllarlo manualmente. Aggiungi
Output → Show Message (Game Over!) seguito da Room →
Restart Game.
- Crea
obj_key— alla collisione conobj_player, Set Variable (Variable:global.has_key, Value:true, Scope:global), poi Destroy Instance (self). - Crea
obj_locked_door, con Solid selezionato. Dagli un evento Step con Control → Test Variable (Variable:global.has_key, Value:true, Scope:global) → Instance → Destroy Instance (self) — la porta scompare (e smette di bloccare) non appena la chiave viene raccolta.
- Crea stanze aggiuntive (
room_maze2,room_maze3) - In
obj_exit, usa l'azione Next Room invece di Restart Room
Aggiungi suoni per:
- Raccogliere monete
- Raggiungere l'uscita
- Toccare nemici (se aggiunti)
- Musica di sottofondo
| Problema | Soluzione |
|---|---|
| Il giocatore passa attraverso i muri | Controlla che obj_wall abbia "Solid" selezionato |
| Il giocatore rimane bloccato nei muri | Assicurati che lo sprite del giocatore sia più piccolo degli spazi tra i muri |
| Le monete non scompaiono | Verifica che l'evento di collisione distrugga Self, non Other |
| Il timer non funziona | Assicurati che il game controller sia posizionato nella stanza |
| Il movimento sembra scattoso | Regola il valore di velocità nelle azioni Set Horizontal/Vertical Speed (prova 3-5) |
Congratulazioni! Hai creato un gioco del labirinto! Hai imparato:
- Movimento fluido - Controllare lo stato dei tasti tenuti premuti per il movimento continuo
- Collisione solida integrata - I muri bloccano il movimento automaticamente una volta marcati Solid, senza codice manuale di controllo posizione
- Collezionabili - Creare oggetti che aumentano il punteggio e scompaiono
- Sistema di timer - Tracciare il tempo trascorso con variabili d'istanza
- Design dei livelli - Creare layout di labirinti navigabili
- Corsa contro il Tempo - Aggiungi un timer a conto alla rovescia. Raggiungi l'uscita prima che scada il tempo!
- Punteggio Perfetto - Richiedi di raccogliere tutte le monete prima che l'uscita si apra
- Labirinto Casuale - Ricerca la generazione procedurale di labirinti
- Nebbia di Guerra - Mostra solo l'area intorno al giocatore
- Minimappa - Mostra una piccola panoramica del labirinto
- Tutorials - Altri tutorial di giochi
- Intermediate Preset - Panoramica del preset necessario per questo tutorial
- Tutorial: Pong - Creare un gioco a due giocatori
- Tutorial: Breakout - Creare un gioco spacca-mattoni
- Tutorial: Sokoban - Creare un puzzle spingi-scatole
- Event Reference - Documentazione completa degli eventi