IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Développement de jeux en C# avec MonoGame - Partie 2


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Développement de jeux en C# avec MonoGame - Partie 2


    Voici le second tutoriel de la série traitant du développement de jeux avec MonoGame:

    http://franckh.developpez.com/tutori...ogame/part-II/

    Vous pouvez laisser vos remarques et autres messages à la suite !


    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Merci pour ces tutos que je suis à la lettre pour mon initiation à Monogame.

    J'ai quelque petite remarque à te faire, dans ce tuto tu as oublié de mettre la ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    world = new World(new Color(0, 128, 248));
    les autres remarques sont plus liés à l'utilisation du C#:
    - évite au maximun les variables globales, au lieu de cela préfère leur des propriétés, si tu ne fais rien de particulier dans tes accesseurs tu peux passer par un raccourci d'écriture exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private int _totalFrames;
    public int totalFrames
    {
        get { return _totalFrames; }
    }
    devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public int TotalFrames
            {
                get;
                private set;
            }
    tu peux même spécifié la portée d'un accesseur.

    - tu n'es pas obligé de mettre une enum dans une classe tu peux les mettre directement dans le namespace (j'ai crée un fichier Enumerable.cs pour cela) et après tu peux les appeler dans tes classes utilisant le même namespace sans problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    namespace Pacman.Core
    {
     
        public enum Direction
        {
            NONE = -1,
            LEFT = 0,
            RIGHT = 1,
            TOP = 2,
            BOTTOM = 3
        }
     
     
        public enum framesIndex
        {
            RIGHT_1 = 0,
            RIGHT_2 = 1,
            BOTTOM_1 = 2,
            BOTTOM_2 = 3,
            LEFT_1 = 4,
            LEFT_2 = 5,
            TOP_1 = 6,
            TOP_2 = 7
        }
    }
    utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Player(int totalAnimationFrames, int frameWidth, int frameHeight, World world)
                : base(totalAnimationFrames, frameWidth, frameHeight, world)
            {
                Direction = Direction.RIGHT;
                FrameIndex = framesIndex.RIGHT_1;
                CollidedDirection = Direction.NONE;
            }
    - tu as aussi dit qu'il fallait mettre un public devant tes classes alors qu’implicitement elle le sont, ce qui est faux par défaut une classe à une portée internal et c'est donc pour ça que tu as été obligé de spécifier le mot public.

    J'attends avec impatience la suite de tes tutos et je vais essayé de retravailler les collisions parce qu'avec la méthode du point chaud si on déplace le pacman en diagonale il traverse le décor.

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut


    Merci pour les commentaires. Effectivement, C# je ne suis pas encore un pro, je l'utilise pas très souvent et pareil au boulot, je suis plus orienté VB.Net au taf et C (bientôt Python) chez moi donc c'est deux univers bien différents

    Je tiendrais compte de tes remarques pour d’éventuelles futures mise à jour
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    Salut,
    j'ai utilisé une façon de détecter les collisions qui correspond au point dans AABB, pour ça j'ai pris notre pacman en tant que cadre et je recherche si il y a un pixel bleu du décor dedans.

    Pour cela j'ai déjà ajouté une nouvelle propriété à l'objet world:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public Color[,] ColorTable { get; set; }
    J'ai crée une méthode d'extension à l'objet texture2D pour créer directement un tableau de couleur en 2D, pour cela j'ai crée une class Extension.cs ou je mettrais toutes mes méthodes d'extension, (la méthode to2D Array je lai trouvé sur le net):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
     
    namespace Pacman.Core
    {
        public static class Extension
        {
            public static Color[,] TextureTo2DArray(this Texture2D texture)
            {
                Color[] colorsOne = new Color[texture.Width * texture.Height]; //The hard to read,1D array
                texture.GetData(colorsOne); //Get the colors and add them to the array
     
                Color[,] colorsTwo = new Color[texture.Width, texture.Height]; //The new, easy to read 2D array
                for (int x = 0; x < texture.Width; x++) //Convert!
                    for (int y = 0; y < texture.Height; y++)
                        colorsTwo[x, y] = colorsOne[x + y * texture.Width];
     
                return colorsTwo; //Done!
            }
        }
    }
    Ensuite j'ai modifié la façon dont on récupère la colortable dans le LoadContent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     world.Texture = Content.Load<Texture2D>("world");
                world.Position = new Vector2(0, 0);
                world.ColorTable = world.Texture.TextureTo2DArray();
    Et enfin j'ai modifié la façon dont on gére les colisions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
      public static bool Collided(GameObject gameObject, World world)
            {
                return GetCollided(gameObject, world);
            }
     
            private static bool GetCollided(GameObject gameObject, World world)
            {
                bool result = false;
     
                Color[,] colorTable = world.ColorTable;
                Color color = world.CollisionColor;
                float x = 0;
                float y = 0;
     
                // Permet de récuperer la prochaine position par rapport à la direction 
                // (on veut savoir si le déplacement est possible sur cette direction)
                GetXY(gameObject.Direction, ref x, ref y);
                Vector2 vect = new Vector2(gameObject.Position.X + x, gameObject.Position.Y + y);
     
                // on recupere notre rectangle correspondant à note gameobject à la prochaine position désirée
                Rectangle rect = new Rectangle((int)vect.X, (int)vect.Y, gameObject.FrameWidth, gameObject.FrameHeight);
     
                //on va parcourir le cadre représentant notre pacman pour voir si y'a une colision avec notre décor
                if ((int)vect.X >= 0 && (int)vect.X < world.Texture.Width
                && (int)vect.Y >= 0 && (int)vect.Y < world.Texture.Height)
                {
                    for (int i = rect.Left; i < rect.Right; i++)
                    {
                        for (int j = rect.Top; j < rect.Bottom; j++)
                        {
                            if (colorTable[i, j] == color)
                            {
                                result = true;
                                break;
                            }
                        }
                    }
                }
     
     
                return result;
            }
     
     
            private static void GetXY(Direction direction, ref float x, ref float y)
            {
                switch (direction)
                {
                    case Direction.LEFT:
                        x -= 1;
                        break;
                    case Direction.RIGHT:
                        x += 1;
                        break;
                    case Direction.TOP:
                        y -= 1;
                        break;
                    case Direction.BOTTOM:
                        y += 1;
                        break;
                }
            }

Discussions similaires

  1. Développement de jeux en C# avec MonoGame - Partie 1
    Par Franck.H dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 06/01/2015, 11h29
  2. Développement de jeux en C# avec MonoGame - Partie 4
    Par Franck.H dans le forum Développement 2D, 3D et Jeux
    Réponses: 14
    Dernier message: 04/07/2014, 11h34
  3. Développement de jeux en C# avec MonoGame - Partie 3
    Par Franck.H dans le forum Développement 2D, 3D et Jeux
    Réponses: 0
    Dernier message: 12/12/2013, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo