Bonjour à tous.
Voilà je suis en train de coder un petit jeu en 2D isométrique, mais j'ai un problème. J'ai réussi à afficher mon terrain, j'ai une classe camera, des méthodes pour calculer les coordonnées écran -> iso.
Cependant pour que ça marche, je ne dois pas bouger la camera, en effet quand le terrain est affiché à partir des coordonnées 0,0 et la camera à 0,0, pas de problème. Mais une fois la camera déplacé, plus moyen.
Voici mon code, je pense que ça suffit pour trouver la solution. Je pense que je dois donc soustraire ou additionner la position de la camera avec autre chose, enfin un calcul ( bête sûrement ) mais je n'arrive pas à trouver lequel.
Affichage:
Screen -> Iso
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 int row = 1; for (int l = 0; l < floor.GetLength(0); l++) { for (int h = 0; h < floor.GetLength(1); h++) { //map[l, h].setCoordonnes(position); if (floor[l, h] == 0) { spriteBatch.Draw(tilesand, position, Color.White); } else { spriteBatch.Draw(tilestone, position, Color.White); } position.X += tilesand.Width / 2; position.Y += (tilesand.Height / 2) - 4; } position.X = - tilesand.Width / 2 * row; position.Y = (tilesand.Height - 6) / 2 * row; row++; }
Et voilà ma classe camera
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 float x = Mouse.GetState().X; float y = Mouse.GetState().Y; Vector2 position; position.X = (float)Math.Floor((y / tile.Height) + (x / tile.Width)); position.Y = (float)Math.Ceiling((y / tile.Height) - (x / tile.Width)); return position;
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 class Camera2D : Object { protected float _zoom; // Camera Zoom public Matrix _transform; // Matrix Transform public Vector2 _pos; // Camera Position public Camera2D() { _zoom = 1.0f; _pos = Vector2.Zero; } public float Zoom { get { return _zoom; } set { _zoom = value; if (_zoom < 0.5f) _zoom = 0.5f; else if (_zoom > 1.5f) _zoom = 1.5f; } // Negative zoom will flip image } // Auxiliary function to move the camera public void Move(Vector2 amount) { _pos += amount; } // Get set position public Vector2 Pos { get { return _pos; } set { _pos = value; } } public Matrix get_transformation(GraphicsDevice graphicsDevice) { _transform = // Thanks to o KB o for this solution Matrix.CreateTranslation(new Vector3(-_pos.X, -_pos.Y, 0)) * Matrix.CreateScale(new Vector3(Zoom, Zoom, 0)) * Matrix.CreateTranslation(new Vector3(graphicsDevice.Viewport.Width * 0.5f, graphicsDevice.Viewport.Height * 0.5f, 0)); return _transform; } public void Update(KeyboardState clavier) { if (clavier.IsKeyDown(Keys.Up)) this.Move(new Vector2(0.0f, -5.0f)); if (clavier.IsKeyDown(Keys.Down)) this.Move(new Vector2(0.0f, 5.0f)); if (clavier.IsKeyDown(Keys.Right)) this.Move(new Vector2(5.0f, 0.0f)); if(clavier.IsKeyDown(Keys.Left)) this.Move(new Vector2(-5.0f, 0.0f)); if (clavier.IsKeyDown(Keys.X)) this.Zoom += 0.05f; if (clavier.IsKeyDown(Keys.V)) this.Zoom -= 0.05f; } } }
Partager