Il gioco del nostro esempio è principalmente basato sull'accelerometro e solo marginalmente sul touch panel, usato per gestire il tocco singolo che da inizio a nuova partita. Per prima cosa, indichiamo quali sono i gesti dell'utente che vogliamo "intercettare" (come si è appena detto, il solo tap):
TouchPanel.EnabledGestures = GestureType.Tap;
Il nostro gioco intende sfruttare la dimensione orizzontale dello schermo, nel costruttore attiveremo solo gli orientamenti desiderati, impostando la proprietà SupportedOrientations
:
graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight
Per quanto riguarda infine l'accelerometro, nel gioco utilizzeremo il sistema basato sul polling che abbiamo visto in precedenza
Vediamo ora come implementare il nostro metodo per determinare la collisione tra texture all'interno della logica del gioco. Per prima cosa, rappresentiamo le nostre entità di gioco (date dagli asteroidi e dalla nave del giocatore) come altrettante ColliderTexture
.
La posizione del giocatore è indicata per mezzo di un Vector2
, mentre le posizioni dei nostri asteroidi sono registrate in una lista di Vector2
. Infine, includiamo una costante che indichi la velocità di caduta degli asteroridi:
ColliderTexture player, asteroid;
Vector2 playerPosition;List<Vector2>
asteroidPositions = new List<Vector2>();
const int AsteroidFallSpeed = 2;
Nota: in un gioco vero, per gli asteroidi e per il giocatore utilizzeremmo due classi separate, in grado di definire meglio le loro proprietà logiche, come velocità, vita residua, ecc. Nel nostro esempio, semplifichiamo un pò le cose per illustrare meglio i punti fondamentali del nostro modello. Niente impedisce di prendere questo come punto di partenza e di usarlo per realizzare delle versioni modificate e piú complesse, anzi: puó essere una attività piuttosto divertente.
Per rendere il gioco più verosimile, useremo un generatore casuale di asteroidi in grado di creare nuove istanze a intervalli di tempo non lineari. Per far questo, avremo bisogno di generare una serie di numeri casuali e di raffrontarli con la probabilità di generare un nuovo asteroide ad ogni frame. Quest'ultima è indicata dalla variabile float AsteroidSpawnProbability
, che nel nostro esempio è fissata a 0,01
. Più alto è il valore, maggiore è ovviamente la probababilità di avere un gran numero di asterodi sullo schermo:
float AsteroidSpawnProbability = 0.01f;
Random random = new Random();
Infine, prevediamo due contatori destinati a tenere traccia dello stato del gioco e del punteggio:
bool game_over = false;
int score = 0;