#1 

24-04-2016 18:28:11

Dragonblood
Membres
Avatar de Dragonblood
Date d'inscription:
Messages: 110
IP: 86.245.57.54
Courriel

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


#2 

30-04-2016 10:24:08

Magun
Administrateurs
Avatar de Magun
Date d'inscription:
Messages: 910
IP: 37.59.116.104
Courriel  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é
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
570 invités en ligne
membre en ligne: -
RSS Feed