Bonjour,
Je me heurte à un problème : je crée un jeu du labyrinthe avec plusieurs niveaux, etc.
Et je voudrais qu'à chaque niveau corresponde une petite feature qui ferait varier le gameplay : changement de touches, rotation, obscurité, flou... ( à la manière des jeux chiants de Kek pour ceux qui connaissent)
Seulement, je ne parviens pas à faire cette chose simple :
Après le niveau qui tourne sur lui-même (j'utilise un glTranslate, puis un glRotate, puis un glTranslate pour cela), j'aimerais que la vue soit rétablie à la normale, et je n'y parviens pas !
Comment faire ?
J'ai dans ma boucle de jeu :
Si quelqu'un a des idées, je suis preneur. J'ai tenté des trucs avec glLoadIdentity, ou en inversant les transformations pour essayer de revenir en arrière, mais rien ne marche...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 if (getLvl() == lvl_spin) { if (angleZ <= -5 || angleZ >= 5) aug = !aug; if (aug) angleZ += rot_speed; else angleZ -= rot_speed; glTranslated(COLUMNS/2, LINES/2, 0); glRotated(angleZ, 0.0, 0.0, 1.0); // Pas de glPush ou Pop, on veut un effet d'accélération -> cumul des opérations glTranslated(-COLUMNS/2, -LINES/2, 0); Sleep(50); } else if (getLvl() > lvl_spin){ // Ici, le code pour rétablir la vue... }
EDIT : C'est mieux, je passe par une variable qui fait la somme des rotations, et donc je fais la rotation inverse avec cette somme quand je sors du niveau pour annuler toutes les rotations, mais le niveau n'est pas bien cadré, sûrement à cause des glTranslated !
Voilà le nouveau code :
Au moins le niveau est de nouveau droit... Mais je ne sais pas trop quel calcul faire pour revenir au centre de l'écran ! Là, mon niveau n'est plus centré...
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 (getLvl() >= lvl_spin) { if (getLvl() == lvl_spin) { if (angleZ <= -5 || angleZ >= 5) aug = !aug; if (aug) angleZ += rot_speed; else angleZ -= rot_speed; sumAngle += angleZ; glTranslated(COLUMNS/2, LINES/2, 0); glRotated(angleZ, 0.0, 0.0, 1.0); glTranslated(-COLUMNS/2, -LINES/2, 0); } else { glRotated(-sumAngle, 0.0, 0.0, 1.0); sumAngle = 0; } Sleep(50); }
RE-EDIT : Je ne comprends pas ! Ceci devrait marcher, non ? Je stocke les opérations, et je les fais dans l'ordre inverse une fois le niveau terminé pour revenir à la normale... Encore une fois, la rotation est remise à zéro comme dans mon essai juste au-dessus, donc ça c'est bon, mais la translation doit mal se faire car le niveau est décentré...
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 bool reset_done = false; vector<float> angleVec; if (getLvl() >= lvl_spin) { if (getLvl() == lvl_spin) { if (angleZ <= -5 || angleZ >= 5) aug = !aug; if (aug) angleZ += rot_speed; else angleZ -= rot_speed; angleVec.push_back(angleZ); glTranslated(COLUMNS/2, LINES/2, 0); glRotated(angleZ, 0.0, 0.0, 1.0); glTranslated(-COLUMNS/2, -LINES/2, 0); } else if (!reset_done) { for(int i = angleVec.size()-1; i >= 0; i--) { glTranslated(COLUMNS/2, LINES/2, 0); glRotated(-angleVec[i], 0.0, 0.0, 1.0); glTranslated(-COLUMNS/2, -LINES/2, 0); } reset_done = true; } }
Partager