A3. Gestire l'input
L'ultimo risultato ottenuto è l'immagine della mazza su uno sfondo bianco... non molto entusiasmante come cosa. Perciò ora sarebbe utile gestire l'input della tastiera, per consentire il movimento dell'oggetto Bat alla pressione delle frecce direzionali destra e sinistra. Come avevo già accennato, la gestione dell'input avviene nel metodo Update. Per rendere le cose più ordinate, creiamo due nuovi membri all'interno della classe Game da noi definita:
- La variabile BatSpeed, che contiene la velocità della mazza. È utile dichiarare una variabile globale poiché, nel caso si desideri cambiarne il valore, non si deve poi modificare tutto il codice. In questo modo possiamo anche gestire cambiamenti della velocità durante il gioco (magari dovuti a bonus)
- La procedura KeyboardCheck, in cui controlliamo lo status della tastiera e i pulsanti premuti. È sempre meglio separare parti di codice con gli stessi compiti, in modo da non riempire troppo il metodo Update(). Così è anche più ordinato
Dopo aver fatto correre il programma, si vede la stessa schermata bianca, ma premendo i tasti direzionali destra o sinistra, la mazza si sposta sullo schermo.Imports Microsoft.Xna.FrameworkImports Microsoft.Xna.Framework.InputImports Microsoft.Xna.Framework.GraphicsPublic Class GameInherits Microsoft.Xna.Framework.GamePrivate GraphicsAs GraphicsDeviceManagerPrivate BatchAs SpriteBatch 'BatSpeed rappresenta la velocità della mazza. '3 è un buon valore, magari un po' lento Private BatSpeedAs Single = 3Private BatAs GameObjectPrivate Function GetTexture(ByVal NameAs String )As Texture2DReturn Texture2D.FromFile(Me .Graphics.GraphicsDevice, _My .Application.Info.DirectoryPath & "\" & Name)End Function 'Controlla lo stato della tastiera e vede quali pulsanti sono 'premuti Private Sub KeyboardCheck() 'Ottiene lo stato della tastiera. 'GetState() è una funzione statica della 'classe Keyboard, che restituisce lo stato dela tastiera Dim KeyStateAs KeyboardState = Keyboard.GetState 'Se è premuto il tasto direzionale destro, 'si sposta a destra If KeyState.IsKeyDown(Keys.Right)Then 'Notare che i Vector2 supportano l'operatore +. 'La somma viene eseguita come una normale somma 'di vettori: in questo caso, il vettore velocità 'è orizzontale, perciò manca della componente Y Bat.Position +=New Vector2(BatSpeed, 0)End If 'Se è premuto il tasto direzionale sinistro, 'si sposta a sinistra If KeyState.IsKeyDown(Keys.Left)Then Bat.Position +=New Vector2(-BatSpeed, 0)End If 'Se è premuto Esc, esce If KeyState.IsKeyDown(Keys.Escape)Then 'Exit() è il metodo che permette di 'terminare il gioco Me .Exit()End If 'KeyState espone anche la funzione IsKeyUp, 'per controllare se un tasto NON è premuto End Sub Sub New ()Me .Graphics =New GraphicsDeviceManager(Me )Me .Content.RootDirectory = "Content"End Sub Protected Overrides Sub Initialize() Batch =New SpriteBatch(Me .Graphics.GraphicsDevice)My Base.Initialize()End Sub Protected Overrides Sub LoadContent()My Base.LoadContent() Bat =New GameObject(GetTexture("Bat.png")) Bat.Position =New Vector2( _Me .Graphics.GraphicsDevice.Viewport.Width / 2, _Me .Graphics.GraphicsDevice.Viewport.Height - 40)End Sub Protected Overrides Sub UnloadContent()My Base.UnloadContent()End Sub Protected Overrides Sub Update(ByVal GameTimeAs GameTime) 'Controlla i tasti premuti KeyboardCheck()My Base.Update(GameTime)End Sub Protected Overrides Sub Draw(ByVal gameTimeAs GameTime)Me .Graphics.GraphicsDevice.Clear(Color.White) Batch.Begin() Bat.Draw(Batch) Batch.End()My Base.Draw(gameTime)End Sub End Class
Avere la schermata bianca, tuttavia, è un po' deprimente. Facciamo in modo di mettere un sfondo adatto, un po' colorito, magari, come questo:
Chaos - trovato su Google
Salvate l'immagine sempre in bin\Debug. Per lo sfondo, dichiariamo una nuova variabile Background (sempre di tipo GameObject):
Public Class Game '... Private BackgroundAs GameObject '... Protected Overrides Sub LoadContent()My Base.LoadContent() 'Inizializza l'oggetto caricando il suo sprite 'dalla cartella del programma Background =New GameObject(GetTexture("Background.png")) 'Dato che lo sfondo sarà grande come tutta la 'finestra, per posizionarlo esattamente al centro 'bisogna impostare Position = Center. 'Ricordate che Center viene calcolato dal mio codice 'nel corpo del costruttore New Background.Position = Background.Center 'Tuttavia, avrete notato che la finestra ha dimensioni 'più piccole dello sfondo che useremo, perciò 'bisogna ridimensionarla. 'Dichiara un nuovo Viewport. La classe Viewport è 'praticamente uguale a Rectangle Dim SizeAs New Viewport 'Imposta le dimensioni Size.Width = Background.Sprite.Width Size.Height = Background.Sprite.Height Size.X = 0 Size.Y = 0 'Assegna Size alla proprietà Viewport di GraphicsDevice Me .Graphics.GraphicsDevice.Viewport = Size 'Poi cambia le impostazioni predefinite per la dimensione Me .Graphics.PreferredBackBufferHeight = Size.HeightMe .Graphics.PreferredBackBufferWidth = Size.Width 'E quindi applica i cambiamenti Me .Graphics.ApplyChanges() Bat =New GameObject(GetTexture("Bat.png")) Bat.Position =New Vector2( _Me .Graphics.GraphicsDevice.Viewport.Width / 2, _Me .Graphics.GraphicsDevice.Viewport.Height - 40)End Sub '... Protected Overrides Sub Draw(ByVal gameTimeAs GameTime)Me .Graphics.GraphicsDevice.Clear(Color.White) Batch.Begin() 'Disegna lo sfondo, prima di tutto il resto Background.Draw(Batch) Bat.Draw(Batch) Batch.End()My Base.Draw(gameTime)End Sub End Class
La mazza si muove sullo sfondo
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



