Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Inscrit en
    mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 38
    Points : 0
    Points
    0

    Par défaut 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 Confirmé
    Avatar de dragonjoker59
    Homme Profil pro Sylvain DOREMUS
    Développeur informatique
    Inscrit en
    juin 2005
    Messages
    959
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain DOREMUS
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2005
    Messages : 959
    Points : 3 882
    Points
    3 882

    Par défaut

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

    Chef de projet (et unique exécutant pour l'instant) pour Castor 3D
    Des tutoriels OpenGL

  3. #3
    Invité de passage
    Inscrit en
    mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 38
    Points : 0
    Points
    0

    Par défaut

    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 :
    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 :
    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 :
    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 :
    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 Confirmé
    Avatar de dragonjoker59
    Homme Profil pro Sylvain DOREMUS
    Développeur informatique
    Inscrit en
    juin 2005
    Messages
    959
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain DOREMUS
    Âge : 32
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2005
    Messages : 959
    Points : 3 882
    Points
    3 882

    Par défaut

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

    Chef de projet (et unique exécutant pour l'instant) pour Castor 3D
    Des tutoriels OpenGL

  5. #5
    Invité de passage
    Inscrit en
    mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 38
    Points : 0
    Points
    0

    Par défaut

    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
    Invité de passage
    Inscrit en
    mars 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : mars 2010
    Messages : 38
    Points : 0
    Points
    0

    Par défaut

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •