Parlando di controlli utente, va fatta veloce premessa: le app per Windows Store devono poter essere utilizzate sia tramite l'interfaccia touch che tramite tastiera e mouse, pertanto se volete che il vostro gioco possa essere pubblicato sullo store di Windows è necessario prevedere entrambe le possibilità. Oltre a questi metodi ne esistono anche altri come il Gamepad Xbox, il pennino ed i sensori (accelerometro, giroscopio, inclinometro ecc.) ma per ora limitiamoci a quelli fondamentali.
Dobbiamo cercare di implementare una logica che ci permetta di compiere le azioni previste dal gioco a prescindere dal metodo utilizzato per il controllo. Dato che il nostro personaggio si deve semplicemente muovere per lo schermo, possiamo ad esempio utilizzare delle variabili booleane per indicare se l'utente vuole andare a destra, sinistra, in alto o in basso (tutti i metodi di controllo che implementeremo quindi, andranno semplicemente a modificare lo stato di queste variabili) e in base al loro stato faremo spostare il personaggio di conseguenza; e questo lo faremo nel metodo che gestisce il game loop.
Partiamo con il dichiarare le variabili nella classe GameModel
namespace SampleGame
{
class GameModel
{
private ScrollableBackground _gameBackGround;
private Storyboard GameLoopStoryboard;
private enGameState _gameState;
private Sprite _playerSprite;
// definisce le variabili per i controlli
private Boolean LeftButtonPressed = false;
private Boolean RightButtonPressed = false;
private Boolean UpButtonPressed = false;
private Boolean DownButtonPressed = false;
public enum enGameState
{
PLAY = 1,
PAUSE = 2,
STOP = 3
};
Andiamo poi a gestire lo spostamento del personaggio nella funzione GameLoop che avevamo creato vuota all'inizio
private void GameLoop(Object sender, Object e)
{
// dichiara 2 variabili per memorizzare gli spostamenti da effettuare
int offsetX = 0;
int offsetY = 0;
// se è premuto il tasto direzionale destro sposta il personaggio a destra di 3 px
if(this.RightButtonPressed) { offsetX += 3; }
// se è premuto il tasto direzionale sinistro sposta il personaggio a sinistra di 3 px
if(this.RightButtonPressed) { offsetX += 3; }
// se è premuto il tasto direzionale verso l'alto sposta il personaggio in su di 3 px
if(this.RightButtonPressed) { offsetX -= 3; }
// se è premuto il tasto direzionale verso il basso sposta il personaggio in giù di 3 px
if(this.RightButtonPressed) { offsetX += 3; }
// applica lo spostamento all'oggetto Sprite del personaggio
this.PlayerSprite.Move(new Point(this.PlayerSprite.Position.X + offsetX,
this.PlayerSprite.Position.Y + offsetY ));
// fa ripartire il timer dello Storyboard
this.GameloopStoryboard.Begin();
}
Una volta sistemato il GameLoop, possiamo iniziare a gestire il movimento tramite i tasti freccia della tastiera.
Per fare questo dobbiamo metterci "in ascolto" degli eventi che vengono generati quando si premono e si rilasciano i tasti, quindi iniziamo ad aggiungere in alto il riferimento al namespace Windows.UI.Xaml.Input
using Windows.UI.Xaml.Input;
Poi aggiungiamo i metodi che vogliamo vengano eseguiti ogni volta che intercettiamo questi eventi, che chiameremo OnButtonPressed
e OnButtonReleased
:
private void OnButtonPressed(object sender, KeyRoutedEventArgs e) { }
private void OnButtonReleased(object sender, KeyRoutedEventArgs e) { }
Infine nella funzione GameModel
andiamo ad impostiarli come delegati per gli eventi KeyDown e KeyUp della nostra finestra:
// aggancia gli eventi della tastiera
Windows.UI.Xaml.Window.Current.Content.KeyDown += On ButtonPressed;
Windows.UI.Xaml.Window.Current.Content.KeyUp += On ButtonReleased;
Non ci resta che modificare lo stato delle variabili booleane create in precedenza in funzione dei tasti premuti, ed il gioco è fatto (l'espressione oltretutto calza a pennello...). Torniamo quindi nei metodi OnButtonPressed
e OnButtonReleased
e aggiungiamo queste semplici righe di codice:
private void OnButtonPressed(object sender, KeyRoutedEventArgs e)
{
// imposta a true le variabili riferite al tasto premuto
if (e.Key == Windows.System.VirtualKey.Right) this.RightButtonPressed = true;
if (e.Key == Windows.System.VirtualKey.Left) this.LeftButtonPressed = true;
if (e.Key == Windows.System.VirtualKey.Up) this.UpButtonPressed = true;
if (e.Key == Windows.System.VirtualKey.Down) this.DownButtonPressed = true;
}
private void OnButtonReleased(object sender, KeyRoutedEventArgs e)
{
// imposta a false le variabili riferite al tasto premuto
if (e.Key == Windows.System.VirtualKey.Right) this.RightButtonPressed = false;
if (e.Key == Windows.System.VirtualKey.Left) this.LeftButtonPressed = false;
if (e.Key == Windows.System.VirtualKey.Up) this.UpButtonPressed = false;
if (e.Key == Windows.System.VirtualKey.Down) this.DownButtonPressed = false;
}
Siamo finalmente pronti a far andare il nostro personaggio un po' a spasso per lo schermo! Se provate infatti a compilare ed eseguire il progetto dovreste riuscire a muovere il mostriciattolo tramite i tasti direzionali della tastiera.
Ora che il nostro amico è in grado di muoversi però, ha sicuramente bisogno di mangiare! Cerchiamo allora di aiutarlo con qualche succosa fragola di cui è molto ghiotto...