:salut:
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:
Version imprimable
:salut:
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:
Merci pour ces tutos que je suis à la lettre pour mon initiation à Monogame. :ccool:
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: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:
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:
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:
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:
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. :aie:
:salut:
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 :aie:
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:public Color[,] ColorTable { get; set; }
Ensuite j'ai modifié la façon dont on récupère la colortable dans le LoadContent:Code:
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:
1
2
3 world.Texture = Content.Load<Texture2D>("world"); world.Position = new Vector2(0, 0); world.ColorTable = world.Texture.TextureTo2DArray();
Code:
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; } }