sabato 23 giugno 2012

Tutorial XNA articolo conclusivo di un gioco completo

Si riporta l'articolo conclusivo del tutorial su XNA di un gioco completo, qui http://blogs.msdn.com/b/jennifer/archive/2012/06/22/developing-a-windows-8-metro-app-part-4-my-reveal-a-picture-algorithm-and-basic-code.aspx l'articolo pubblicato per il sito di iprogrammatori.

Introduzione

In questa parte conclusiva del tutorial di un gioco completo, vedremo l’utilizzo del punteggio.
La parte, conclude la seria di articoli che hanno illustrato la realizzazione di un gioco completo.
Vedremo come applicare al nostro gioco, la possibilità di un punteggio.
Nella sezione “Content” del nostro gioco, aggiungiamo un elemento di tipo Font per la visualizzazione del testo. Nella finestra Esplora soluzione, facciamo click con il tasto destro sulla sezione “Content” dal menu che viene visualizzato, selezioniamo la voce “Aggiungi” e nel sottomenu selezioniamo la voce “Nuovo Elemento”.
Nella finestra che viene visualizzata, selezioniamo il modello “SprintFont”, ed assegnamo il nome “Punteggio.spritefont”, confermate il tutto, tramite il tasto “Ok”.

Stesura del codice

Passiamo alla classe Game1, del file Game1.cs, in modo che scriviamo il codice per visualizzare il punteggio.
Si creano oggetti utilizzabili a livello di classe,  in particolare dei membri che andremo ad utilizzare nei vari eventi della classe, un intero per il punteggio ed un oggetto di tipo SprintFont, per la gestione del testo da visualizzare.
Qui di seguito si riporta un esempio di codice

        //punteggio
        int Punteggio;
        // elemento font per la visualizzazione del punteggio
        SpriteFont testo;

Nell’evento “inizitialize”  imposto la variabile per la gestione del punteggio a 0.
Qui di seguito si riporta il codice dell’evento “Initialize”.

protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            // inizializzo la classe
            player = new Player();
            //imposola velocità
            VelocitaSpostamento = 8.0f;
            //oggetti per la gestione dello sfondo
            sfondo1 = new Sfondo();
            sfondo2 = new Sfondo();
            //inizializzo l'oggetto degli asteroide
            Asteroidi = new List<Asteroide>();
           
            //imposto a zero il tempo per asteroide precendente
            TempoAsteroidePrecedente = TimeSpan.Zero;

            //imposto i tempi degli asteroide
            TempoAsteroide = TimeSpan.FromSeconds(1.0f);

            //inizializzo l'oggetto di tipo random
            random = new Random();
            //inizializzo l'oggetto per la gestione del fuoco, i vari spari
            spari = new List<Sparo>();

            //imposto il tempo del primo fuoco
            TimePrimoFuoco = TimeSpan.FromSeconds(.15f);
            //inizializzo l'oggetto esplosioni
            Esplosioni = new List<Animazione>();
            //imposto il punteggio
            Punteggio = 0;
          





            base.Initialize();
        }

Nell’evento “LoadContent”, impostiamo  l’oggetto relativo al font, al modello della sezione Content, aggiunto precedentemente.
Qui di seguito si riporta il codice dell’evento loadContent.

protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //oggetto per la gestione dell'effetto immagini in movimento
            Animazione playerAnimazione = new Animazione();
            Texture2D playerTexture = Content.Load<Texture2D>("AstronaveMovimento");
            playerAnimazione.Initialize(playerTexture, Vector2.Zero, 115, 69, 8, 30, Color.White, 1f, true);

            // carico la risorsa (immagine)
            Vector2 playerPosizione = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.TitleSafeArea.Height / 2);
           //ricambio l'oggetto player
            player.Initialize(playerAnimazione, playerPosizione);
            // player.Initialize(Content.Load<Texture2D>("Astronave"), playerPosizione);


            //carico le immagini
            sfondo1.Initialize(Content, "Sfondo1", GraphicsDevice.Viewport.Width, -1);
            sfondo2.Initialize(Content, "Sfondo2", GraphicsDevice.Viewport.Width, -2);

            SfondoPrincipale = Content.Load<Texture2D>("SfondoPriincipale");
            //carico l'immagine asteroide
            AsteroideTexture = Content.Load<Texture2D>("asteroide");
            //carico l'immagine relativo al fuoco
            TextureFuoco = Content.Load<Texture2D>("fuoco");
            //carico la risorsa immagine relativo all'esplosione
            TextureEsplosione = Content.Load<Texture2D>("esplosione");

            //carico le risorse suono
            SuonoSparo = Content.Load<SoundEffect>("fuocoSuono");
            SuonoEsplosione = Content.Load<SoundEffect>("esplosioneSuono");

            //imposto il testo con il modello
            testo = Content.Load<SpriteFont>("Punteggio");




            // TODO: use this.Content to load your game content here
        }

Nel metodo “AggiornaEsplosioni”, aggiungiamo la riga di codice, che permette di incrementare il punteggio per ogni esplosione dell’asteroide.
Dopo la riga relativo all’invocazione del metodo play, di "EsplosioneSuono", scriviamo il codice che incrementa la variabile di punteggio.
Qui di seguito si riporta il codice del metodo “AggiornaEsplosioni” con questa nuova modifica.

private void AggiornaAsteroidi(GameTime gameTime)
        {
            //aggiungo un nuovo elemento ogni secondo e mezzo.
            if (gameTime.TotalGameTime - TempoAsteroidePrecedente > TempoAsteroide)
            {
                TempoAsteroidePrecedente = gameTime.TotalGameTime;

                //aggiungo la risorsa a video
                AggiungiAsteroide();
            }

            //nel caso che lo stato attivo è false elimino l'asteroide in questione
            for (int i = Asteroidi.Count - 1; i >= 0; i--)
            {
                Asteroidi[i].Update(gameTime);

                if (Asteroidi[i].StatoAttivo == false)
                {
                    //imposto l'esplosione in caso che non ha più eneriga
                    if (Asteroidi[i].Energia <= 0)
                    {
                        //eseguo l'esplosione e viene aggiunta
                        AggiungiEsplosione(Asteroidi[i].Posizione);
                        //eseguo il suono relativo all'esplosion
                        SuonoEsplosione.Play();
                        Punteggio += Asteroidi[i].Punteggio;
                    }
                    Asteroidi.RemoveAt(i);
                   
                }
            }
        }

Nell’evento “Draw” scriviamo il codice che visualizza a video il punteggio. Il codice va inserito nel momento in cui si aggiorna lo stato dell’esplosione, in cui si invoca il metodo “Draw” dell’oggetto lista esplosione
Qui di seguito si riporta il codice di tale operazione.

protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.White);
            // TODO: Add your drawing code here
            //ridisegno il tutto
            spriteBatch.Begin();

            spriteBatch.Draw(SfondoPrincipale, Vector2.Zero, Color.White);

            //visualizzo lo spostamento
            sfondo1.Draw(spriteBatch);
            sfondo2.Draw(spriteBatch);
            //aggiorno la visualizzazione della risorsa di tipo asteroide
            for (int i = 0; i < Asteroidi.Count; i++)
            {
                Asteroidi[i].Draw(spriteBatch);
            }
            //aggiorno la visualizzazione della risora di tipo fuoco
            for (int i = 0; i < spari.Count; i++)
            {
                spari[i].Draw(spriteBatch);
            }
            //aggiorno la visualizzazione della risorsa esplosioni.
            for (int i = 0; i < Esplosioni.Count; i++)
            {
                Esplosioni[i].Draw(spriteBatch);
            }
            //visualizzo il testo relativo al punteggio
            spriteBatch.DrawString(testo, "Punteggio: " + Punteggio, new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y), Color.White);
            //Visualizzo a video il testo relativo all'energia della navicella
            spriteBatch.DrawString(testo, "Energia: " + player.Carburante, new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + 30), Color.White);


            //aggiorno la visualizzazione
            player.Draw(spriteBatch);
            //termine del ridisegno
            spriteBatch.End();
            base.Draw(gameTime);
        }

Nel caso che il carburante della navicella è terminato, dobbiamo reimpostare tale proprietà a 100 e settare il punteggio.
Nel metodo "updatePlayer", scriviamo il codice di tali operazioni.
Qui di seguito si riporta il codice del metodo Updateplayer.

private void UpdatePlayer(GameTime gameTime)
        {
            //passo l'oggetto gametime
            player.Update(gameTime);
            //nel caso che digito il pulsante esc esco dal gioco
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Escape))
                base.Exit();
            //in riferimento alle freccie della tastiera sposto l'astronave
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Left))
            {
                player.Posizione.X -= VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Right))
            {
                player.Posizione.X += VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Up))
            {
                player.Posizione.Y -= VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Down))
            {
                player.Posizione.Y += VelocitaSpostamento;
            }
            //imposto la posizione della navicella
            player.Posizione.X = MathHelper.Clamp(player.Posizione.X, 0, GraphicsDevice.Viewport.Width - player.Width);
            player.Posizione.Y = MathHelper.Clamp(player.Posizione.Y, 0, GraphicsDevice.Viewport.Height - player.Height + 50);
            //verifico l'intervallo di tempo tra un fuoco e l'altro
            if (gameTime.TotalGameTime - TimeFuocoPrecedente > TimePrimoFuoco)
            {
                //imposto il tempo
                TimeFuocoPrecedente = gameTime.TotalGameTime;

                // agguingo una risorsa a video, in questo modo viene inserito un oggetto di tipo fuoco
                AggiungiFuoco(player.Posizione + new Vector2(player.Width / 2, 0));
                //per ogni fuoco avvio il suono relativo al fuoco
                SuonoSparo.Play();
            }
            //imposto il punteggio a 0 e inizializzo la proprietà carburante per l'oggetto relativo alla navicella
            if (player.Carburante <= 0)
            {
                player.Carburante = 100;
                Punteggio = 0;
            }


        }

