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 !