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 !
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 !
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:
les autres remarques sont plus liés à l'utilisation du C#:
Code : Sélectionner tout - Visualiser dans une fenêtre à part world = new World(new Color(0, 128, 248));
- é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:
devient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 private int _totalFrames; public int totalFrames { get { return _totalFrames; } }
tu peux même spécifié la portée d'un accesseur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public int TotalFrames { get; private set; }
- 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:
utilisation:
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 } }- 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.
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; }
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.
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
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:
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 public Color[,] ColorTable { get; set; }
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
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! } } }
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 world.Texture = Content.Load<Texture2D>("world"); world.Position = new Vector2(0, 0); world.ColorTable = world.Texture.TextureTo2DArray();
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; } }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager