Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Besoin d'aide pour un simple calcul de pourcentage..  (Lu 2796 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Besoin d'aide pour un simple calcul de pourcentage..
« le: Mars 09, 2017, 02:59:57 pm »
Salut à tous :-)

Je viens à vous car j'aimerais faire quelque chose qui, je pense, paraîtra particulièrement simple pour la plupart d'entre vous..

Par exemple, admettons que j'ai une barre de vie sous forme d'un RectangleShape qui fasse 40 pixels de longueur.
Ma vie, elle, est à ... disons 140 HP.

Si je prends 12 points de dégâts, nous sommes d'accord qu'il ne me restera plus que 128 HP..
Mais comment faire pour que ma barre de vie qui fait 40 pixels diminue EN FONCTION des dégâts reçus en ayant pour référence ma vie maximale ( soit 140 HP ) J'aimerais que ma barre de vie diminue en fonction de ces paramètres pour que ça soit cohérent..

Merci à vous :-)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Besoin d'aide pour un simple calcul de pourcentage..
« Réponse #1 le: Mars 09, 2017, 03:29:55 pm »
Est-ce le calcul (règle de 3) qui te pose problème, ou bien l'implémentation graphique de la chose (réduire la barre de vie) ?
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Besoin d'aide pour un simple calcul de pourcentage..
« Réponse #2 le: Mars 10, 2017, 01:20:36 pm »
Hey Laurent, ben plutôt le calcul je pense..
J'ai fait ceci pour le moment juste pour les tests :

#include <iostream>

#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

int main()
{
    int W = 400, H = 400;

    RenderWindow app(VideoMode(H,W),"SFML Lifebar", Style::Titlebar);

    Clock clock;

    RectangleShape lifeBar(Vector2f(40,2));
    lifeBar.setFillColor(Color::Red);
    lifeBar.setPosition(100,100);

    float life = 80;

    while (app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            switch (event.type)
            {
            case Event::Closed:
                app.close();
                break;
            case Event::KeyReleased:
                if (event.key.code == Keyboard::Escape)
                    app.close();
                break;
            }
        }

        if (Keyboard::isKeyPressed(Keyboard::Space) && clock.getElapsedTime().asMilliseconds()>500)
        {
            int degat = 5;
            life -= degat;
            float perLife = life * 40 / 100;
            float adaptDegat = degat * perLife / 100;
            cout << "life : " << life << endl;
            lifeBar.setSize(Vector2f(lifeBar.getSize().x - adaptDegat, lifeBar.getSize().y));
            cout << lifeBar.getSize().x << endl;
            clock.restart();
        }

        app.clear();

        app.draw(lifeBar);
        app.display();
    }
}
 

J'aimerais que la barre de vie qui fait 40 pixels diminue en fonction de la variable "Life" quand j'appuie sur espace ( qui enlève -5 hp à chaque pression ).
Si ma Life est à 180, la barre devrait se vider moins vite que si ma Life est à 120 par exemple...
Mais mon calcul ne semble pas correct..

J'ai essayé d'appliquer le principe de la règle des 3 de la manière suivante :

        if (Keyboard::isKeyPressed(Keyboard::Space) && clock.getElapsedTime().asMilliseconds()>500)
        {
            int degat = 5;
            life -= degat;
            float perLife = (life / degat) * (lifeBar.getSize().x/100);
            cout << "life : " << life << endl;
            lifeBar.setSize(Vector2f(lifeBar.getSize().x - perLife, lifeBar.getSize().y));
            cout << "sizebar : " << lifeBar.getSize().x << endl;

            if (life <0)
                life = 140;
            clock.restart();
        }

Mais la barre diminue beaucoup au début et ensuite trèèèèès lentement.. y a pas de proportion égale tout le long.. :-(
« Modifié: Mars 10, 2017, 01:51:28 pm par Slash94 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Besoin d'aide pour un simple calcul de pourcentage..
« Réponse #3 le: Mars 10, 2017, 02:36:36 pm »
Si 140 HP = 40 pixels, alors xxx HP = xxx / 140 * 40 pixels.
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Besoin d'aide pour un simple calcul de pourcentage..
« Réponse #4 le: Mars 11, 2017, 10:03:44 am »
Salut Laurent, merci à toi mais j'ai trouvé ma méthode :

float perLife = life / maxLife * pixelBar;
            cout << "perlife : " << perLife << endl;
            cout << "life : " << life << endl;
            lifeBar.setSize(Vector2f(perLife, lifeBar.getSize().y));

VIE / VIE_MAX * LONGUEUR DE LA BARRE DE VIE

Là, c'est parfaitement proportionné désormais !

:-)

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Re : Besoin d'aide pour un simple calcul de pourcentage..
« Réponse #5 le: Mars 11, 2017, 12:26:48 pm »
merci à toi mais j'ai trouvé ma méthode
C'est exactement la même que la sienne ;)