#0 

30-05-2011 16:17:41

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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

Code:

#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)

Code:

#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

Code:

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

Hors ligne


#1 

30-05-2011 17:58:17

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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 wink

ps: étant pour un DUT code en bon Français ou en Anglais mais pas les deux a la fois...
bonne soiré !

Hors ligne


#2 

31-05-2011 08:35:16

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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


#3 

02-06-2011 15:44:19

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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


#4 

02-06-2011 21:31:35

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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


#5 

02-06-2011 23:01:26

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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


#6 

03-06-2011 11:22:46

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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

Hors ligne


#7 

03-06-2011 11:57:04

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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


#8 

04-06-2011 11:23:08

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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


#9 

04-06-2011 19:12:57

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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


#10 

06-06-2011 20:52:00

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

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 wink

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 smile

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 wink

bref bonne soiré

Hors ligne


#11 

06-06-2011 23:24:43

Oelth
Petit nouveau
Date d'inscription: 05-05-2011
Messages: 8

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 smile .
Je tacherais de les appliquer à la lettre dans mes projets futurs !

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
83 invités en ligne
Aucun membre connecté
RSS Feed