Advertisement
Guest User

Pong Network

a guest
Oct 20th, 2013
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <GL/gl.h>
  3. #include <onidev/io.h>
  4. #include <onidev/view.h>
  5. #include <onidev/texture.h>
  6. #include <onidev/object.h>
  7. #include <onidev/mask/rectangle.h>
  8. #include <onidev/math.h>
  9. #include <cmath>
  10.  
  11. #include <SFML/System.hpp>
  12. #include <SFML/Network.hpp>
  13.  
  14. sf::SocketTCP mainSocket;
  15. sf::Mutex mutex;
  16.  
  17. enum {
  18.     obj_none = -1,
  19.     obj_player1,
  20.     obj_player2,
  21.     obj_ball,
  22.     obj_number
  23. };
  24.  
  25. class Player : public Object
  26. {
  27.     protected:
  28.     int speed;
  29.    
  30.     public:
  31.     static RectangleShape rect;
  32.    
  33.     Player(double x, double y, int obj) : Object(x, y - rect.height()/2, obj, &rect), speed(12) {}
  34.    
  35.     void draw() {
  36.         rect.draw(x, y);
  37.     }
  38. };
  39.  
  40. RectangleShape Player::rect(0, 0, 16, 128);
  41.  
  42. // Server
  43. class Player1 : public Player
  44. {
  45.     public:
  46.     Player1(double x, double y) : Player(x, y, obj_player1) {}
  47.    
  48.     void step()
  49.     {
  50.         if(keyCheck(vk_up))
  51.         {
  52.             y -= speed;
  53.         }
  54.         if(keyCheck(vk_down))
  55.         {
  56.             y += speed;
  57.         }
  58.     }
  59. };
  60.  
  61. // Client
  62. class Player2 : public Player
  63. {
  64.     public:
  65.     Player2(double x, double y) : Player(x, y, obj_player2) {}
  66. };
  67.  
  68. class Ball : public Object
  69. {
  70.     bool isServer;
  71.     float speed;
  72.     float angle;
  73.     double xstart, ystart;
  74.    
  75.     public:
  76.     static RectangleShape rect;
  77.    
  78.     Ball(double x, double y, bool server)
  79.     : Object(x, y, obj_ball, &rect), isServer(server), speed(0), angle(0), xstart(x), ystart(y)
  80.     {
  81.         if(isServer)
  82.         {
  83.             speed = 4.0;
  84.             angle = 180-45;
  85.         }
  86.     }
  87.    
  88.     void reset(int dir)
  89.     {
  90.         x = xstart;
  91.         y = ystart;
  92.        
  93.         speed = 4.0;
  94.         if(dir == -1)
  95.             angle = 180-45;
  96.         else if(dir == 1)
  97.             angle = 45;
  98.     }
  99.    
  100.     void reverseAngleH()
  101.     {
  102.         double xx = lendirx(1, angle);
  103.         double yy = lendiry(1, angle);
  104.         angle = atan2(-yy, -xx) * 180.0/M_PI;
  105.     }
  106.    
  107.     void reverseAngleV()
  108.     {
  109.         double xx = lendirx(1, angle);
  110.         double yy = lendiry(1, angle);
  111.         angle = atan2(yy, xx) * 180.0/M_PI;
  112.     }
  113.    
  114.     void moveH(int vx)
  115.     {
  116.         if(vx > 0) {
  117.             for(int i=0; i<vx; i++)
  118.             {
  119.                 if(!placeMeeting(x+1, y, obj_player2))
  120.                     x++;
  121.                 else
  122.                 {
  123.                     reverseAngleH();
  124.                     break;
  125.                 }
  126.             }
  127.         }
  128.         else if(vx < 0) {
  129.             for(int i=0; i<-vx; i++)
  130.             {
  131.                 if(!placeMeeting(x-1, y, obj_player1))
  132.                     x--;
  133.                 else
  134.                 {
  135.                     reverseAngleH();
  136.                     break;
  137.                 }
  138.             }
  139.         }
  140.     }
  141.    
  142.     void moveV(int vy)
  143.     {
  144.         if(vy > 0) {
  145.             for(int i=0; i<vy; i++)
  146.             {
  147.                 if(y < 480-rect.height() && !placeMeeting(x, y+1, obj_player2))
  148.                     y++;
  149.                 else
  150.                 {
  151.                     reverseAngleV();
  152.                     break;
  153.                 }
  154.             }
  155.         }
  156.         else if(vy < 0) {
  157.             for(int i=0; i<-vy; i++)
  158.             {
  159.                 if(y >= 0 && !placeMeeting(x, y-1, obj_player2))
  160.                     y--;
  161.                 else
  162.                 {
  163.                     reverseAngleV();
  164.                     break;
  165.                 }
  166.             }
  167.         }
  168.     }
  169.    
  170.     void step()
  171.     {
  172.         if(isServer)
  173.         {
  174.             static double addx = 0;
  175.             static double addy = 0;
  176.             double movex = lendirx(speed, angle);
  177.             double movey = lendiry(speed, angle);
  178.             int vx = movex;
  179.             int vy = movey;
  180.             addx += movex - vx;
  181.             addy += movey - vy;
  182.            
  183.             while(addx > 1) {
  184.                 vx++;
  185.                 addx--;
  186.             }
  187.             while(addx < -1) {
  188.                 vx--;
  189.                 addx++;
  190.             }
  191.             while(addy > 1) {
  192.                 vy++;
  193.                 addy--;
  194.             }
  195.             while(addy < -1) {
  196.                 vy--;
  197.                 addy++;
  198.             }
  199.            
  200.             moveH(vx);
  201.             moveV(vy);
  202.            
  203.             x += 0.01;
  204.         }
  205.     }
  206.    
  207.     // update clien ball
  208.     void updatePosition(double x, double y)
  209.     {
  210.         if(isServer) return;
  211.        
  212.         this->x = x;
  213.         this->y = y;
  214.     }
  215.    
  216.     void draw() {
  217.         rect.draw(x, y);
  218.     }
  219. };
  220. RectangleShape Ball::rect(0, 0, 16, 16);
  221.  
  222.  
  223. Ball * ball = 0;
  224. Player1 * player = 0;
  225. Player2 * player2 = 0;
  226.  
  227. void receiveServerInfos(void *)
  228. {
  229.     printf("Thread de reception des donnees du client en cours...\n");
  230.    
  231.     sf::SocketTCP listener;
  232.     if(!listener.Listen(7777))
  233.     {
  234.         printf("Impossible d'ouvrir le port 7777.\n");
  235.     }
  236.     else
  237.     {
  238.         sf::IPAddress clientAdress;
  239.        
  240.         // Attend les connections sur le port 7777
  241.         printf("En attente d'un joueur...");
  242.         if(listener.Accept(mainSocket, &clientAdress) != sf::Socket::Done)
  243.         {
  244.             printf("Aucune connection sur le port 7777.\n");
  245.             return;
  246.         }
  247.     }
  248.     printf("Un joueur est connecte.\n");
  249.    
  250.     while(true)
  251.     {
  252.         sf::Lock lock(mutex);
  253.         sf::Packet packet;
  254.        
  255.         if(mainSocket.Receive(packet) != sf::Socket::Done)
  256.         {
  257.             printf("Le joueur s'est deconnecte.\n");
  258.             break;
  259.         }
  260.         else
  261.         {
  262.             packet >> player2->y;
  263.         }
  264.     }
  265. }
  266.  
  267. void receiveClienInfos(void *)
  268. {
  269.     printf("Thread de reception des donnees du serveur en cours...\n");
  270.    
  271.     if(mainSocket.Connect(7777, sf::IPAddress::LocalHost) != sf::Socket::Done)
  272.     {
  273.         printf("Impossible de se connecter au serveur.\n");
  274.         return;
  275.     }
  276.     printf("Vous etes connecte au serveur.\n");
  277.     //return;
  278.    
  279.     while(true)
  280.     {
  281.         sf::Lock lock(mutex);
  282.         sf::Packet packet;
  283.        
  284.         if(mainSocket.Receive(packet) != sf::Socket::Done)
  285.         {
  286.             printf("Erreur de reception du socket...\n");
  287.             break;
  288.         }
  289.         else
  290.         {
  291.             packet >> ball->x >> ball->y >> player2->y;
  292.         }
  293.     }
  294. }
  295.  
  296. // envoie les données de jeu au client
  297. void sendServerInfos()
  298. {
  299.     sf::Packet send;
  300.     send << ball->x << ball->y << player->y;
  301.     mainSocket.Send(send);
  302. }
  303.  
  304. // envoie les données de jeu du client vers le serveur
  305. void sendClienInfos()
  306. {
  307.     sf::Packet send;
  308.     send << player->y;
  309.     mainSocket.Send(send);
  310. }
  311.  
  312. int main()
  313. {
  314.     int wid=640, hei=480;
  315.     windowCreate(wid, hei);
  316.  
  317.     setSynchronization(true);
  318.     //initShaders();
  319.  
  320.     glEnable(GL_TEXTURE_2D);
  321.     glEnable(GL_BLEND);
  322.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  323.     glClearColor(0, 0, 0, 1);
  324.    
  325.     setView(0, 0, 0, wid, hei);
  326.     setViewport(0, 0, 0, wid, hei);
  327.    
  328.     glColor3ub(255,255,255);
  329.    
  330.     initializeObjectEngine(obj_number);
  331.    
  332.     int server = true;
  333.    
  334.     printf("Choix du mode: 0=client, 1=server\n");
  335.     scanf("%d", &server);
  336.     if(server != 0 && server != 1)
  337.         server = false;
  338.    
  339.     // Creation du serveur
  340.     sf::Thread * thread = 0;
  341.    
  342.     if(server)
  343.     {
  344.         player = new Player1(16, 480/2);
  345.         player2 = new Player2(640 - 32, 480/2);
  346.         ball = new Ball(640/2, 480/2, server);
  347.        
  348.         thread = new sf::Thread(&receiveServerInfos);
  349.         thread->Launch();
  350.     }
  351.     else // client
  352.     {
  353.         player = new Player1(640 - 32, 480/2);
  354.         player2 = new Player2(16, 480/2);
  355.         ball = new Ball(640/2, 480/2, server);
  356.        
  357.         thread = new sf::Thread(&receiveClienInfos);
  358.         thread->Launch();
  359.     }
  360.    
  361.     int score1 = 0, score2 = 0;
  362.    
  363.     while(windowIsOpen())
  364.     {
  365.         sf::Lock lock(mutex);
  366.        
  367.         ioHandle();
  368.  
  369.         if(keyCheck(vk_escape))
  370.             break;
  371.  
  372.         glClear(GL_COLOR_BUFFER_BIT);
  373.        
  374.         viewUpdate(0);
  375.         gameStep();
  376.        
  377.         // Game update
  378.         if(server)
  379.         {
  380.             if(ball->x < -16)
  381.             {
  382.                 score2++;
  383.                 ball->reset(1);
  384.             }
  385.             else if(ball->x > 640)
  386.             {
  387.                 score1++;
  388.                 ball->reset(-1);
  389.             }
  390.             sendServerInfos();
  391.         }
  392.         else
  393.         {
  394.             sendClienInfos();
  395.         }
  396.        
  397.         screenRefresh();
  398.     }
  399.    
  400.     destroyAll();
  401.     terminateObjectEngine();
  402.    
  403.     if(thread)
  404.     {
  405.         delete thread;
  406.     }
  407.  
  408.     return 0;
  409. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement