Bonjour,
je réalise un projet de jeu avec sfml et j'essaye de gérer les collisions sur ma map.
Pour cela j'utilise un vector qui contient des objets tile qui dispose chacun d'une énumération qui indique si le personnage peu marcher dessus, en dessous où pas du tous.
Je vérifie (avant chaque mouvement) que la direction vers laquelle le perso se dirige correspond a un tile dont le type (énumération) indique que le perso peu marché dessus.
la map est composé de 50x50 tiles de 32px.
Cependant cela ne semble pas fonctionner
Mon erreur vient elle de ma fonction pour calculer le tile sur lequel ce trouve mon perso ou d'ailleurs?
Il y t il une meilleur solution pour gérer mes collisions ?
Main.cpp:
fonction pour connaitre le tile ou se trouve le perso:
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 sf::Vector2f movement(0.f, 0.f); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) { currentile = currentTileNbr(animatedSprite)-50; if (tabTile[currentile-1].getType() != type::off) { currentAnimation = &walkingAnimationUp; movement.y -= speed; noKeyWasPressed = false; } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) { currentile = currentTileNbr(animatedSprite) + 50; if (tabTile[currentile - 1].getType() != type::off) { currentAnimation = &walkingAnimationDown; movement.y += speed; noKeyWasPressed = false; } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { currentile = currentTileNbr(animatedSprite) -1; if (tabTile[currentile - 1].getType() != type::off) { currentAnimation = &walkingAnimationLeft; movement.x -= speed; noKeyWasPressed = false; } } if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { currentile = currentTileNbr(animatedSprite) + 1; if (tabTile[currentile - 1].getType() != type::off) { currentAnimation = &walkingAnimationRight; movement.x += speed; noKeyWasPressed = false; } } animatedSprite.play(*currentAnimation); animatedSprite.move(movement * frameTime.asSeconds());
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int currentTileNbr(AnimatedSprite animatedSprite) { nbrCol = std::ceil((animatedSprite.getPosition().x) / 32); nbrRow = std::ceil((animatedSprite.getPosition().y) / 32); currentile = (((nbrRow) * 50) + (nbrCol)); return currentile; }
Partager