Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - DrPapino

Pages: « Précédente 1 2 [3]
31
Graphique / Re : Déplacement de sprite avec la souris [SFML 2.0][Résolu]
« le: Février 28, 2013, 01:39:45 pm »
Dans l'idéal, j'aurais voulu que ma vitesse soit exprimée en pixels/secondes. Si on admet que mon sprite peut se déplacer en diagonale ( c'est à dire sauter une ligne ET une colonne ) et pas forcément qu'avec des pas sur le côté ( sauter une colonne ) ou dans la hauteur (sauter une ligne), le nombre de pas à faire ne peut plus être calculé par Pythagore, mais par ce petit bout de ligne :

distance=( abs(vecteur.x) > abs(vecteur.y) ) ? abs(vecteur.x) : abs(vecteur.y) ; ( que j'ai corrigé, dit dit en passant )

Après, je suis effectivement parti du principe que le sprite PEUT se déplacer en diagonale, mais je pense que j'ai juste, non ? Ce qui est sûr, c'est que si je rajoute Pythagore à mon algo mon sprite se déplace beaucoup moins vite et s'arrête parfois un peu trop tard.

Mr Pchoun

32
Graphique / Déplacement de sprite avec la souris [SFML 2.0][Résolu]
« le: Février 27, 2013, 11:23:26 pm »
Ah ben maintenant que tu le dis, c'est vrai que des abs() auraient pas fait de mal.

[...]

Je viens de tester là, effectivement, c'est les distances négatives qui ne faisaient pas bon ménage. Mais j'ai toujours ce problème de variations de vitesse, je pense que mon clock.restart() était au mauvais endroit. M'enfin toute façon, le code de Laurent est mieux  ;D

Mr Pchoun

33
Graphique / Re : Déplacement de sprite avec la souris [SFML 2.0]
« le: Février 27, 2013, 10:24:00 pm »
C'est fou ça... Merci Laurent, c'est super, ça maaaarche :) Je crois avoir compris ton code, sauf deux ou trois trucs, je m'en vais replancher tout ça. Enfin c'est vrai que le tiens est beaucoup plus lisible pour le coup.

Merci encore !

Mr Pchoun.

PS : Comment fait-on pour mettre le sujet en "résolu" ?  ;D

34
Graphique / Déplacement de sprite avec la souris [SFML 2.0][Résolu]
« le: Février 27, 2013, 08:41:32 pm »
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  ;D

Mr Pchoun.

Pages: « Précédente 1 2 [3]