Memento C# & Monogame

Estimated reading time:5 minutes 21 seconds
programmation développement csharp monogame

Memento CSharp & Monogame

Voici une liste des différents codes source et syntaxes courantes utilisés en C# dans Monogame.

Ce fichier est un canevas qui s'étoffera au fur et à mesure de mes expérimentations sur ce moteur de jeu.

Références/Sources:

Écran & Images

L'affichage

  • Connaître La résolution de votre jeu
    Par défaut une application Monogame à une résolution de 800 x 480.

    int w = graphics.PreferredBackBufferWidth;
    int h = graphics.PreferredBackBufferHeight;
  • Connaître la résolution de l'écran

    int w = graphics.DisplayMode.Width;
    int h = graphics.DisplayMode.Height;
  • Connaître la taille de la fenêtre

    int w = GraphicsDevice.Viewport.Width;
    int h = GraphicsDevice.Viewport.Height;
  • Connaître la résolution de la zone client

    Il s'agit de la résolution de la fenêtre de votre application au sein du système d'exploitation.

    int w = this.Window.ClientBounds.Width;
    int h = this.Window.ClientBounds.Height;
  • Changer la taille de la fenêtre
    Dans le constructeur de l'instance de Game :

    graphics.PreferredBackBufferWidth = 800;
    graphics.PreferredBackBufferHeight = 600;
    graphics.ApplyChanges();
  • Passage en plein écran ou mode fenêtré

    • Méthode 1
      Dans le constructeur de l'instance de Game :
    graphics.IsFullScreen = false;
    • Méthode 2
    graphics.ToggleFullScreen();

Les Images

  • Ajouter le fichier au Content Pipeline :

    • Double cliquer sur Content.mgcb, cela ouvre automatiquement l'outil "Monogame Pipeline".
    • Faire glisser l'image dans la partie Content. On peut faire un glisser/déposer depuis l'explorateur de fichier vers la fenêtre du Monogame Pipeline. Résultat : le fichier s'ajoute dans la liste (noter son nom).
    • Compiler les ressources en cliquant sur l'engrenage (ou menu Build/Build ou F6).
    • Le résultat de la compilation doit afficher "Build 1 succeeded".
  • Afficher une image
    Déclarer un membre de type Texture2D au niveau de la classe Game

    Texture2D imgSlime;
  • Instancier l'image dans LoadContent()

    //Le nom passé en paramètre doit être le même que celui du fichier, sans extension
    imgSlime = this.Content.Load<Texture2D>("personnage");
  • Afficher l'image dans la fonction Draw()

    spriteBatch.Begin();
    spriteBatch.Draw(img, new Vector2(100, 100),Color.White);
    spriteBatch.End();
  • Effets sur les images

    • Effectuer un effet miroir horizontal :
      Il faut utiliser une surcharge de Draw qui propose un plus grand nombre de paramètres, celui qui nous intéresse est SpriteEffects.
      Il peut prendre comme valeur FlipHorizontally, FlipVertically ou None.
    SpriteEffects effect = SpriteEffects.None;
    if (slimSpeed > 0)effect = SpriteEffects.FlipHorizontally;
    spriteBatch.Draw(imgSlime, new Vector2(100, 100), null, Color.White, 0, Vector2.Zero, 1.0f, effect, 0);
    • Changer la teinte d'une image
    spriteBatch.Draw(img, position, Color.Red);

    Note: L'utilisation de Color.White permet d'avoir la couleur d'origine de l'image.

    • Ajouter de la transparence (Alpha) à une image
    Color color = Color.White * 0.5f;
  • Obtenir les dimensions d'une image

    /* TODO */

Les sprites

  • Gérer des listes de sprites

    for (int i=1; i<=20; i++) {
    Sprite mySprite = new Sprite();
    int y = rnd.Next(img.Height, GraphicsDevice.Viewport.Height);   int x = rnd.Next(0, GraphicsDevice.Viewport.Width);
    mySprite.position = new Vector2(x, y);   mySprite.vitesse = rnd.Next(1, 5);
    lstSprite.Add(mySprite);
    }
    …
    foreach (Sprite item in lstSprite) {
    effect = SpriteEffects.None;
    if (item.vitesse > 0) effect = SpriteEffects.FlipHorizontally;
    spriteBatch.Draw(img, item.position, null, Color.White, 0, new Vector2(img.Width / 2, img.Height), new Vector2(scale, scale), effect,0);
    }

Les Polices de caractères

  • Ajouter le fichier contenant les polices au Content Pipeline
    Voir l'explication dans le paragraphe sur les images

  • calculer la taille d'un texte dans une police donnée

    /* TODO */

Les Textes

  • Afficher un texte dans une police donnée

    SpriteFont fontNormal = Content.Load<SpriteFont>("fonts/normal");
    spriteBatch.Begin();
    // Finds the center of the string in coordinates inside the text rectangle
    Vector2 textMiddlePoint = font.MeasureString(text) / 2;
    // Places text in center of the screen
    Vector2 position = new Vector2(myGame.Window.ClientBounds.Width / 2, myGame.Window.ClientBounds.Height / 2);
    spriteBatch.DrawString(fontNormal, "un petit texte ", position, Color.White, 0, textMiddlePoint, 1.0f, SpriteEffects.None, 0.5f)
    spriteBatch.End();

Le GamePlay

Le Delta time

Par défaut, Monogame gère un affichage à vitesse constante, en visant le 60 FPS.
Utiliser le delta time n'aura donc pas d'influence sur votre jeu, à moins de demander à Monogame de travailler en affichage à vitesse variable.
Insérez cette ligne dans le constructeur de votre classe Game pour passer en vitesse variable

  IsFixedTimeStep = false

Ensuite, lors de vos updates, il faut travailler en nombre de pixels par secondes. Pour cela Monogame vous fournit un paramètre précieux à travers la méthode Update, il s'agit de gameTime :

  protected override void Update(GameTime gameTime)

Ce paramètre vous fournit des informations sur le temps "consommé" par votre jeu et notamment le temps écoulé depuis la dernière update :

  gameTime.ElapsedGameTime.TotalSeconds

En utilisant cette valeur, vous obtenez une fraction correspondant au temps qu'il a fallu à la dernière update pour s'exécuter. Il vous suffit d'un calcul pour savoir de combien de pixels faire avancer votre personnage:

  (slimSpeed *60.0f)*(float)gameTime.ElapsedGameTime.TotalSeconds;

Gestion des entrées utilisateur

Le clavier

  • intercepter une touche du clavier
/* TODO */

La souris

  • Afficher le curseur de la souris
    Dans le constructeur de la classe dérivée de Game (Game1 si vous ne lui avez pas donné un nom) ou dans Initialize, ajoutez :
IsMouseVisible = true;
  • Connaître l'état des boutons de la souris

    MouseState etatSouris = Mouse.GetState();
    if (etatSouris.LeftButton == ButtonState.Pressed) {
    // Le bouton gauche est enfoncé…
    }

    On a aussi accès à MiddleButton, RightButton ou encore ScrollWheelValue pour connaître la valeur de la roulette de la souris.

    ASTUCE
    Il est important de stocker l'ancien état de la souris afin de pouvoir gérer les événements proprement.
    Si on ne teste que l'état "Pressed" dans l'update, la condition sera vraie jusqu'à 60 fois par secondes, tant que le joueur ne lâche pas le bouton.

    MouseState ancienEtat;
    MouseState nouvelEtat = Mouse.GetState();
    if (nouvelEtat.LeftButton == ButtonState.Pressed && ancienEtat.LeftButton == ButtonState.Released) {
    //clic !
    }
    ancienEtat = nouvelEtat;
  • Connaître la position de la souris

    /* TODO */

Physique

Gravité & Inertie

  • déplacement selon un objet ayant un angle de rotation (en degré)

    /* TODO */

L'audio

Les formats supportés sont: mp3, mp4, wma, wav, ogg.

Musique

  • Ajouter le fichier au Content Pipeline
    Voir l'explication dans le paragraphe sur les images

  • charger et jouer une musique

Song music = Game1.Instance.Content.Load<Song>("music");
if (MediaPlayer.State != MediaState.Playing) {
  MediaPlayer.Play(music);
  MediaPlayer.IsRepeating = true;
}

Sons

  • Ajouter le fichier au Content Pipeline
    Voir l'explication dans le paragraphe sur les images

  • charger et jouer un son

SoundEffect sndJump;
sndJump = Content.Load<SoundEffect>("jump");
sndJump.Play();

Note: Si vous voulez charger le son depuis une autre classe que Game, vous devrez vous munir d'une référence vers le membre Content de la classe Game1.

Système

Fichiers

  • Ajouter le fichier au Content Pipeline
    Voir l'explication dans le paragraphe sur les images

  • lire un fichier texte

/* TODO */

Divers

Gestion de l'application

  • Quitter l'application
/* TODO */
  • Exemple d'initialisation d'une application
  /* TODO */

Publication

Sous Windows

TODO

Sous Android

TODO

Sous IOS

TODO

Sous MacOS

TODO

Sous Linux

TODO

Next Post Previous Post