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 .