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

OpenGL Discussion :

Annuler toutes transformations ? [OpenGL 1.x]


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Par défaut Annuler toutes transformations ?
    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 :

    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...
    }
    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...

    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 :

    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);
    }
    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é...


    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;
    	}
    }

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    c'est simple il suffit d'utiliser

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Par défaut
    Salut Kannagi,
    Merci ,
    Mais à quel endroit exactement ?

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    ben ou tu veux , cela remettra a la normal tout tes transformation.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2011
    Messages : 72
    Par défaut
    Euh chez moi ça marche pas du tout...
    Tu veux dire que je devrais simplement le mettre dans le else ?
    Si c'est ça alors ça ne marche pas !

  6. #6
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Je sais pas trop chez moi ça marche ,mais imaginant que tu veux deux cube avec 2 transformation différente tu peux faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    glLoadIdentity();
    glTranslatef(5,0,6);
    glRotatef(180,0,1,0);
    //dessiner cube 1 
     
    glLoadIdentity();
    glTranslatef(1,22,2);
    glRotatef(45,1,0,0);
    //dessiner cube 2

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Annuler tout le traitement
    Par Dordubre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2012, 16h54
  2. Restaurer une base de données / annuler toute modification
    Par flzox dans le forum Accès aux données
    Réponses: 11
    Dernier message: 05/12/2011, 14h09
  3. Réponses: 1
    Dernier message: 07/06/2011, 15h06
  4. [XL-2003] annuler tout avant enregistrement
    Par olivier-tig dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 18/05/2009, 14h00
  5. Réponses: 7
    Dernier message: 29/11/2005, 11h07

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