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

Newton Discussion :

Problème Newton Game Dynamic


Sujet :

Newton

  1. #1
    Membre à l'essai
    Problème Newton Game Dynamic
    Bonjour,
    Je suis en train de réaliser un jeu vidéo avec Newton et un loader 3DS.
    Je suis actuellement dans une impasse, newton fonctionne correctement mais lorsque que je change de niveau, le personnage devient injouable tout les paramètres (gravité,vitesse,..) semble être augmentés.
    Je ne sais comment faire pour résoudre ce problème.
    Avez vous des idées??

    Merci

  2. #2
    Expert éminent sénior
    J'ai une idée... Tu n'as qu'à baisser tous les paramètres lors d'un changement de niveau ...
    Plus sérieusement, as-tu isolé le bout de code qui te pose problème ? Peux-tu le poster, parce que sans ça, ça va être très dur de t'aider.

    EDIT :
    Je suppose que lorsque tu charges un niveau tu initialises tes valeurs (vitesse, gravité, ...). Sinon vérifie que lorsque tu détruis ton niveau tu ne "détruis" pas ces valeurs (destruction de l'objet qui les définit, remplacement par quelque chose qui n'a rien à voir ...)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre à l'essai
    Je n'arrive pas à l'isoler...
    Je sais que quand en cours du niveau je fais echap pour revenir au menu et que je clique sur jouer cela fonctionne correctement. Mais a la fin d'un niveau on propose de passer au niveau suivant et la le personnage s'accélère. J'ai essayé en faisant la même chose dans le changement de niveau que dans la touche echap mais le problème persiste.

    Pour vous dire, dans le main j'appelle une fonction menu qui, en cliquant sur "jouer" appelle une fonction initJeu(elle libère la mémoire si on a déjà charger 3DS et newton, elle fait appelle au chargement des fichiers 3DS et à l'initialisation de Newton). Ensuite dans affichage, je teste si le personnage a atteint l'arrivée. Dans ce cas, j'appelle à nouveau initJeu.
    N'y aurait-il pas un problème de récursivité?

    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
     
    void initJeu(char* niveau, char* arrivee)
    {
    	glDisable(GL_TEXTURE_2D);
    	glEnable(GL_DEPTH_TEST);	
    	glEnable(GL_LIGHTING);  	// Active l'éclairage
      	glEnable(GL_LIGHT0);		// Allume la lumière n°0
    	glEnable(GL_CULL_FACE);		// Permet de masquer les faces arrières	
    	alSourceStop(source[0]);
    	isMenu=false;				// Indique qu l'on ne se trouve plus dans le menu
    	if(charger) liberationMemoire();	// Si l'on a charger newton et 3DS précédemmant alors on libère la mémoire
    	//On initialise les fichiers 3DS
    	init3DS(niveau,arrivee);
    	// On initialise Newton
    	initNewton ();
    	//On appelle la fonction de raffraichissement de Newton
    	raffraichir(1);
    	glutReshapeFunc(redimensionnement);
    	glutDisplayFunc(affichage);
     
    	glutKeyboardFunc(glutKeyboard);
    	glutSpecialFunc(glutSpecialKeys);
    	glutKeyboardUpFunc(relachementTouche);
    	glutPassiveMotionFunc( SourisPassive );
    	glutEntryFunc(&SourisFenetre);
    	glutMouseFunc( Souris );
     
    	idProg = setShaders();
    	cout<<"init shaders : "<<idProg<<endl;
    	alSourcePlay(source[1]);
    	//glutPostRedisplay();
    }


    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
     
    case ESC:	// touche escape
    			isMenu=true;
    			numeroNiveau=1;
    			initMenu();
    			alSourceStop(source[1]);
    			alSourcePlay(source[0]);	
    			ReshapeMenuMdp( glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
    			glutMouseFunc(SourisMenu);
    			glutDisplayFunc(AffichageMenu);
    			glutKeyboardFunc(0);
    			glutReshapeFunc(ReshapeMenuMdp);
    			glutSpecialFunc(0);
    			glutSpecialUpFunc(0);
    			glutPassiveMotionFunc(0);
    			glutEntryFunc(0);
    			cout<<endl<<"echape: "<<numeroNiveau;
     
    			glutPostRedisplay();
    			break;


    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
     
    if(Y>=-0.44 && Y<=-0.16)//passage au niveau suivant
    			{
    				redimensionnement(width, height);
    				if (numeroNiveau==1)
    					initJeu("../3DS/level2.3DS", "../3DS/arrivee2.3DS");
    				if (numeroNiveau==2)
    					initJeu("../3DS/level3.3DS", "../3DS/arrivee3.3DS");
    				if (numeroNiveau==3)
    					initJeu("../3DS/level4.3DS", "../3DS/arrivee4.3DS");
    				if (numeroNiveau==4)//fin du jeu
    					exit(0);
    				numeroNiveau++;
    				cout<<endl<<"changeNiveau: "<<numeroNiveau;
    			}


    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
     
    void liberationMemoire ()
    {
    	//Destruction de Newton
    	for (GLuint i = 0 ; i < 5 ; ++i){
    		delete objet [i], objet [i] = NULL;
    		delete sol[i], sol[i] = NULL;
    	}
       NewtonDestroy(world);
     
       //Destruction du modele
       perso3D.Destroy();
       map3D.Destroy();
       telecommande3D.Destroy();
       delete g_bitmap;
     
       // Destruction des matériaux
       delete paire[0];
       delete paire[1];
       for(int i=0; i<5; ++i){
    		delete materiau[i], materiau[i] = NULL;
       }
    }

  4. #4
    Expert éminent sénior
    Est-ce que tu as vérifié les valeurs des variables qui peuvent poser problème,
    avec un std::cout ou un point d'arrêt ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre à l'essai
    Oui j'ai testé. Et les valeurs ne changent pas.
    J'utilise une fonction callback gérant la force d'attraction terrestre ainsi que des setVelocity pour le déplacement.
    Nous avons utilisé un système de mot de passe pour atteindre certains niveaux et je trouve bizarre que lorsqu'on utilise ces mots de passes où que l'on clique sur jouer le personnage retrouve sa vitesse initiale... Serait-ce possible qu'il y ait une accumulation de corps Newton regroupée sur le personnage?!?

  6. #6
    Membre à l'essai
    C'est bon le problème est résolu. Je faisais appelle à une fonction dans un autre fichier lors d'un contact avec l'arrivée. J'ai placé son contenu dans le if(contact) au lieu d'appeler la fonction et ça marche (par contre je ne sais pas pourquoi ça marche dans ce cas et pas comme avant). Merci pour votre aide.