// Général #include #include // Locaux #include "Serveur.h" #include "description.h" #include "acteur.h" #include "AABBSightQuery.h" using namespace std; int main() { /// Introduction cout << "Lancement de Tank Réseau." << endl; /// Démarrage Box2D // Signalement cout << "Chargement du monde physique." << endl; // Monde Box2D b2Vec2 gravity(0.0f, 0.0f); b2World world( gravity ); b2Vec2 dir; // Pramètres de simulation float timeStep = 1.0f / 60.0f; int32 velocityIterations = 8; int32 positionIterations = 3; /// Création des tanks // Signalement cout << "Création des tanks." << endl ; // Définitions b2BodyDef bodyDef; bodyDef.type = b2_dynamicBody; bodyDef.linearDamping = 10.0f ; b2PolygonShape dynamicBox; b2FixtureDef fixtureDef; fixtureDef.shape = &dynamicBox; // Création des paramètres dynamicBox.SetAsBox( TANK_WIDTH / 2.0f , TANK_WIDTH / 2.0f ); fixtureDef.density = 1.0f; fixtureDef.friction = 0.3f; fixtureDef.restitution = 0.05f; b2Body* tank[2]; // Tank A bodyDef.position.Set( 7.0f, 5.5f ); bodyDef.userData.pointer = (uintptr_t) new Acteur({TANK_A}); tank[ TANK_A ] = world.CreateBody( &bodyDef ); tank[ TANK_A ]->CreateFixture( &fixtureDef ); // Tank B bodyDef.position.Set( 7.0f, 3.5f ); bodyDef.userData.pointer = (uintptr_t) new Acteur({TANK_B}); tank[ TANK_B ] = world.CreateBody( &bodyDef ); tank[ TANK_B ]->CreateFixture( &fixtureDef ); // Requeteur AABBSightQuery myQuerer; b2AABB aabb; /// Initialisation du réseau // Signalement cout << "Création du serveur." << endl ; // Création du serveur Serveur monServeur( 25565, 2 ); // Mise en branle if ( !monServeur.rendreUtilisable() ) { cout << "Plantage du serveur !" << endl ; return 1; } // Annonce des identifiants unsigned int id, taille; id = TANK_A ; monServeur.envoyer( &id, id, sizeof(id) ); id = TANK_B ; monServeur.envoyer( &id, id, sizeof(id) ); /// Procédure // Signalement cout << "Début de la boucle infinie." << endl ; // Booléen d'arrêt bool stop( false ); // Données de communication Cmd dataCmd; //vector dataEntity; // Boucle while ( !stop ) { // Recevoir les commandes de déplacement for ( id = 0; id < 2; id ++ ) { monServeur.recevoir( &dataCmd, id, sizeof( Cmd ) ); dir.Set( dataCmd.vx, dataCmd.vy ); tank[id]->ApplyLinearImpulseToCenter( dir, true ); } // Calculs physiques world.Step( timeStep, velocityIterations, positionIterations ); // Requêtes AABB for ( id = 0; id < 2 ; id ++ ) { myQuerer.clearData(); dir = tank[id]->GetPosition(); aabb.lowerBound.Set( dir.x - AABB_WIDTH / 2, dir.y - AABB_WIDTH / 32 * 9 ); aabb.upperBound.Set( dir.x + AABB_WIDTH / 2, dir.y + AABB_WIDTH / 32 * 9 ); world.QueryAABB( &myQuerer, aabb ); taille = myQuerer.getSize(); monServeur.envoyer( &taille, id, sizeof( unsigned int ) ); monServeur.envoyer( myQuerer.getData(), id, myQuerer.getSize() ); } /*dataEntity.clear(); for ( id = 0; id < 2 ; id ++ ) { dir = tank[id]->GetPosition(); dataEntity.push_back({ dir.x, dir.y, DET_TANK, id }); } for ( id = 0; id < 2 ; id ++ ) { taille = dataEntity.size(); monServeur.envoyer( &taille, id, sizeof( unsigned int ) ); monServeur.envoyer( dataEntity.data(), id, taille * sizeof( Entity ) ); }*/ } return 0; }