Bonsoir, je suis actuellement entrain de coder un jeu en C++ avec SFML. J'ai un personnage (Sprite ninja), avec une animation, pour choisir l’animation. J'utilise une image avec étage 1 : Position fixe ; étage 2 : Courir.
Mais j'ai un problème, au lieu de m'afficher un carré de l'image et de changer d'image très rapidement, l'image défile de gauche à droite, je ne comprend pas pourquoi, voila le code : ( animation ligne 49 )
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <SFML/Graphics.hpp>
using namespace std;
using namespace sf;
int main()
{
// Création d'une fenêtre en SFML //
RenderWindow window(VideoMode(800, 480, 32), "app");
window.setFramerateLimit(60);
window.setVerticalSyncEnabled(true);
// Création des sprites //
Texture backgroundTexture;
Sprite background;
Texture ninjaTexture;
Sprite ninja;
// Chargement des textures //
if (!ninjaTexture.loadFromFile("graphics/ninja/final.png"))
{
cout << "Erreur durant le chargement de l'image de background." << endl;
}
else
{
ninja.setTexture(ninjaTexture);
ninja.scale(0.3f, 0.3f);
ninja.setPosition(300, 377);
}
if (!backgroundTexture.loadFromFile("graphics/background.png"))
{
cout << "Erreur durant le chargement de l'image de background." << endl;
}
else
{
background.setTexture(backgroundTexture);
background.scale(0.5f, 0.5f);
}
// Animations //
int frameTimer(4), frameNumber(0), frameMax(10), direction(0), w(363), h(329), etat(0);
// Boucle principale du jeu //
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D))
{
etat = 1;
direction = 0;
w = (363);
h = (329);
ninja.move(4, 0);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
{
etat = 1;
direction = 1;
w = (363);
h = (329);
ninja.move(-4, 0);
}
else if (!sf::Keyboard::isKeyPressed(sf::Keyboard::D) && !sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
{
etat = 0;
w = (232);
h = (329);
}
}
// Animations //
if (frameTimer <= 0)
{
frameTimer = 4;
frameNumber++;
if (frameNumber >= frameMax)
{
frameNumber = 0;
}
}
else
{
frameTimer--;
}
if (direction == 1)
{
ninja.setTextureRect(sf::IntRect(frameNumber * w, etat * h, -w, h));
}
else
{
ninja.setTextureRect(sf::IntRect(frameNumber * w, etat * h, w, h));
}
// Affichage //
window.clear();
window.draw(background);
window.draw(ninja);
window.display();
}
// Fin //
return 0;
}
Quelqu'un aurait t'il une piste pour m'aider à résoudre le problème ?
Merci d'avance.