Bonjour,
après avoir tenté plusieurs recherches sur internet (sans grand succès malheureusement),
je souhaite solliciter humblement votre aide afin de palier à un soucis.
J'effectue actuellement un projet dans le cadre de mon DUT informatique,
et mon binôme et moi même avons choisi de développer un jeu sous Irrlicht.
Ça avance pas trop mal, mais un point que je n'ai pas résolu vient entacher tout ceci.
Lorsque je déplace mon personnage avec les touches Z,Q,S,D (au moyen de la classe eventReceiver),
ce dernier effectue une première transition/rotation, fige un court instant, joue l'animation (toujours sur place) puis
se décide enfin à avancer ou tourner.
Second soucis, lorsque je me déplace avec deux touches (exemple Z pour avancer et Q pour tourner à gauche), puis que j'en relâche une (dans le cas échéant Q) l'action de la touche qui reste pressée(donc Z) n'est plus effectuée.
J'ai beau avoir tourné ça dans tous les sens, je ne trouve pas de solution.
Si une âme charitable pouvait jeter un oeil à mon code, je lui en serais grandement reconnaissant !
Mon main
#include <irr/irrlicht.h> #include "Multijoueurs.h" using namespace std; using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace gui; int main() { gui::IGUIEnvironment *gui; //Indique si le bouton jouer à été pressé bool jouer=false; //Indique si on joue en solo bool solo=false; //Indique si on joue en multijoueurs bool multijoueurs=false; //Indique si le bouton lancer serveur à été pressé bool lancerServeur=false; //Instance d'une partie en mode multijoueurs Multijoueurs * modeMulti; //Initialisation de la scene IrrlichtDevice *device = createDevice( video::EDT_OPENGL, // API OpenGL core::dimension2d<u32>(800,600), // Dimension Fenetre 32, false, true, false, 0); // 2^32 valeur par pixel / plein écran / Stencil buffers / Synchronisation verticale / capteur d'évènement video::IVideoDriver *driver = device->getVideoDriver(); //Gère le rendu scene::ISceneManager *sceneManager = device->getSceneManager(); //Initialise la scène sceneManager->setAmbientLight(irr::video::SColorf(1.f,1.f,1.f,1.f)); //Definie la lumiere ambiante monEventReceiver * eventRec = new monEventReceiver(device);//Crée un capteur d'événements device->setEventReceiver(/*&*/eventRec);//Definie le capteur d'événements de la scene device->getCursorControl()->setVisible(false);//Masque le curseur device->setWindowCaption(L"Secret of template fantasy 2 : Back to the future of Template's life bis");//Definie le titre de la fenêtre /* MENU INITIALE */ gui = sceneManager->getGUIEnvironment(); video::ITexture *image = driver->getTexture("Textures/triforce.bmp"); gui::IGUIButton *boutonJouer = gui->addButton(rect<irr::s32>(200,340,600,365),0,-1,L"Jouer"); gui::IGUIButton *boutonMultijoueurs = gui->addButton(rect<irr::s32>(200,370,600,395),0,-1,L"Multijoueurs"); gui::IGUIButton *boutonServeur = gui->addButton(rect<irr::s32>(200,400,600,425),0,-1,L"Lancer serveur"); gui::IGUIButton *boutonQuitter = gui->addButton(rect<irr::s32>(200,430,600,455),0,-1,L"Quitter"); /**/while(device->run()) // Tant qu'on ne ferme pas l'appli /**/ { driver->beginScene(true,true,video::SColor(0,255,255,255)); // On definit la couleur du fond de scene if (jouer)//Si on a sélectionné l'option "jouer" { if(eventRec->IsKeyDown(irr::KEY_ESCAPE)){ jouer = false; if(multijoueurs){ multijoueurs = false; modeMulti->fermerConnexion(); }else{ solo = false; } } if(multijoueurs){ modeMulti->routine(); if(modeMulti->getCamera()) modeMulti->getCamera()->Update();//Mise à jour de la position de la camera } if(solo){ } sceneManager->drawAll();//S'occupe du rendu géré par le scène manager }else{ device->getCursorControl()->setVisible(true);//On affiche le curseur //On genere un menu driver->draw2DImage(image,position2d<irr::s32>(0,0),rect<irr::s32>(0,0,800,600), 0, video::SColor(255,255,255,255), true); gui->drawAll();//On rafraichit l'image if (boutonJouer->isPressed())//Si le bouton jouer est appuyé { jouer=true;//Jouer passe à vrai } if(boutonMultijoueurs->isPressed()){ if(multijoueurs == false){ modeMulti = new Multijoueurs(sceneManager,driver,device,eventRec); multijoueurs = true; jouer = true; } } if(boutonServeur->isPressed()){ if(lancerServeur == false){ system("start ../../serveur/Debug/serveur.exe"); lancerServeur = true; } } if (boutonQuitter->isPressed())//Si le bouton quitter est appuyé { device->closeDevice();//On ferme la fenêtre } } driver->endScene(); //Affiche le rendu } device->drop(); //On libère la memoire return 0; }
Ma classe Multijoueurs (où la scène se déroule)
#include "Multijoueurs.h" Multijoueurs::Multijoueurs(scene::ISceneManager *pSceneManager,video::IVideoDriver *pDriver,IrrlichtDevice *pDevice, monEventReceiver * pEventRec) { mSceneManager = pSceneManager; //Port this->portServeur = 10000; //Notre ID this->my_ID_Joueur = -1; //ID des autres joueurs this->un_ID_Joueur = 0; //Indique si notre personnage marche this->je_marche = false; //Indique si un autre personnage marche this->il_marche = false; //Ces deux variables permettront de calculer le laps de temps ecoulé entre deux envois de messages this->tempsActuel = clock(); this->tempsEcouler = clock(); //Création de l'interface serveur this->client = RakNet::RakPeerInterface::GetInstance(); //Creation d'un packet this->packet = NULL; this->mDriver = pDriver; this->mDevice = pDevice; eventRec = pEventRec; //Saisie de l'adresse du serveur printf("Entrez l'adresse IP du serveur :"); scanf("%s", this->IP_serveur); connexionAuServeur(); initialisationNiveau(); initialisationPersonnages(); initialisationEclairage(); initialisationCiel(); attenteConnexion(); } /*************************************************************************************/ Multijoueurs::~Multijoueurs(void) { RakNet::RakPeerInterface::DestroyInstance(client);//On detruit le client } /*************************************************************************************/ void Multijoueurs::connexionAuServeur(){ //Demarrage du client this->client->Startup(1,&RakNet::SocketDescriptor(), 1); this->client->Connect(IP_serveur, portServeur, 0,0); } /*************************************************************************************/ void Multijoueurs::initialisationNiveau(){ map = new Carte(mSceneManager,mDriver,"Textures/terrain_heightmap.bmp","Textures/grass.jpg","terrain",core::vector3df(40.f, 4.4f, 40.f)); } /*************************************************************************************/ void Multijoueurs::initialisationPersonnages(){ for(int i = 0; i < JOUEURS_MAX;i++){ sydney[i] = new Personnages("Textures/sydney.md2","Textures/sydney.bmp",mSceneManager,mDevice,5900,100,6975); selector = mSceneManager->createOctreeTriangleSelector(sydney[i]->getPersonnage()->getMesh(),map->getCarte(), 128);//Definition des contraintes //du selector (mesh de l'élément) qui entrera en collision //definition du node avec lequel le mesh entrera en collision map->getCarte()->setTriangleSelector(selector); sydney[i]->getPersonnage()->setVisible(false); selector->drop(); } } /*************************************************************************************/ void Multijoueurs::attenteConnexion(){ // On fait une boucle pour la connexion, ici on va attendre de savoir si la connection // au serveur est OK ou non et attendre de recevoir un ID envoyer par le serveur // on continue cette boucle temps que notre ID est inferieur à 0. do { packet = client->Receive(); if(packet != NULL)// si oui { unsigned char packetID; //creation de data que l'on est pret a recevoir RakNet::BitStream dataStream(packet->data, packet->length, false); // on commence par lire l'ID du paquet que l'on vient de recevoir dataStream.Read(packetID); switch(packetID) { case ID_CONNECTION_REQUEST_ACCEPTED: printf("La connexion au serveur a bien ete acceptee\n"); break; case ID_CONNECTION_ATTEMPT_FAILED: //on reçois cet ID automatiquement si on arrive pas a ce connecter au serveur printf("La connexion au serveur a echoue !!!\n"); break; //le packet qui nous donne notre ID joueur case PACKET_ID_ID_JOUEUR: dataStream.Read(my_ID_Joueur); printf("Reception de l'ID: %d\n", my_ID_Joueur); sydney[my_ID_Joueur]->getPersonnage()->setVisible(true); sydney[my_ID_Joueur]->getPersonnage()->setName("joueur"); sydney[my_ID_Joueur]->getPersonnage()->setPosition(vector3df(5900,100,6975)); mCamera = new FollowingCamera(sydney[my_ID_Joueur]->getPersonnage(), mSceneManager,//Creation de la camera false, // Pour utiliser une position initiale. selector, // Pour les collisions. 100, // Distance. 50, // Hauteur. 30, // Delta cible. vector3df(-50,200,-120)); // Position initiale. mSceneManager->setActiveCamera( mCamera->getCam() ); break; } } }while(my_ID_Joueur < 0);//c'est que l'on a bien reçu notre ID } /*************************************************************************************/ void Multijoueurs::routine(){ /*RESEAU*/ //on verifie si on a reçu un packet packet = client->Receive(); if(packet != NULL)// si oui { unsigned char packetID; //creation de data que l'on est pret a recevoir RakNet::BitStream dataStream(packet->data, packet->length, false); // on commence par lire l'ID du paquet que l'on vient de recevoir dataStream.Read(packetID); switch(packetID) { //un packet qui indique la position des joueurs case PACKET_ID_DEPLACEMENT: dataStream.Read(un_ID_Joueur);//on lit l'ID du joueur a qui correspond cette position dataStream.Read(une_position);//on lit la position dataStream.Read(une_rotation);//puis la rotation //bien sur on n'effectue un changement sur la position du joueur //seulement si c'est pas le notre if(un_ID_Joueur != my_ID_Joueur) { //on place le joueur et on le tourne par rapport au valeur reçu precedement sydney[un_ID_Joueur]->getPersonnage()->setPosition(une_position); sydney[un_ID_Joueur]->getPersonnage()->setRotation(une_rotation); } break; //un packet qui indique l'animation des autres joueurs case PACKET_ID_ANIMATION: dataStream.Read(un_ID_Joueur);//on lit l'ID du joueur a qui correspond cette position if(un_ID_Joueur != my_ID_Joueur){ dataStream.Read(il_marche);//on lit si il marche if(il_marche) { sydney[un_ID_Joueur]->getPersonnage()->setMD2Animation(EMAT_RUN); if(!sydney[un_ID_Joueur]->getPersonnage()->isVisible()){ sydney[un_ID_Joueur]->getPersonnage()->setVisible(true); } } else { sydney[un_ID_Joueur]->getPersonnage()->setMD2Animation(EMAT_STAND); }} break; default: // si on l'ID d'un paquet que l'on a pas referencer on le dit //ceci n'est pas forcement un probleme ! printf("Reception d'un packet avec un ID inconnu: %i\n", int(packetID)); } client->DeallocatePacket(packet);//on vide le packet } //Si on presse la touche Z ou la touche S if(eventRec->IsKeyDown(irr::KEY_KEY_Z) || eventRec->IsKeyDown(irr::KEY_KEY_S)) { //Si l'animation de marche n'etait pas activée if(!je_marche) { //On indique que l'animation est lancée je_marche = true; //On envoie un message au serveur pour indiquer qu'on joue l'animation RakNet::BitStream data; data.Write(PACKET_ID_ANIMATION);//On indique que c'est une animation data.Write(my_ID_Joueur);//On ecrit notre ID afin que le serveur sache de qui il s'agit data.Write(je_marche);//On indique l'etat de l'animation de marche //On envoie le message au serveur client->Send(&data, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); //On detruit l'instance data data.DestroyInstance; } } else//Si l'on appuie ni sur Z ni sur S { //Si l'animation marche est activée if(je_marche) { //On indique que l'animation à cessé je_marche = false; //On envoie un message au serveur pour indiquer qu'on ne joue plus l'animation RakNet::BitStream data; data.Write(PACKET_ID_ANIMATION);//On indique que c'est une animation data.Write(my_ID_Joueur);//On ecrit notre ID afin que le serveur sache de qui il s'agit data.Write(je_marche);//On indique l'etat de l'animation de marche //On envoie le message au serveur client->Send(&data, MEDIUM_PRIORITY, RELIABLE_ORDERED, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); //On detruit l'instance data data.DestroyInstance; } } tempsEcouler = clock();//Mise a jour du temps ecoulé if(tempsEcouler - tempsActuel > 30)//Si plus de 30 ms se sont ecoulées { RakNet::BitStream data; data.Write(PACKET_ID_DEPLACEMENT);//On indique que c'est une animation data.Write(my_ID_Joueur);//On ecrit notre ID afin que le serveur sache de qui il s'agit une_position = sydney[my_ID_Joueur]->getPersonnage()->getAbsolutePosition();//On recupere notre position data.Write(une_position);//On l'ecrit dans le packet une_rotation = sydney[my_ID_Joueur]->getPersonnage()->getRotation();//On recupere notre rotation //On remet la rotation des axes X et Z a zéro afin de ne pas avoir un personnage dans des positions incoherentes une_rotation.X = 0; une_rotation.Z = 0; data.Write(une_rotation);//On ecrit la rotation dans le packet //On envoie le message au serveur client->Send(&data, HIGH_PRIORITY, RELIABLE_ORDERED, 0, RakNet::UNASSIGNED_SYSTEM_ADDRESS, true); tempsActuel = clock();//On met le temps a jour } } /*************************************************************************************/ void Multijoueurs::initialisationCiel(){ mSky = mSceneManager->addSkyBoxSceneNode(mDriver->getTexture("Textures/irrlicht2_up.jpg"), mDriver->getTexture("Textures/irrlicht2_dn.jpg"), mDriver->getTexture("Textures/irrlicht2_lf.jpg"), mDriver->getTexture("Textures/irrlicht2_rt.jpg"), mDriver->getTexture("Textures/irrlicht2_ft.jpg"), mDriver->getTexture("Textures/irrlicht2_bk.jpg")); } /*************************************************************************************/ void Multijoueurs::initialisationEclairage(){ mSceneManager->setAmbientLight(irr::video::SColorf(0.5f,0.5f,0.5f,1.0f)); // On crée une lumière diffuse scene::ILightSceneNode* sun = mSceneManager->addLightSceneNode(); // On specifie la distance que peut atteindre cette lumière sun->setRadius(100000); // On specifie la position de la lumière dans la scene sun->setPosition(core::vector3df(8000, 2000, 8000)); } /*************************************************************************************/ FollowingCamera* Multijoueurs::getCamera(){ return mCamera; } /*************************************************************************************/ void Multijoueurs::fermerConnexion(){ client->CloseConnection(client->GetSystemAddressFromIndex(0),true,0,HIGH_PRIORITY); }
Ma classe eventReceiver
#include "monEventReceiver.h" float PI=3.14; monEventReceiver::monEventReceiver(IrrlichtDevice* device) { mDevice = device; for(int i=0; i<irr::KEY_KEY_CODES_COUNT; i++) //mKeyState[i] = false; keyMap[i] = false; courseActive = false; } bool monEventReceiver::OnEvent(const SEvent& event) { if (event.EventType == irr::EET_KEY_INPUT_EVENT) { keyMap[event.KeyInput.Key] = event.KeyInput.PressedDown; OnPreRender(); return event.KeyInput.PressedDown; }else{ return false; } } void monEventReceiver::OnPreRender(){ bool retourActionOriginale = true; core::vector3df positionPersonnage; core::vector3df rotationPersonnage; scene::ISceneManager* smgr = mDevice->getSceneManager(); scene::IAnimatedMeshSceneNode* joueur = (scene::IAnimatedMeshSceneNode*)smgr->getSceneNodeFromName("joueur"); scene::ITerrainSceneNode* terrain = (scene::ITerrainSceneNode*)smgr->getSceneNodeFromName("terrain"); if(keyMap[KEY_ESCAPE]){ //mDevice->closeDevice(); } if (keyMap[irr::KEY_KEY_Z]){//Avancer facing.set( -cos( joueur->getRotation().Y * PI/180.0f ), 0, sin( joueur->getRotation().Y * PI/180.0f ) ); facing.normalize(); positionPersonnage = joueur->getPosition() - (facing*5.0f) ; positionPersonnage.Y = terrain->getHeight(positionPersonnage.X,positionPersonnage.Z) + 24; joueur->setPosition( positionPersonnage ); if(!this->courseActive){ joueur->setMD2Animation(scene::EMAT_RUN); this->courseActive = true; } } if (keyMap[irr::KEY_KEY_S]){//Reculer facing.set( cos( joueur->getRotation().Y * PI/180.0f ), 0, -sin( joueur->getRotation().Y * PI/180.0f ) ); facing.normalize(); positionPersonnage = joueur->getPosition() - (facing*5.0f) ; positionPersonnage.Y = terrain->getHeight(positionPersonnage.X,positionPersonnage.Z) + 24; joueur->setPosition( positionPersonnage ); if(!this->courseActive){ joueur->setMD2Animation(scene::EMAT_RUN); this->courseActive = true; } } if (keyMap[irr::KEY_KEY_Q]){//Rotation à gauche joueur->setRotation(joueur->getRotation() + core::vector3df(0.0f,-5.0f,0.0f)); if(rotationPersonnage.Y >= 360){ rotationPersonnage.Y -= 360; joueur->setRotation(rotationPersonnage); } } if (keyMap[irr::KEY_KEY_D]){//Rotation à droite joueur->setRotation(joueur->getRotation() + core::vector3df(0.0f,5.0f,0.0f)); if(rotationPersonnage.Y >= 360){ rotationPersonnage.Y -= 360; joueur->setRotation(rotationPersonnage); } } if((!keyMap[irr::KEY_KEY_S])&&(!keyMap[irr::KEY_KEY_Z])){ if(courseActive == true){ joueur->setMD2Animation(scene::EMAT_STAND); this->courseActive = false;} } } bool monEventReceiver::IsKeyDown(EKEY_CODE keyCode) const { return keyMap[keyCode]; }
Merci beaucoup par avance .
Hors ligne
Salut, je viens de lire ton code attentivement, mais rien de ce que tu présent ici ne permait d'expliquer ton problèmes
je soupsone donc votre(?) class de camera "FollowingCamera", qui normalement coder devrait ce metre a jours automatiquement via irrlicht et non être apeller... (dérive ta class de ISceneNode ou ICameraSceneNode, ou alors faire un dériver de ISceneNodeAnimator)
j'ai également remarqué que tu/vous utilisier le keyworld this qui na pas lieux d'être en c++, contrairement au java il me semble
ps: étant pour un DUT code en bon Français ou en Anglais mais pas les deux a la fois...
bonne soiré !
Hors ligne
D'accord ! Merci beaucoup pour ta réponse !
Je vais regarder du côté de la caméra, effectivement je n'avais pas pensé
à aller voir sa déclaration car j'ai pris une caméra à la 3eme personne mise
à disposition par un membre du forum (grand merci à lui soit dit au passage,
même si, honte à moi, je ne me souviens plus de son pseudo ^^").
Ok pour le this, je les ferais disparaître aussi x) (je pense que tu as effectivement raison,
étant donné qu'on ne fait que du Java en cours cette année, je m’emmêle un peu les pinceaux ^^").
Et effectivement, comme une certaine partie (voir même une bonne partie) du code provient de plusieurs tutos
où je rajoute ma sauce, je n'ai pas encore tout harmonisé (je te l'accord, j'ai fait le cochon sur ce coup xD)
mais n'ai crainte ! Je compte bien appliquer la norme que mon binôme et moi nous étions fixés !
Merci encore pour ta réponse, je vois ça dès que possible et je te tiens au courant !
Hors ligne
Désolé du temps pour donner des nouvelles,
je suis en train de me battre sur deux fronts en même temps (le déplacement et la création
de personnages lors d'une connexion).
Donc j'ai regardé la classe caméra, je n'ai rien trouvé qui clochait, j'ai même essayé de remplacer
cette caméra par une caméra de type fps donné de base dans Irrlicht, mais le problème persiste toujours.
Je me suis aussi demandé si il n'y avait pas un soucis du genre : lorsque je lance l'animation celle-ci se lance
une fois complètement avant d’effectuer les translations en boucle (oula, je ne sais pas si c'est très clair),
mais après avoir retiré l'animation le problème était toujours là.
Dans le doute j'ai tenté aussi de virer le facing.normalize() (ne me demandez pas pourquoi, c'était en désespoir de
cause x) ), mais rien non plus (je l'ai remis du coup).
Je suis vraiment dans une impasse là, j'ai beau retourner le code dans tous les sens, je ne trouve pas.
Hors ligne
qu'elle est le type de variable de facing ?
bon je seche, et j'est pas envie de m'éclater les yeux (text gris clair sur blanc)
du coup y a t-il possibiliter d'avoir un executable (linux de préférence ça mévite le reboot) et/ou les sources en archive ? j'aviserais en conséquence
où le plus simple c'est de repartir de 0 vue ce qui est fait ... c'est pas plus de 2h de travail :]
ps: (suposition) je ne connais pas RakNet j'ai codé ma propre lib réseaux, mais n'y a t'il pas une option pour le lag compasation ? pourais t-il que cela vienne de la ? ( ex: joueur1 animation, joueur1 envoie donnée, joueur1, reception donnée, joueur1 animation ...) ...
ps2: non pas de "pre render" pour les animations
Hors ligne
Pas de soucis,
merci beaucoup pour ton aide en tous cas c'est vraiment
sympa de ta part de prendre de ton temps pour m'aider.
Alors en ce qui concerne la variable facing c'est un simple core::vector3df .
Honnêtement pour ce qui est du lag compasation je ne sais pas vraiment en quoi ça consiste,
tu vas peut être penser que je suis maso, mais j'ai choisi de me charger de la partie réseau
dans le projet car c'est le domaine où je suis le plus mauvais ^^" .
En revanche, je peux t'assurer que ce soucis ne vient pas du réseau étant donné qu'il était déjà présent
avant que je commence à implémenter la partie réseau.
Après pour les deux heures de travail, effectivement je suppose que tu dois avoir une bien meilleure connaissance
d'Irrlicht que moi, mais en ce qui me concerne je suis loin de pouvoir tout refaire en si peu de temps xD .
Pour les sources pas de soucis, par contre je tiens à te prévenir que le réseau n'est pas encore achevé donc il reste
le soucis de la suppression de la scene si le joueur se deco afin de la recréer si il se reconnecte.
Mais en tous cas les voilà : http://www.megaupload.com/?d=QXH47ZVW
(Je ne sais pas si tu code sous visual 2010 mais pour lancer l'executable qui est dans le dossier "projetIUT/debug", il faut
en faire un copier coller dans "projetIUT/projetIUT").
Dernière modification par Oelth (02-06-2011 23:02:29)
Hors ligne
non j'utilise codeblocks, pour ce qui est du copier/coller de l'executable, c'est toi qui a mal configuré visual
bref, désolé de te dérange une second fois, peut tu hébergeur sur mediafire ?
megaupload retourne "The file you are trying to access is temporarily unavailable. Please try again later." depuis 1h...
Hors ligne
Ok pas de problèmes xD .
D'accord pour visual, je ne savais pas du tout, à vrai dire
c'est mon binôme qui à choisi visual, pour ma part je suis
un habitué de netbeans :p .
Pour mediafire fire, si je n'ai fait aucune erreur ça devrait être bon,
voilà le lien : http://www.mediafire.com/?6fdwmc7ow6685dn
PS : si ça plante en quittant le mode multijoueurs ne t'inquiète pas, hier j'ai
du partir un peu précipitamment de chez moi et je n'ai pas eu le temps de le
faire (je m'y penche là).
Dernière modification par Oelth (03-06-2011 11:57:21)
Hors ligne
Pourquoi les gens utilise les outils windows ? y a tellement mieux en libre ... bref
Le temps que visual ce dl, y en a pour la journée, je vais essayer de porter ton projet sur codeblocks en att
par contre essaye de structuré t'est projet, par ce que la je doit quasiment tout reconfiguré, les lib doivent être "pack-té" avec le projet, c'est moins chiant a transporter
bonne journée
edit: ben ça commence mal, ça crash littéralement...
edit2: wow tu appelle un destructeur comme ça toi ? modeMulti->~Multijoueurs(); outch !
edit3: ben alors je sais pas comment tu a fait mais même avec un main vide y a tout qui crash...
Dernière modification par Magun (04-06-2011 11:45:02)
Hors ligne
Hmm,
cela vient peut être de racknet,
en fait dans les dépendances supplémentaires de l’éditeur de lien
il faut ajouter ws2_32.lib, de plus le jeu de caractère doit être configuré
sur "non défini" et bien entendu ajouter le répertoire include de racknet au projet.
En espérant que le soucis vienne de là ^^".
Pour le destructeur je rejoins tout à fait ton avis, c'est dégueulasse ce que j'ai fait,
mais un truc m'étonne c'est que si je place un delete(modeMulti) le programme crash (ou
alors je n'ai pas saisie une subtilité algorithmique dans la chose).
En revanche je serais preneur sur l'explication de la structuration des projets,
parce que quand j'ai demandé à mon "tuteur de projet" (qui est un bien grand mot
étant donné qu'on ne l'a vu que deux fois) comment ça se passait pour rendre le logiciel
portable sur n'importe quelle machine (j'entend par là pouvoir lancer mon executable sur
tout pc tournant sous window) , celui ci m'a dit que ce n’était pas important
et que de toutes façons la démonstration se ferait sur ma machine à partir de l'IDE voir
même que je ne montrerais qu'une vidéo de présentation.
Encore une fois je te remercie pour ta patience et ton aide,
crois bien que je me rend compte que mon code tiens plus
de l'usine à gaz que du code pro, mais j'en viens à changer des
éléments (appel de fonction ou encore le magnifique destructeur
à la mord moi le noeud que tu as vu dans le main)
au hasard en croisant les doigts pour que ça tourne T_T .
Enfin bref, sincerement c'est pas la motivation qui me manque,
je trouve ça terrible la conception d'un jeu vidéo, mais se sont
plutot mes compétences actuelles et la documentation
qui je pense me font défaut.
Hors ligne
Non le projet ce compile, c'est bien l'exécutable qui crash.
je pensse oui que tu n'a pas comprit le rolle du destructeur, il permait de désalouer ce qui aurait pue être allouer dans ton object
sont apelle ce fait via delete ( delete ton_pointer ), sinon tu ne désaloue pas ton object, et est interprêter comme une simple fonction.
pour ce qui est de la structuration il te faut un dossier library par exemple ou tu stocke t'est include et t'est .lib/.a/.dylib/...
et un dossier projet où tu y stocke ... t'est projet.
ex:
-library
-include
-lib
-win
-linux32
-linux64
-projet
-dut
-server
-bin
-src
-game
-bin
-src
-other project
pourquoi ? d'une par pour pouvoir sauvegarder t'est donner aisément, sans pour autemps devoir installer 50 logicielle/lib si tu doit par exemple formater ( ce qui peut être soulant s'il on a pas noter les dépendances )
sa te permait de pouvoir porter t'est projet plus simplement entre divers os, voir divert pc s'il y a une équipe après, et d'obtenir une aide plus simplement ( si ton codes est ouvert biensur )
c'est nettemnt plus simple pour une personne externe si tout le projet qu'il reçois est déjà prêt a compiler
alors au sujet de ton "contremaitre", sache qu'il est dans le faux, certe même si sa ne vous cert pas directement pour ce projet si, ce sont des abitudes a prendre
et comme je connais très bien le niveaux des profésseur qui enseigne leur matière, et toi aussi je supose ( sauf très rare exeption ) il ne sont pas capable de comprendre ce qu'il enseigne ... bref
personellement je t'aurient donc a avoir un projet clean, ainssi qu'une bonne structuration interne au niveaux "séquentiel", bien fragmenter ce qui est nécéssaire dans des class respectivement dans des fichier qui leur sont propre, l'effect engendre n'en seras que positif pour ton évaluations. étant donner que ton projet doit être présanté, prend 1 ou 2 min pour présenter cette dite structuration, histoire de ....
ps1: dsl pour l'attente, je ne savais trop comment m'exprimmer :]
ps2: pensse a relir t'est cours tu as quelque l'acune mais qui ne sont pas des moindres, à la place d'un correcteur certaine faute comme ton apelle du destructeur reflète d'un niveaux de débutant
ps3: j'espère que je ne suit pas trop dure quand je m'exprime, ont me le reproche souvent
bref bonne soiré
Hors ligne
Hello,
merci encore une fois pour tes explications.
Ne t'inquiète pas pour le temps de réponse,
comme je te l'ai dit c'est déjà super sympa de te pencher sur mon cas.
En effet pour mon code je suis tout à fait d'accord avec toi,
j'ai fait des trucs vraiment pas propre voir contraire aux règles de bonne
programmation, mais rassure toi en règle general je ne commet pas ce genre
d'erreurs. Enfin comme tu dis, relire un peu mes cours ne me fera
jamais de mal de toutes façons x) .
En tous cas ça me rassure de voir que toi aussi les enseignements en DUT te choquent,
je ne sais pas si c'est une impression mais en BTS les profs me paraissaient plus
convaincant dans leurs explications (et plus capables par la même occasion).
Vu le peu de temps qu'il me reste (je dois avoir rendu le rapport et les codes sources vendredi midi)
je vais plutôt me consacrer à bien remettre ce code au propre et remplacer le destructeur par un delete :p.
En tous cas merci beaucoup pour ton soutient et tout tes conseils .
Je tacherais de les appliquer à la lettre dans mes projets futurs !
Hors ligne
Options | Liens officiels | Caractéristiques | Statistiques | Communauté |
---|---|---|---|---|
Corrections |
|
xhtml 1.0 css 2.1 Propulsé par FluxBB Traduit par FluxBB.fr |
882 membres 1429 sujets 11119 messages |
Dernier membre inscrit: LiseBuisson96 33 invités en ligne Aucun membre connecté RSS Feed |