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 :

Redefinition de variable genante.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut Redefinition de variable genante.
    Bonjour, ca fait un peu de temps que je fais un brickbreaker en opengl et sdl.
    Tout allait bien jusqu'a ce que je tombe sur un os dans au niveau du test des collisions :
    la balle est dirigee par balle.direc ( de la class ball ). Je passe ladresse de la classe dans la methode pour gerer les collisions et la ca ne marche que pour la deuxieme fonction appelee, car la variable de la premiere est redefinie directement apres.
    voila le code pose probleme :

    bricks.c
    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
     
    int brick::collide_haut_brique(ball balle)
    {
     
    // la balle touche le haut de la brique, il faut la faire remonter
    //if(balle->direc==DOWN)
    //{
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) )// on teste que la balle est sur la case en x;
    	{
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		{
    			if( float(balle.ballposy/400) <= float(brickposY/400)+0.1f)// on teste que la balle est sur la case en y;
    			{
    				if(float(balle.ballposy/400) >= float(brickposY/400)-0.1f )
    				{
     
    					//balle->direc=UP;
    					return UP;
    					//balle->direc=-balle->direc;
    				}
    			}
    		}
    	}
    //}
     
    return 0;
    }
     
     
    int brick::collide_bas_brique(ball balle)
    {
     
    // la balle touche le bas de la brique il faut la faire redescendre
    //if(balle->direc==UP)
    //{
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) ) // on teste que la balle est sur la case en x;
    	{
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		{
    			if( float(balle.ballposy/400) >= float(brickposY/400)-0.1f  )// on teste que la balle est sur la case en y;
    			{
    				if(float(balle.ballposy/400) <= float(brickposY/400)+0.1f )
    				{
     
    					//balle->direc=DOWN;
    					return DOWN;
    					//balle->direc=-balle->direc;
    				}
    			}
    		}
    	}
    //}
     
    return 0;
    }
     
     
    int level::checkcollides(ball *balle)
    {
     
    	for (int p=0; p<20 ; p++ )
    	{
    		if(bricks[p].isalive==true)
    		{	
    			if(bricks[p].collide_haut_brique(*balle)==UP)
    			{
    				balle->direc=UP;
    				std::cout <<"UP ! balle.direc = " << balle->direc << "\n";
    				bricks[p].isalive=false;
    			}
     
    			//std::cout <<"HAUT BRICK " << bricks[p].collide_bas_brique(balle) << "\n";
     
    			if(bricks[p].collide_bas_brique(*balle)==DOWN) 
    			{
    				balle->direc=DOWN;
    				std::cout <<"DOWN ! balle.direc = " << balle->direc << "\n";
    				bricks[p].isalive=false;
    			}
    			//std::cout <<"BAS BRICK " << bricks[p].collide_bas_brique(balle) << "\n";
    		}
    	}
     
     
     
    return 0;
    }
    et dans le main.c je l'apelle comme ca :
    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
     
    level Game;
     
    Game.initbricks();
    Game.bar.init(0,0);
    Game.balle.init(Game.bar);
     
    // init de ogl et sdl etc
     
    unsigned int checkTime = SDL_GetTicks();
    const unsigned int fps = 50;
     
    bool run = true;
     
    while (run)
    {
    	if(SDL_GetTicks() > (checkTime + 1000 / fps) )
    	{	
    		Events(event);
     
    		Game.bar.updatepos();
     
    		Game.checkcollides(&Game.balle);
     
    		Game.balle.collide(Game.bar);
     
    		Game.balle.upgrademove();
     
    		Draw(Game);
     
        		/* On remet à jour le temps à contrôler */
        		checkTime = SDL_GetTicks();
    	}
     
    }
     
    return 0;
    }
    Je ne sais pas trop pourquoi la boucle dans bricks.c redefinit la variable balle->direc donc si vous pouviez m'aider .

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    On peut voir la classe ball?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    On peut voir la classe ball?
    Oui la voila desole ;s

    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
     
    #ifndef BALL_H
    #define BALL_H
     
    #include <iostream>
    #include <cmath>
    #include <SDL/SDL.h>
    #include <SDL/SDL_opengl.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include "planche.h"
     
    #define UP 1
    #define DOWN -1
    #define BEGIN 0
    #define RIGHT 1
    #define LEFT -1
     
    class ball
    {
    public :
    	int init(planche pl);
    	int upgrademove();
    	int collide(planche pla);
    	int drawball();
     
    //private :
    	float ballposx, ballposy;
    	bool ismoving;
    	int direc;
    	int rightorleft;
    	float speedX;
    	float speedY;
    };
     
    #endif
    Sinon oui je vais preciser le probleme en fait quand je lance lapplication la variable balle->direc fait comme cela ( ce que jai avec les cout que jai mis dans le shell ) :
    UP ! balle.direc = 1
    DOWN ! balle.direc = -1
    UP ! balle.direc = 1
    DOWN ! balle.direc = -1
    quand il y a une collision avec le haut dune brique. Ca devrait en fait juste faire UP ! balle.direc = 1 et donc faire remonter la balle, or ca redefinit directement apres par le if qui met le balle->direc a down, et je narrive pas a savoir pourquoi...

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Ou j'ai mal lu, ou les quatre tests sont identiques dans les deux fonctions (brick::collide_haut_brique et brick::collide_bas_brique). Donc s'ils sont vérifiés dans la première, ils le seront dans la seconde même si les 3ème et 4ème sont inversés.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ou j'ai mal lu, ou les quatre tests sont identiques dans les deux fonctions (brick::collide_haut_brique et brick::collide_bas_brique). Donc s'ils sont vérifiés dans la première, ils le seront dans la seconde même si les 3ème et 4ème sont inversés.
    Oui mais ils ne sont pas identiques justement ... enfin je vais les revoir

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par codas Voir le message
    Oui mais ils ne sont pas identiques justement ... enfin je vais les revoir
    Salut,
    Dans le code que tu fournis, moi, je vois les quatre mêmes tests dans les deux fonctions. La seule différence est l'inversion entre le troisième et le quatrième. Ce qui ne change rien s'ils sont vérifiés! :
    int brick::collide_haut_brique(ball balle):
    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
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) )// on teste que la balle est sur la case en x;
    	{
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		{
    			if( float(balle.ballposy/400) <= float(brickposY/400)+0.1f)// on teste que la balle est sur la case en y;
    			{
    				if(float(balle.ballposy/400) >= float(brickposY/400)-0.1f )
    				{
     
    					//balle->direc=UP;
    					return UP;
    					//balle->direc=-balle->direc;
    				}
    			}
    		}
    	}
    int brick::collide_bas_brique(ball balle):
    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
     
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) ) // on teste que la balle est sur la case en x;
    	{
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		{
    			if( float(balle.ballposy/400) >= float(brickposY/400)-0.1f  )// on teste que la balle est sur la case en y;
    			{
    				if(float(balle.ballposy/400) <= float(brickposY/400)+0.1f )
    				{
     
    					//balle->direc=DOWN;
    					return DOWN;
    					//balle->direc=-balle->direc;
    				}
    			}
    		}
    	}
    Soit en les mettant côte à côte et en inversant 3 et 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) )// on teste que la balle est sur la case en x;
    	if(float(balle.ballposx/400)+0.1f >= float(brickposX/400) ) // on teste que la balle est sur la case en x;
    	{
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		if ( float(balle.ballposx/400) <= float(brickposX/400)+0.1f )
    		{
    			if(float(balle.ballposy/400) <= float(brickposY/400)+0.1f)// on teste que la balle est sur la case en y;
    			if(float(balle.ballposy/400) <= float(brickposY/400)+0.1f )
    			{
    				if(float(balle.ballposy/400) >= float(brickposY/400)-0.1f )
    			   if( float(balle.ballposy/400) >= float(brickposY/400)-0.1f  )// on teste que la balle est sur la case en y;
    				{

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour et bienvenu,
    Peux-tu préciser un peu plus ton problème?

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/05/2007, 10h27
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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