
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();
- Méthode 1
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 GameTexture2D 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;
- Effectuer un effet miroir horizontal :
-
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