2 votes

La liste semble toujours exister après avoir terminé le programme

J'ai trouvé une chose assez étrange en codant un mini-jeu Asteroid Destroyer en utilisant MonoGame avec Visual Studio 2017. Dans le LoadContent() Je charge les textures de mon vaisseau spatial dans une liste de Sprites qui est créée sur place. Ensuite, cette liste est introduite dans la méthode Spaceship pour que le vaisseau reçoive ses textures. Le code est le suivant :

protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            List<Sprite> spaceship1Sprites = new List<Sprite>
            {
                new Sprite(Content, "Spaceship1On"),
                new Sprite(Content, "Spaceship1Off"),
                new Sprite(Content, "Bullet1")
            };

            spaceship1 = new Spaceship(spaceship1Sprites, new Vector2(graphics.GraphicsDevice.DisplayMode.Width / 2, graphics.GraphicsDevice.DisplayMode.Height / 2))
            {
                Controls = new Input(Keys.W, Keys.D, Keys.A, Keys.Space)
            };
        }

Ce qui est étrange, c'est que, si après avoir exécuté le programme une fois, je supprime les lignes dans lesquelles la liste des Sprites est définie,

            //List<Sprite> spaceship1Sprites = new List<Sprite>
            //{
            //    new Sprite(Content, "Spaceship1On"),
            //    new Sprite(Content, "Spaceship1Off"),
            //    new Sprite(Content, "Bullet1")
            //};

le programme s'exécutera quand même, même si la liste n'est définie nulle part ailleurs dans le programme et que la balise Spaceship devrait recevoir une liste inexistante comme premier paramètre. Comment cela peut-il encore fonctionner ?

Ce n'est pas quelque chose qui m'empêche de faire fonctionner mon programme, mais j'aimerais quand même en connaître la cause afin d'en savoir un peu plus sur le fonctionnement du C#.

Edit : Ajout du reste du code dans le fichier Game1 classe. Le site Spaceship ne contient pas la liste spaceship1Sprites Il possède trois champs pour les trois sprites, qui sont chargés dans le constructeur.

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Generic;
using System.IO;

namespace Asteroid_Destroyer
{
    public class Game1 : Game
    {
        public static GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        KeyboardState currentKeyboardState, previousKeyboardState;
        bool paused = false;

        Spaceship spaceship1;

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

        protected override void Initialize()
        {
            //Change screen resolution
            graphics.PreferredBackBufferWidth = graphics.GraphicsDevice.DisplayMode.Width;
            graphics.PreferredBackBufferHeight = graphics.GraphicsDevice.DisplayMode.Height;
            graphics.IsFullScreen = true;
            graphics.HardwareModeSwitch = false; //fullscreen borderless
            graphics.ApplyChanges();

            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            List<Sprite> spaceship1Sprites = new List<Sprite>
            {
                new Sprite(Content, "Spaceship1On"),
                new Sprite(Content, "Spaceship1Off"),
                new Sprite(Content, "Bullet1")
            };

            spaceship1 = new Spaceship(spaceship1Sprites, new Vector2(graphics.GraphicsDevice.DisplayMode.Width / 2, graphics.GraphicsDevice.DisplayMode.Height / 2))
            {
                Controls = new Input(Keys.W, Keys.D, Keys.A, Keys.Space)
            };
        }

        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        protected override void Update(GameTime gameTime)
        {
            currentKeyboardState = Keyboard.GetState();

            if (currentKeyboardState.IsKeyDown(Keys.Escape))
                Exit();

            if(currentKeyboardState.IsKeyDown(Keys.P) && previousKeyboardState.IsKeyUp(Keys.P))
                paused = paused ? false : true;

            if (!paused)
                spaceship1.Update();

            base.Update(gameTime);
            previousKeyboardState = currentKeyboardState;
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();
            spaceship1.Draw(spriteBatch);
            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}

Edit 2 : Résolu ! Comme prévu, ce n'était pas quelque chose à propos du code mais à propos de ce que Visual Studio exécutait. D'une certaine manière, la configuration de Visual Studio laisse la version précédente s'exécuter s'il y a une erreur dans la version en cours... Mais j'ai déjà trouvé le paramètre pour changer cela, donc mystère résolu !

1voto

Nordellak Points 41

Apparemment, il existe une option dans les paramètres qui permet à Visual Studio d'exécuter une construction précédente du projet en cas d'erreur, qui était activée par défaut dans mon installation (à moins que j'aie activé l'option par erreur).

J'ai trouvé la solution grâce à cette réponse dans une autre question tout en essayant d'enquêter sur le problème :

Essayez de modifier cette valeur :

  • Outils
    • Options
      • Projets et solutions
        • Construire et exécuter
          • À l'exécution, lorsque des erreurs de construction ou de déploiement se produisent : Ne pas lancer

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X