Aggiungere un nemico
Si spera che adesso siate abbastanza a vostro agio con il processo di aggiungere sprites ed animazioni. Per brevità, quindi, non ripeteremo tutti i passi. Aggiungiamo quindi un nuovo sprite per un nemico.
1. Aggiungete un nuovo oggetto Sprite nel layout.
2. Importate la striscia di Sprite Enemies\Snail.
3. Cancellate il primo frame vuoto dell'animazione.
4. Impostate l'animazione in loop con speed 15.
5. Impostate l'origine alla base dell'immagine della lumaca, e ripetetelo per tutta l'animazione.
7. Chiudete l'editor dell'animazione e rinominate l'oggetto in 'SnailEnemy'.
8. Ponetelo sul terreno come mostrato.
Adesso vogliamo implementare la seguente logica:
- Se il giocatore, correndo, colpisce la lumaca da un fianco, lampeggia e viene ferito.
- Se il giocatore salta sulla cima della lumaca, la lumaca muore.
Per far lampeggiare il giocatore selezionate ed aggiungete il behavior Flash. Ricordatevi di selezionare il giocatore, non l'oggetto PlayerBox (infatti è il giocatore che è visibile, ed è lui che vogliamo che lampeggi). Tra un attimo utilizzeremo l'azione 'Flash' da questo behavior.
Tornate a visualizzare il foglio eventi ed aggiungete un nuovo evento:
PlayerBox -> On collision with another object -> SnailEnemy
Questo evento si scatena quando andiamo a sbattere con SnailEnemy in qualsiasi angolo. Possiamo quindi utilizzare i sottoeventi per testare se il giocatore sta cadendo dall'alto o correndo da uno dei lati. Testiamo innanzitutto se il giocatore è da sopra.
Aggiungiamo un sub event all'evento della collisione:
PlayerBox -> Is falling
Dovremmo anche testare che il giocatore sia effettivamente sopra il nemico. Questo ci aiuta nell'evitare che la lumaca venga uccisa se cadiamo oltre di lei da un dislivello. Click con il destro sulla condizione 'Is falling' e selezionate 'Add another condition'. Ricordate. tutte le condizioni devono essere soddisfatte per scatenare l'evento. Aggiungete la condizione:
PlayerBox -> Compare Y -> Less than, SnailEnemy.Y
L'asse Y aumenta dall'alto verso il basso, quindi se la coordinata Y del giocatore è più bassa di quella della lumaca, vuol dire che ci è sopra.
In questo evento, aggiungete l'azione:
SnailEnemy -> Destroy
Possiamo anche fare in modo che il giocatore rimbalzi su di essa, aggiungendo un'altra azione:
PlayerBox -> Set vector Y -> -700
'Set vector Y' fondamentalmente imposta la velocità verticale del movimento del platform; impostarla ad un valore negativo la fa andare verso l'alto (di nuovo, l'asse Y aumenta dall'alto verso il basso) e 700 è un po' meno della forza del salto di 1100. Questo farà rimbalzar via il giocatore come se avessero fatto un salto debole.
Non abbiamo ancora finito: click con il tasto destro sul margine dell'evento 'Is falling' (lo spazio proprio sulla sinistra dell'icona della PlayerBox) e selezionate Add -> Else. 'Else' è una condizione speciale che occorre se l'evento precedente non è occorso. In questa maniera questo evento verrà fatto scattare se collidiamo con la lumaca ma non le stavamo saltando sopra - quindi possiamo dire che l'abbiamo colpito dal lato. In questo evento vogliamo che il giocatore sia ferito. Aggiungete l'azione
Player -> Flash -> (lasciate i valori di default e cliccate su Done)
Ricordate che il behavior Flash è nell'oggetto Player, non sul PlayerBox.
OK, per adesso il giocatore non muore mai, semplicemente lampeggia. Ma abbiamo sistemato l'identificazione del momento in cui impostare se il giocatore e' saltato sopra il nemico o l'ha colpito dal lato. Questo tutorial non coprirà tutti i dettagli, ma speriamo che riusciate a vedere dove inserire gli effetti di morte (provate a creare uno sprite 'poof' sullo SnailEnemy quando viene distrutto, usando l'azione 'Spawn object' di SnailEnemy) e dove sottrarre l'energia (nell'evento che fa lampeggiare il giocatore - potete imparare come gestire la salute usando le variabili di istanza nel tutorial dello shooter top-down che potreste guardare subito dopo).
Adesso facciamo muovere il nemico lumaca avanti ed indietro per il platform.
Muovere il nemico
Il problema principale nel muovere il nemico è come individuare quando ha raggiunto il limite di una piattaforma. La maniera più semplice per farlo è con gli indicatori invisibili 'edge'. Sono solo sprites invisibili che fanno invertire la direzione della lumaca quando li tocca.
Possiamo usare nuovamente il behavior Platform per la lumaca. Questo ci è utile perchè:
- la fa muovere a destra e sinistra
- la fa andare su e giù per le pendenze
- lo fa cadere giù dalle piattaforme
- se volete realizzare un nemico che salta, potete fare in modo che anche il nemico salti automaticamente nell'azione 'simulate control'.
Aggiungete il behavior Platform allo sprite SnailEnemy. Dato che non stiamo usando animazioni complicate su questo oggetto, possiamo usare direttamente il behavior platform sull'oggetto senza usare l'oggetto invisibile 'box'.
Non vogliamo che il giocatore controlli lo SnailEnemy, vogliamo controllarlo automaticamente. Possiamo farlo impostando la sua proprietà Default controls su No, qiundi usando l'azione Simulate control. Dato che le lumache sono molto lente, settiamo la Max speed a 50 e le sue Acceleration e Deceleration to 100!
Abbiamo bisogno anche dei nostri segnalini 'Bordo'. Aggiungete un nuovo oggetto Sprite e caricatelo su un rettangolo opaco. Chiamatelo EdgeMarker. Dimensionate l'oggetto a 40 x 40 e impostate la sua Initial visibility a Invisible, in modo che non lo vediamo.
Piazzatene uno ad ogni punta della piattaforma della lumaca, in questo modo: (non dimenticate che potete caricare una nuova istanza con control+trascinamento)
La lumaca ha anche bisogno di conoscere in quale direzione si sta muovendo, se sinistra o destra. Possiamo farlo con le variabili di istanza. Queste sono semplicemente dei numeri o del testo memorizzati in ogni istanza dell'oggetto. Se abbiamo molte lumache, ognuna di queste memorizza le proprie istanze separatamente. Questo permette loro di avere valori unici per la salute, la direzione corrente, eccetera. Una tecnica semplice per controllare i nemici automaticamente è creare un'istanza di azione che memorizzi lo stato corrente. Per esempio, potrebbe essere "scappa", "insegue il giocatore" o "ferma". In questo caso abbiamo bisogno solo di "sinistra" e "destra", ma è utile impostarle allo stesso modo.
Selezionate l'oggetto SnailEnemy. Nella barra delle proprietà, cliccate Add / Edit sotto 'Instance variables'.
Comparirà una finestra di dialogo con l'elenco di tutte le variabili di istanza per l'oggetto. Cliccate l'icona 'add' per aggiungerne una nuova. Impostate il nome su action, il tipo su text, ed il valore iniziale su right (per farla muovere a destra).
Cliccate OK e chiudete la finestra delle variabili di istanza. Passate al foglio degli eventi.
Vogliamo implementare la logica seguente:
- se action è "right", simulate il movimento del platform che avviene quando si preme il tasto 'freccia destra' per muovere la lumaca a destra.
- se action è "left", simulate il movimento del platform che avviene quando si preme il tasto 'freccia sinistra' per muovere la lumaca a sinistra.
Possiamo impostare il movimento con i seguenti due eventi:
Evento: SnailEnemy -> Compare instance variable -> action uguale a "right" (usate le virgolette qui per indicare che è un testo)
Action: SnailEnemy -> Simulate control -> Right
Dovrebbe essere ovvio fare la stessa cosa per il sinistro. Vogliamo anche fare in modo che si volti da sinistra a destra come abbiamo fatto per il giocatore. Quindi aggiungete SnailEnemy -> Set mirrored nell'evento "left", e SnailEnemy -> Set not mirrored nell'evento "right". Dovreste avere qualcosa di questo tipo:
Ora cambiamo la direzione della lumaca agli angoli:
Event: SnailEnemy -> On collision with another object -> EdgeMarker
Subevent: SnailEnemy -> Compare instance variable -> action uguale a "right"
Action: SnailEnemy -> Set value -> action a "left"
Subevent: Else
Action: SnailEnemy -> Set value -> action a "right"
E' importante usare Else qui, perchè gli eventi sono eseguiti dall'alto verso il basso. Se invece di 'else' dicessimo 'action equal to "left"', notate che l'evento precedente l'ha appena impostato a quel valore. Quindi lo imposterebbe immediatamente a destra di nuovo, avendo in pratica nessun effetto. Usando 'else', preveniamo che avvenga il secondo evento se il primo fosse verificato.
Fate partire il progetto. Notate che la lumaca si muove avanti ed indietro sulle sue piattaforme. Questo rende un po' più difficile saltarle sopra! Questa è un sistema di intelligenza artificiale molto difficile, ma si spera che riusciate ad immaginare come creare nemici più intelligenti, usando più eventi, permettendo loro di cadere dalle piattaforme, o usando altri indicatori per fare in modo che saltino, in maniera da far sembrare che il nemico sappia come saltare su una piattaforma.
Provate a creare una piattaforma con due lumache. Notate che vengono controllate individualmente, dato che ciascuna di loro ha la propria variabile di istanza action che memorizza il loro stat. Si spera che cominciate a capire quanto siano importanti le variabili di istanza per controllare indipendentemente le istanze - non devono fare sempre le stesse cose identiche!