#0 

24-04-2016 20:28:11

Dragonblood
Abonné
Date d'inscription: 20-11-2008
Messages: 110

Bonjour,

Je crée un jeu sous Ogre (après être passé par irrlicht). Il fonctionne en solo (sans être fini) mais j'aimerais le rendre multijoueur. Le problème c'est qu'il est très dur de trouver de la doc sur Raknet et sur la programmation de jeu réseau en général. J'ai commencé à créer mon serveur et mon client mais j'aimerais pouvoir envoyer et recevoir des données de type objet. Est ce possible ? Si oui comment faire ?

merci

Hors ligne


#1 

30-04-2016 12:24:08

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

et bien tu peut envoyer des structures a condition qu'elle ne possède pas de pointeur vers d'autres objets
reste alors le probleme little/big endian, mais clairement en c++ tu ne pourras pas faire mieux, à part serialiser tes objets

perso j'ai fait mon protocol reseau chaque trame est composer d'un header comportant des opcodes pour différentes commandes/sous-commande/...
le reste c'est grossomodo des données brutes +/- sérialisé

Code c++ :


                    global[0] = a;

                    for(irr::u8 i = 0; i<12; ++i) global[ 1+i] = name[i];
                    for(irr::u8 i = 0; i<12; ++i) global[13+i] = owner[i];

                    packUnsignedInt(id, global, 25);
                    packUnsignedShort(group, global, 29);
                    packUnsignedShort(guild, global, 31);

                    packUnsignedChar(lvl, global, 33);
                    packUnsignedChar(race_id, global, 34);
                    packUnsignedChar(class_id, global, 35);
                    packUnsignedChar(zone_id, global, 36);

                    packUnsignedChar(FOR, global, 37);
                    packUnsignedChar(AGI, global, 38);
                    packUnsignedChar(VIT, global, 39);
                    packUnsignedChar(INT, global, 40);
                    packUnsignedChar(DEX, global, 41);

                    packFloat(pos.X, global, 42);
                    packFloat(pos.Y, global, 46);
                    packFloat(pos.Z, global, 50);
                    packFloat(rot.X, global, 54);
                    packFloat(rot.Y, global, 58);
                    packFloat(rot.Z, global, 62);



et pour la reception, j'ai simplement un tableau de "functor", ça peut être des objets ou des pointeur sur fonctions

Code c++ :


        if(recv[0] >= 0 && recv[0] < network::CONTEXT_COUNT)
             func[recv[0]]->manage(recv);
        else std::cout << "bad call of index" << (int)recv[0] << std::endl;



ça fait le cafée rapidement et facilement maintenable
juste la sérialisation/désérialisation à faire à la main pour chaque objet
et encore, je pensse qu'avec de bon template on peut abstraire cette étape

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
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
27 invités en ligne
Aucun membre connecté
RSS Feed