Qui di seguito si riporta il codice completo del gaming.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace XNATutorial
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        //oggetto della classe Player
        Player player;
        //Per la gestione della tastiera
        KeyboardState StatoCorrenteTastiera;
        KeyboardState StatoPrecedenteTastiera;

        // la velocità di spostamento
        float VelocitaSpostamento;


        //immagine principale
        Texture2D SfondoPrincipale;

        //gestione delle immagini di sfondo quelle in movimento
        Sfondo sfondo1;
        Sfondo sfondo2;
        //gestione della risorsa asteroide
        //oggetto di tipo Asteroide
        Texture2D AsteroideTexture;
        List<Asteroide> Asteroidi;


        //oggetti per gestire i tempi di visualizzare gli asteroidi
        TimeSpan TempoAsteroide;
        TimeSpan TempoAsteroidePrecedente;


        //numero causale per la visualizzazione degli asteroide
        Random random;
        //per la gestione della risorsa fuoco
        Texture2D TextureFuoco;
        List<Sparo> spari;

        //per la gestione dei tempi tra uno sparo e l'altro
        TimeSpan TimePrimoFuoco;
        TimeSpan TimeFuocoPrecedente;

        //Gestione esplosione
        Texture2D TextureEsplosione;
        List<Animazione> Esplosioni;
        //Il suono per quando si spara
        SoundEffect SuonoSparo;
        //suono per l'esplosione
        SoundEffect SuonoEsplosione;

        //punteggio
        int Punteggio;
        // elemento font per la visualizzazione del punteggio
        SpriteFont testo;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            // inizializzo la classe
            player = new Player();
            //imposola velocità
            VelocitaSpostamento = 8.0f;
            //oggetti per la gestione dello sfondo
            sfondo1 = new Sfondo();
            sfondo2 = new Sfondo();
            //inizializzo l'oggetto degli asteroide
            Asteroidi = new List<Asteroide>();

            //imposto a zero il tempo per asteroide precendente
            TempoAsteroidePrecedente = TimeSpan.Zero;

            //imposto i tempi degli asteroide
            TempoAsteroide = TimeSpan.FromSeconds(1.0f);

            //inizializzo l'oggetto di tipo random
            random = new Random();
            //inizializzo l'oggetto per la gestione del fuoco, i vari spari
            spari = new List<Sparo>();

            //imposto il tempo del primo fuoco
            TimePrimoFuoco = TimeSpan.FromSeconds(.15f);
            //inizializzo l'oggetto esplosioni
            Esplosioni = new List<Animazione>();
            //imposto il punteggio
            Punteggio = 0;






            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //oggetto per la gestione dell'effetto immagini in movimento
            Animazione playerAnimazione = new Animazione();
            Texture2D playerTexture = Content.Load<Texture2D>("AstronaveMovimento");
            playerAnimazione.Initialize(playerTexture, Vector2.Zero, 115, 69, 8, 30, Color.White, 1f, true);

            // carico la risorsa (immagine)
            Vector2 playerPosizione = new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + GraphicsDevice.Viewport.TitleSafeArea.Height / 2);
            //ricambio l'oggetto player
            player.Initialize(playerAnimazione, playerPosizione);
            // player.Initialize(Content.Load<Texture2D>("Astronave"), playerPosizione);


            //carico le immagini
            sfondo1.Initialize(Content, "Sfondo1", GraphicsDevice.Viewport.Width, -1);
            sfondo2.Initialize(Content, "Sfondo2", GraphicsDevice.Viewport.Width, -2);

            SfondoPrincipale = Content.Load<Texture2D>("SfondoPriincipale");
            //carico l'immagine asteroide
            AsteroideTexture = Content.Load<Texture2D>("asteroide");
            //carico l'immagine relativo al fuoco
            TextureFuoco = Content.Load<Texture2D>("fuoco");
            //carico la risorsa immagine relativo all'esplosione
            TextureEsplosione = Content.Load<Texture2D>("esplosione");

            //carico le risorse suono
            SuonoSparo = Content.Load<SoundEffect>("fuocoSuono");
            SuonoEsplosione = Content.Load<SoundEffect>("esplosioneSuono");

            //imposto il testo con il modello
            testo = Content.Load<SpriteFont>("Punteggio");




            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            //tasto precedente prima di questa modifica          
            StatoPrecedenteTastiera = StatoCorrenteTastiera;

            //rilevo l'ultimo pulsante digitato
            StatoCorrenteTastiera = Keyboard.GetState();
            //aggiorno il gaming
            UpdatePlayer(gameTime);
            //aggiorno la posizione delle immagini
            sfondo1.Update();
            sfondo2.Update();
            //aggiungo o elimino gli asteroidi
            AggiornaAsteroidi(gameTime);
            //per la collisione
            Collisione();
            //per la visualizzazione
            AggiornaFuoco();
            //invoco il codice relativo alla risorsa esplosione
            AggiornaEsplosioni(gameTime);
            base.Update(gameTime);
        }


        private void UpdatePlayer(GameTime gameTime)
        {
            //passo l'oggetto gametime
            player.Update(gameTime);
            //nel caso che digito il pulsante esc esco dal gioco
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Escape))
                base.Exit();
            //in riferimento alle freccie della tastiera sposto l'astronave
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Left))
            {
                player.Posizione.X -= VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Right))
            {
                player.Posizione.X += VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Up))
            {
                player.Posizione.Y -= VelocitaSpostamento;
            }
            if (StatoCorrenteTastiera.IsKeyDown(Keys.Down))
            {
                player.Posizione.Y += VelocitaSpostamento;
            }
            //imposto la posizione della navicella
            player.Posizione.X = MathHelper.Clamp(player.Posizione.X, 0, GraphicsDevice.Viewport.Width - player.Width);
            player.Posizione.Y = MathHelper.Clamp(player.Posizione.Y, 0, GraphicsDevice.Viewport.Height - player.Height + 50);
            //verifico l'intervallo di tempo tra un fuoco e l'altro
            if (gameTime.TotalGameTime - TimeFuocoPrecedente > TimePrimoFuoco)
            {
                //imposto il tempo
                TimeFuocoPrecedente = gameTime.TotalGameTime;

                // agguingo una risorsa a video, in questo modo viene inserito un oggetto di tipo fuoco
                AggiungiFuoco(player.Posizione + new Vector2(player.Width / 2, 0));
                //per ogni fuoco avvio il suono relativo al fuoco
                SuonoSparo.Play();
            }
            //imposto il punteggio a 0 e inizializzo la proprietà carburante per l'oggetto relativo alla navicella
            if (player.Carburante <= 0)
            {
                player.Carburante = 100;
                Punteggio = 0;
            }


        }
        //permette di togliere gli oggetti in visualizzazione
        private void AggiornaFuoco()
        {
            //se lo stato non è attivo, elimina dall'area di visualizzazione la risorsa
            for (int i = spari.Count - 1; i >= 0; i--)
            {
                spari[i].Update();

                if (spari[i].StatoAttivo == false)
                {
                    spari.RemoveAt(i);
                }
            }
        }

        //metodo che permette di aggiungere l'esplosione e quindi l'animazione tramite le varie immagini, il tutto nel metodo "Initialize"
        private void AggiungiEsplosione(Vector2 posizione)
        {
            Animazione esplosione = new Animazione();
            esplosione.Initialize(TextureEsplosione, posizione, 134, 134, 12, 45, Color.White, 1f, false);
            Esplosioni.Add(esplosione);
        }

        private void AggiungiAsteroide()
        {
            // Create the animation object
            Animazione AsteroideAnimazione = new Animazione();

            //Inizializzo l'oggetto per la gestione dell'animazione dell'asteroide - possiamo creare anche un immagini con più immagine animate, cambiando il valore 1 con il totale degli elementi
            AsteroideAnimazione.Initialize(AsteroideTexture, Vector2.Zero, 47, 61, 1, 30, Color.White, 1f, true);

            //genero in maniera causale la posizione della risorsa nello schermo
            Vector2 posizione = new Vector2(GraphicsDevice.Viewport.Width + AsteroideTexture.Width / 2, random.Next(100, GraphicsDevice.Viewport.Height - 100));

            //Creo un nuovo asteroide
            Asteroide asteroide = new Asteroide();

            //inzializzo con l'oggetto animazione e posizione
            asteroide.Initialize(AsteroideAnimazione, posizione);

            //aggiungo il nuovo oggetto alla lista degli oggetti di tipo asteroidei
            Asteroidi.Add(asteroide);
        }
        //metodo che permette di gestire l'aggiunta di risorse nello area di gioco
        private void AggiungiFuoco(Vector2 posizione)
        {
            Sparo sparo = new Sparo();
            sparo.Initialize(GraphicsDevice.Viewport, TextureFuoco, posizione);
            spari.Add(sparo);
        }




        /// <summary>
        /// funzione che permette di aggiungere o eliminare le risorse da visualizzare a video
        /// </summary>
        /// <param name="gameTime"></param>
        private void AggiornaAsteroidi(GameTime gameTime)
        {
            //aggiungo un nuovo elemento ogni secondo e mezzo.
            if (gameTime.TotalGameTime - TempoAsteroidePrecedente > TempoAsteroide)
            {
                TempoAsteroidePrecedente = gameTime.TotalGameTime;

                //aggiungo la risorsa a video
                AggiungiAsteroide();
            }

            //nel caso che lo stato attivo è false elimino l'asteroide in questione
            for (int i = Asteroidi.Count - 1; i >= 0; i--)
            {
                Asteroidi[i].Update(gameTime);

                if (Asteroidi[i].StatoAttivo == false)
                {
                    //imposto l'esplosione in caso che non ha più eneriga
                    if (Asteroidi[i].Energia <= 0)
                    {
                        //eseguo l'esplosione e viene aggiunta
                        AggiungiEsplosione(Asteroidi[i].Posizione);
                        //eseguo il suono relativo all'esplosion
                        SuonoEsplosione.Play();
                        Punteggio += Asteroidi[i].Punteggio;
                    }
                    Asteroidi.RemoveAt(i);

                }
            }
        }
        /// <summary>
        /// metodo che permette di eliminaer dall'area di gioco la risorsa esplosione
        /// </summary>
        /// <param name="gameTime"></param>
        private void AggiornaEsplosioni(GameTime gameTime)
        {
            for (int i = Esplosioni.Count - 1; i >= 0; i--)
            {
                Esplosioni[i].Update(gameTime);
                if (Esplosioni[i].statoAttivo == false)
                {
                    Esplosioni.RemoveAt(i);
                }
            }
        }



        //per la gestione della collissione
        private void Collisione()
        {
            // determiniamo l'area degli oggetti
            Rectangle rectangleArea1;
            Rectangle rectangleArea2;

            //area per definire la posizione degli oggetti
            rectangleArea1 = new Rectangle((int)player.Posizione.X,
            (int)player.Posizione.Y,
            player.Width,
            player.Height);
            //collisione per asteroide e navicella
            for (int i = 0; i < Asteroidi.Count; i++)
            {
                rectangleArea2 = new Rectangle((int)Asteroidi[i].Posizione.X,
                (int)Asteroidi[i].Posizione.Y,
                Asteroidi[i].Width,
                Asteroidi[i].Height);

                // Determina la collissione tra i due oggietti
                if (rectangleArea1.Intersects(rectangleArea2))
                {
                    //danni all'astronave
                    player.Carburante -= Asteroidi[i].DanniAstronave;

                    // energia
                    Asteroidi[i].Energia = 0;

                    //cambio lo stato attivo nel caso che ho finito il carburante
                    if (player.Carburante <= 0)
                        player.StatoAttivo = false;
                }

            }

            //Collisione tra il fuoco ed asteroide
            for (int i = 0; i < spari.Count; i++)
            {
                for (int j = 0; j < Asteroidi.Count; j++)
                {
                    //Creo e verifico e se le aree sono in collissioni
                    rectangleArea1 = new Rectangle((int)spari[i].Posizione.X -
                    spari[i].Width / 2, (int)spari[i].Posizione.Y -
                    spari[i].Height / 2, spari[i].Width, spari[i].Height);

                    rectangleArea2 = new Rectangle((int)Asteroidi[j].Posizione.X - Asteroidi[j].Width / 2,
                    (int)Asteroidi[j].Posizione.Y - Asteroidi[j].Height / 2,
                    Asteroidi[j].Width, Asteroidi[j].Height);

                    // Determina la collissione tra i due oggietti
                    if (rectangleArea1.Intersects(rectangleArea2))
                    {
                         
                        Asteroidi[j].Energia -= spari[i].Danno;
                        spari[i].StatoAttivo = false;
                    }
                }
            }

        }


        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.White);
            // TODO: Add your drawing code here
            //ridisegno il tutto
            spriteBatch.Begin();

            spriteBatch.Draw(SfondoPrincipale, Vector2.Zero, Color.White);

            //visualizzo lo spostamento
            sfondo1.Draw(spriteBatch);
            sfondo2.Draw(spriteBatch);
            //aggiorno la visualizzazione della risorsa di tipo asteroide
            for (int i = 0; i < Asteroidi.Count; i++)
            {
                Asteroidi[i].Draw(spriteBatch);
            }
            //aggiorno la visualizzazione della risora di tipo fuoco
            for (int i = 0; i < spari.Count; i++)
            {
                spari[i].Draw(spriteBatch);
            }
            //aggiorno la visualizzazione della risorsa esplosioni.
            for (int i = 0; i < Esplosioni.Count; i++)
            {
                Esplosioni[i].Draw(spriteBatch);
            }
            //visualizzo il testo relativo al punteggio
            spriteBatch.DrawString(testo, "Punteggio: " + Punteggio, new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y), Color.White);
            //Visualizzo a video il testo relativo all'energia della navicella
            spriteBatch.DrawString(testo, "Energia: " + player.Carburante, new Vector2(GraphicsDevice.Viewport.TitleSafeArea.X, GraphicsDevice.Viewport.TitleSafeArea.Y + 30), Color.White);


            //aggiorno la visualizzazione
            player.Draw(spriteBatch);
            //termine del ridisegno
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

Conclusioni

L'articolo conclusivo di questo tutorial ha illustrato come applicare un punteggio al nostro video gioco, il tutorial ha affrontato gli aspetti più comuni nello sviluppare un video gioco.
Tramite la parola download potete scaricare il file d’esempio.

Download

Nessun commento: