IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Freiner un objet


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    ok
    Inscrit en
    Octobre 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : ok

    Informations forums :
    Inscription : Octobre 2018
    Messages : 39
    Points : 31
    Points
    31
    Par défaut Freiner un objet
    Bonjour,

    j'ai un petit jeu 2D ou en appuyant sur la touche droite je donne la vitesse x à un objet et la touche gauche -x. La vitesse est multiplié par 0.9 à chaque tour de boucle ce qui freine l'objet. Mais il y a un gros problème. A l'écran l'objet bouge plus longtemps si j'appuie sur gauche que sur droite. Comment ça se fait ?

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Si ta vitesse est un nombre entier, cela peut être dû à l'arrondi des entiers.
    Par exemple : -15 * 0.9 => -13.5 arrondi entier en -14, alors que +15 * 0.9 => 13.5 arrondi entier en 13 donc la vitesse diminuerait moins vite pour les nombres négatifs.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    ok
    Inscrit en
    Octobre 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : ok

    Informations forums :
    Inscription : Octobre 2018
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    C'est un float, si je le change en double ca donne la même...

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Et ma boule de cristal a mal fonctionné, peut-être qu'avec le code on y verrait plus clair.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    ok
    Inscrit en
    Octobre 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : ok

    Informations forums :
    Inscription : Octobre 2018
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Voici body.cpp

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include "body.h"
     
    body::body() : m_vx(0), m_vy(0), m_leg(0), m_kick(0)
    {
        m_rectangle.x = 500;
        m_rectangle.y = 0;
        m_rectangle.w = 88;
        m_rectangle.h = 304;
    }
     
    body::~body()
    {
        //dtor
    }
     
    void body::load(SDL_Renderer *renderer)
    {
        m_surface3 = SDL_LoadBMP(kick);
        m_texture3 = SDL_CreateTextureFromSurface(renderer, m_surface3);
        m_surface2 = SDL_LoadBMP(jambe);
        m_texture2 = SDL_CreateTextureFromSurface(renderer, m_surface2);
        m_surface1 = SDL_LoadBMP(defaut);
        m_texture1 = SDL_CreateTextureFromSurface(renderer, m_surface1);
    }
     
    void body::affiche(SDL_Renderer *renderer)
    {
        if(m_leg)
        {
            m_rectangle.w = 169;
            SDL_RenderCopy(renderer, m_texture2, NULL, &m_rectangle);
        }
     
        else if(m_kick)
        {
            m_rectangle.w = 185;
            SDL_RenderCopy(renderer, m_texture3, NULL, &m_rectangle);
        }
     
     
        else
        {
            m_rectangle.w = 88;
            SDL_RenderCopy(renderer, m_texture1, NULL, &m_rectangle);
        }
     
     
     
    }
     
    void body::action(input touch)
    {
        if(touch.getTouchDown(SDL_SCANCODE_UP) && m_rectangle.y >= 420)
            m_vy += -20;
     
        if(touch.getTouchDown(SDL_SCANCODE_DOWN))
        {
     
        }
     
        if(touch.getTouchDown(SDL_SCANCODE_RIGHT))
            m_vx = 4;
     
        if(touch.getTouchDown(SDL_SCANCODE_LEFT))
            m_vx = -4;
     
        if(touch.getTouchDown(SDL_SCANCODE_C))
        {
            if(m_kick)
                m_kick = 0;
     
            else
                m_kick = 1;
        }
     
        if(touch.getTouchUp(SDL_SCANCODE_C))
            m_kick = 0;
     
        if(touch.getTouchUp(SDL_SCANCODE_RIGHT))
        {
     
        }
     
     
        if(touch.getTouchUp(SDL_SCANCODE_LEFT))
        {
     
        }
    }
     
    void body::dynamic()
    {
        m_rectangle.x += m_vx;
        m_rectangle.y += m_vy;
     
        if(m_rectangle.y >= 420)
        {
            m_vy = 0;
            m_rectangle.y = 420;
            m_leg = 0;
        }
     
        else
        {
            m_vy += 1;
     
            if(!m_kick)
                m_leg = 1;
     
            else
                m_leg = 0;
        }
     
        m_vx *= 0.99;
    }
     
    float body::location()
    {
        return m_location;
    }

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Sans les types des données et sans savoir qui appelle la fonction body::dynamic() difficile d'en dire plus.
    Si les x sont entiers avec une vitesse flottante on a le même décalage dû aux erreurs d'arrondi mais le temps de parcours est quasi-identique dans les 2 sens c'est alors la distance parcourue qui est bien plus importante vers la gauche.

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Avez-vous besoin d'inertie ? (un mouvement qui continue même après l'arrêt de l'appui sur la touche, du style de Asteroids)
    Si vous n'en avez pas besoin, vous devriez juste donner une vitesse si une touche est appuyée. Si aucune touche n'est appuyée, la vitesse est 0.
    Ensuite, vous pouvez utiliser les formules classiques de l'accélération (kinématic). Après, les formules ne sont pas nécessairement aussi compliquée, notamment dans les jeux vidéo.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    ok
    Inscrit en
    Octobre 2018
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : ok

    Informations forums :
    Inscription : Octobre 2018
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Ok voici body.h

    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
    #ifndef BODY_H
    #define BODY_H
     
    #include "SDL.h"
    #include "input.h"
    #include <iostream>
     
    const char defaut[] = "laura3.bmp", jambe[] = "laura2legup.bmp", kick[] = "laura2kick.bmp";
     
    class body
    {
        public:
            body();
            ~body();
     
            void load(SDL_Renderer*);
            void affiche(SDL_Renderer*);
            void action(input);
            void dynamic();
     
            float location();
     
        private:
            SDL_Rect m_rectangle;
            SDL_Texture *m_texture1, *m_texture2, *m_texture3;
            SDL_Surface *m_surface1, *m_surface2, *m_surface3;
     
            float m_location;
            float m_vx, m_vy;
            bool m_leg, m_kick;
    };
     
    #endif // BODY_H
    et moteur.cpp

    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
    #include "moteur.h"
     
    moteur::moteur() : m_largeur(1280), m_hauteur(720)
    {
        SDL_CreateWindowAndRenderer(m_largeur, m_hauteur, SDL_WINDOW_RESIZABLE, &m_window, &m_renderer);
        SDL_SetWindowTitle(m_window, "Jeu 2D");
        m_laura2.load(m_renderer);
    }
     
    moteur::~moteur()
    {
        //dtor
    }
     
    int moteur::start()
    {
        while(m_input.start())
        {
            m_input.getEvent();
     
            SDL_SetRenderDrawColor(m_renderer, 0, 50, 100, 255);
            SDL_RenderClear(m_renderer);
     
            m_world.bouge(m_laura2.location());
     
            m_laura2.affiche(m_renderer);
            m_laura2.action(m_input);
            m_laura2.dynamic();
     
            SDL_RenderPresent(m_renderer);
            SDL_Delay(10);
        }
     
        return 0;
    }

  10. #10
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Les coordonnées sont donc entières donc :
    Citation Envoyé par dalfab Voir le message
    Si les x sont entiers avec une vitesse flottante on a le même décalage dû aux erreurs d'arrondi mais le temps de parcours est quasi-identique dans les 2 sens c'est alors la distance parcourue qui est bien plus importante vers la gauche.

  11. #11
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 330
    Points : 4 151
    Points
    4 151
    Par défaut Cumul
    Bonjour,

    A chaque incrément de type int_X += float_vX, il y a une erreur d'arrondi qui se cumule. Comme déjà expliqué, L'erreur n'est pas nécessairement la même en positif et négatif (delta potentiel de 1).

    Conseil : travailler avec avec float_X += float_vX. La conversion en int ne se fera qu'à l'affichage et les erreurs ne seront alors pas cumulatives.

    Il est vraisemblable qu'actuellemnt, le freinage ne fonctionne pas non plus très bien (ralentissements par a-coups lorsque l'on passe d'un arrondi à un autre).

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

Discussions similaires

  1. codage objet
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/08/2002, 16h49
  2. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 22h58
  3. Importer des objets de 3dsMax
    Par Anonymous dans le forum OpenGL
    Réponses: 3
    Dernier message: 06/05/2002, 13h53
  4. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 16h20
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo