Bonjour, avant tout, pour ceux qui se souviennent de moi (Projet "Life"), je voulais dire que Life v2 est sortie (voir ma signature). Je dis cela car j'avais des problèmes sur la gestion de collision et qu'ils ont été réglés par des membres de cette partie du forum. Merci à eux.
Aujourd'hui, je suis sur un nouveau projet que j'ai bientôt finit (il me reste l'éditeur de map et la gestion de collision qui est à revoir).
Voilà un code permettant de gérer la collision entre un robot et les autres robots de l'environnement :
Le problème c'est que quand un robot i rencontre un robot i2 sur l'écran, il lui marche dessus -_-
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 int verification_of_position(robot **my_robot, int i, int nbr_of_robots) { robot *temp = NULL; int i2 = 0; signed error = -1; if(*my_robot != NULL) { temp = *my_robot; for(i2 = 0 ; i2 < nbr_of_robots ; i2++) { if((temp+i)->position.x > (temp+i2)->position.x && (temp+i)->position.x < (temp+i2)->position.x+SIZE_OF_CASE) { error = 1; if((temp+i)->position.y > (temp+i2)->position.y && (temp+i)->position.y < (temp+i2)->position.y+SIZE_OF_CASE) { error = 1; /* Collision possible */ } else { error = 0; } } else { error = 0; /* aucune collision */ } } } else { fprintf(stderr, "[verification_of_position] : my_robot == NULL\n"); exit(EXIT_FAILURE); } return error; }
Voilà un morceau de code (celui permettant de faire avancer un robot si sa position actuelle est UP, cela veut dire que le robot est tourné vers le haut) :
Merci d'avance
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 if((my_robot+i)->action_in_progress == MOVE_UP) { if((my_robot+i)->position_in_progress == UP) { if((my_robot+i)->position.y-1 != WALL && (my_robot+i)->position.y-1 > 0 && (my_robot+i)->position.y-1 != ROBOT) /* S'il n'y a pas de murs */ { if((my_robot+i)->step < SIZE_OF_CASE) { (my_robot+i)->position.y--; if(verification_of_position(&my_robot, i, nbr_of_robots) == 0) { mapi[(my_robot+i)->position.x][(my_robot+i)->position.y] = BLANK; (my_robot+i)->step++; mapi[(my_robot+i)->position.x][(my_robot+i)->position.y] = ROBOT; } else { (my_robot+i)->position.y++; (my_robot+i)->action_in_progress = NOTHING; (my_robot+i)->step = 0; } } else { (my_robot+i)->action_in_progress = NOTHING; (my_robot+i)->step = 0; } } } }
Ps: Pourquoi step ? Et bien c'est pour rendre plus fluide le mouvement. Je veux dire, le faire avancer "CASE par CASE" est pas super joli alors j'utilise step et on dirait vraiment qu'il roule, c'est la classe à l'écran
Partager