Bones | and | Dogs -> I Movimenti e gli Ostacoli

Bones | and | Dogs

I Movimenti e gli Ostacoli

 

Passiamo adesso col descrivervi in che modo il nostro protagonista di gioco si muoverà all'interno della nostra window. Ho implementato i Movimenti all'interno della classe Dog che ricordiamo aveva i frame del cane, comprese le animazioni, che vi mostro nell'immagine sottostante:

All'interno della classe ho implementato dei metodi tramite la java.awt.event che utilizzano la KeyEvent Con i quali fà cambiare FRAME del cane in base a cosa viene premuto. Ovviamente, siccome stiamo ragionando in termini di Coordinate (x,y), la posizione effettiva dell'oggetto che contiene l'immagine del cane, viene traslata di:

x=x-1; y=y+0; // Movimento a SINISTRA
x=x+1; y=y+0; // Movimento a DESTRA
y=y-1; x=x+0; // Movimento in ALTO
y=y+1; x=x+0; // Movimento in BASSO

Ad ogni movimento, se annulliamo la coordinata opposta, questo ci permette di muovere il personaggio solo seguendo i TASTI DIREZIONALI, annullando così il movimento in DIAGONALE. L'oggetto Dog che sarà costruito sulla nostra BoardGame , si muoverà tramite l'implementazione della classe tramite ActionListener che si mette in ascolto in attessa che arrivi un INPUT (nel nostro caso la Tastiera).

Effettuando brevi test, il cane viene comandato alla perfezione usando i tasti direzionali della tastiera. Ho limitato anche la fuoriuscita dell'oggetto da noi comandato, settando dei limiti sulle X e sulle Y (che massimo non può oltrepassare; i loro valori sono gli stessi delle dimensioni della window).

Adesso andiamo a Riempire un pò il nostro giardinetto. Avevo pensato che se il lancio d'ossi avvenisse senza ostacoli, il gioco sarebbe stato troppo monotono, e molto molto facile. Sono riuscito ad aumentare la difficoltà pensando di piazzare nella nostra Board, alcuni ostacoli: Alberi e Rocce. Quindi ho creato due classi Apposite per i rispettivi ostacoli: la classe Tree e la Classe Stone. Questo è il risultato dopo l'implementazione delle due classi, dopo averle incorporate ovviamente nella nostra GameBoard:

Ma come si implementa una cosa del genere?? beh il discorso è alquanto semplice, anche perchè mi sono diciamo anticipato per quanto riguarderà il discorso collisioni. Cosi' come sono fatte, il cane attraverserà ogni singolo oggetto sulla mappa. Per anticiparmi ho costruito una griglia 2d settando la posizione di tali oggetti (una volta spawnati ovviamente) a 1. Ecco il codice:

public class Tree 
{
    private int [] x;
    private int [] y;
    ...
    public Tree()
    { ...
                // la nostra GameBoard conterrà massimo 3 Alberi. 
                // quindi creiamo due array
                // per il salvataggio delle loro coordinate
        x = new int [3];
        y = new int [3];
        
        // generiamo in maniera Random le coordinate dei nostri Alberi
        // e le salviamo negli array di appoggio
        for (int i=0 ; i<3 ; i++)
        {    
            // restringiamo il campo di spawn perchè le immagini degli alberi
            // sono di dimensioni più grosse
            x [i] = 40 + (int)(Math.random()*430);
            y [i] = 40 + (int)(Math.random()*230);
        }
    }
    
    // ritorna la coordinata X dell'I esimo Albero
    public int getX(int i) 
    {
        return x[i];
    }

    // ritorna la coorinata Y dell'I esimo Albero
    public int getY(int i) 
    {
        return y[i];
    }
    
    // ritorna l'immagine dell' Albero
    public Image getImage() 
    {
        return tree;
    }
    ...
}

Questo è in linea di massima la realizzazione del nostro ambiente di gioco. Ricordo che le soluzioni sono più di una, e per il momento ho implementato questo tipo di soluzione perchè la ritenevo più opportuna. Nulla a togliere che con l'avanzamento del gioco potrò variare lo spawn di oggetti per gestire meglio le collisioni, ma in linea di massima la logica è sempre la stessa.

Lo Spawn avviene all'interno della classe BoardGame nel metodo astratto paint:

// Spawn Random degli Alberi
        for (int i=0 ; i<3 ; i++) 
        {
            int c=tree.getX(i);
            int d=tree.getY(i);
            // a questo punto disegnamo la figura nelle coordinate [c,d]
            ...             
        }

Noteremo che ad ogni avvio del gioco la posizione degli oggetti Varia grazie ai poteri della funzione random. Qualche esempio illustrativo:

Per oggi è tutto. Nel prossimo articolo cominciamo a descrivere le collisioni sugli ostacoli per evitare che il gli passi attraverso. Anticipiamo che L'idea principale è quella di creare una Griglia 2D, in modo da posizionare con l'etichetta "1" la posizione dell'oggetto. Quando il cane mentre cammina incontrerà nella sua posizione x,y il numero 1 esso dovrà fermarsi. Per il momento l'idea è questa. Nel prossimo articolo spiegheremo se questa soluzione è quella efficiente, in caso contrario vi elencherò una delle possibili soluzioni alle collisioni con oggetti.
 

Indice Numerico Articoli:

1 - 2 - 3 - 4 - 5 - 6 - 7