Bonjour à tous
Alors voilà, je me suis mis en tête de déplacer un sprite à l'écran par un clic de la souris. Je m'explique : quand le programme se lance, le sprite est affiché en haut à gauche de l'écran ( ça lui apprendra ! ) puis quand on clique sur la souris, le sprite se déplace gaiement, d'un mouvement simple et allègre, vers l'endroit où on a cliqué.
J'utilise pour ça 3 vecteurs.
Le premier, pour la position du sprite ( on l'appelle position )
Le deuxième, pour enregistrer la position de la souris lorsqu'on a cliqué ( on l'appelle destination )
Le troisième vecteur représente quant lui le trajet à parcourir ( destination - position, qu'on appelle… vecteur. Oui, je suis pas trop inspiré là )
Il s'agit ensuite de placer notre sprite en ( destination - (1-t)vecteur )
t varie entre [0 ; 1], il est en fait le rapport du temps passé depuis le début du mouvement sur le temps total du mouvement ( calculé par le désormais célèbre v.d ). Mais jugez plutôt :
#include <SFML/Graphics.hpp>
#include <math.h>
#include <time.h>
#include <iostream>
int main ()
{
bool moving(0);
float a(0);
float v(0.01);// vitesse de déplacement ( en inverse )
float distance;
sf::RenderWindow window(sf::VideoMode(800, 600), "Deplacer une ellipse");
sf::Texture perso;
perso.loadFromFile("/Users/blablabla/image.png");
sf::Sprite mysprite(perso);
sf::Vector2f position(0,0);
sf::Vector2f vecteur(0,0);
sf::Vector2f destination(0,0);
sf::Clock clock;
window.clear();
mysprite.setPosition(position);
window.draw(mysprite);
window.display();
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if ((event.type == sf::Event::Closed) || (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape))
{
window.close();
}
if ((event.type == sf::Event::MouseButtonPressed) && (event.mouseButton.button == sf::Mouse::Left))
{
destination.x=event.mouseButton.x;
destination.y=event.mouseButton.y;
vecteur=destination-position;
moving = true;
clock.restart();
distance=(vecteur.x > vecteur.y ) ? vecteur.x : vecteur.y ;
}
}
if (moving==true)
{
sf::Time elapsed = clock.getElapsedTime();
a=elapsed.asSeconds();
mysprite.setPosition(destination-vecteur*(1-(a/(v*distance))));
position.x=(destination.x-vecteur.x*(1-(a/(v*distance))));
position.y=(destination.y-vecteur.y*(1-(a/(v*distance))));
if (a/(v*distance)>1)
{
moving=false;
position=destination;
}
}
window.clear();
window.draw(mysprite);
window.display();
}
return EXIT_SUCCESS;
}
Voilà voilà... " Mais ton code est parfait ", me diriez vous, et vous n'auriez pas tort ( j'espère que vous avez saisi mon humour glacé et raffiné ), quoiqu'un peu quand même.. En fait, des fois mon sprite se trompe de direction : au lieu d'aller en haut à gauche, comme je le lui dis avec la souris, ce petit rigolo part en bas à droite. Curieux, n'est ce pas ! Auriez vous une solution ?
Autre fait amusant, et pas des moindres : parfois, mon sprite va trop vite. Je pensais pourtant avoir calculé son déplacement par rapport au temps, et non par rapport aux caprices de framerate de mon ordinateur, mais il faut croire que j'ai du me planter quelque part.
Enfin voilà, si une bonne âme passe par là et qu'elle a la solution à tous mes problèmes ce serait super sympa de laisser une petite réponse !
Merci.
Bonne journée, ou bonne soirée, et joyeux noël
Mr Pchoun.