Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.84 KB | None | 0 0
  1. /************************************************************
  2. Interakcja:
  3. Wysyłanie, odbiór komunikatów, interakcja z innymi
  4. uczestnikami WZR, sterowanie wirtualnymi obiektami  
  5. *************************************************************/
  6.  
  7. #include <windows.h>
  8. #include <time.h>
  9. #include <stdio.h>  
  10. #include "interakcja.h"
  11. #include "obiekty.h"
  12. #include "siec.h"
  13. #include "grafika.h"
  14.  
  15. char ip[] = "192.168.1.142";
  16.  
  17. FILE *f = fopen("WZR_log.txt","w");    // plik do zapisu informacji testowych
  18.  
  19.  
  20. ObiektRuchomy *pMojObiekt;          // obiekt przypisany do tej aplikacji
  21. Teren teren;
  22. int iLiczbaCudzychOb = 0;
  23. ObiektRuchomy *CudzeObiekty[2000];  // obiekty z innych aplikacji lub inne obiekty niz pMojObiekt
  24. int IndeksyOb[4000];                // tablica indeksow innych obiektow ulatwiajaca wyszukiwanie
  25.  
  26. float fDt;                          // sredni czas pomiedzy dwoma kolejnymi cyklami symulacji i wyswietlania
  27. long czas_cyklu_WS,licznik_sym;     // zmienne pomocnicze potrzebne do obliczania fDt
  28. long czas_start = clock();          // czas uruchomienia aplikacji
  29.  
  30. unicast_net *multi_reciv;         // wsk do obiektu zajmujacego sie odbiorem komunikatow
  31. unicast_net *multi_send;          //   -||-  wysylaniem komunikatow
  32.  
  33. HANDLE threadReciv;                 // uchwyt wątku odbioru komunikatów
  34. extern HWND okno;      
  35. int SHIFTwcisniety = 0;
  36. bool czy_rysowac_ID = 1;            // czy rysowac nr ID przy każdym obiekcie
  37. bool sterowanie_myszkowe = 0;       // sterowanie za pomocą klawisza myszki
  38. int kursor_x = 0, kursor_y = 0;     // położenie kursora myszy
  39.  
  40. // Parametry widoku:
  41. Wektor3 kierunek_kamery_1 = Wektor3(11,-3,-14),   // kierunek patrzenia
  42. pol_kamery_1 = Wektor3(-34,6,10),         // położenie kamery
  43. pion_kamery_1 = Wektor3(0,1,0),           // kierunek pionu kamery        
  44. kierunek_kamery_2 = Wektor3(0,-1,0.02),   // to samo dla widoku z góry
  45. pol_kamery_2 = Wektor3(0,90,0),
  46. pion_kamery_2 = Wektor3(0,0,-1),
  47. kierunek_kamery = kierunek_kamery_1, pol_kamery = pol_kamery_1, pion_kamery = pion_kamery_1;
  48. bool sledzenie = 1;                             // tryb śledzenia obiektu przez kamerę
  49. bool widok_z_gory = 0;                          // tryb widoku z góry
  50. float oddalenie = 27.0;                          // oddalenie widoku z kamery
  51. float kat_kam_z = 0;                            // obrót kamery góra-dół
  52. float oddalenie_1 = oddalenie, kat_kam_z_1 = kat_kam_z, oddalenie_2 = oddalenie, kat_kam_z_2 = kat_kam_z,
  53. oddalenie_3 = oddalenie, kat_kam_z_3 = kat_kam_z;
  54.  
  55.  
  56. enum typy_ramek{STAN_OBIEKTU};
  57.  
  58.  
  59. struct Ramka                                    // główna struktura służąca do przesyłania informacji
  60. {
  61.   int typ;
  62.   long moment_wyslania;
  63.   StanObiektu stan;                            
  64. };
  65.  
  66.  
  67. //******************************************
  68. // Funkcja obsługi wątku odbioru komunikatów
  69. DWORD WINAPI WatekOdbioru(void *ptr)
  70. {
  71.     unicast_net *pmt_net = (unicast_net*)ptr;                // wskaźnik do obiektu klasy multicast_net
  72.   int rozmiar;                                               // liczba bajtów ramki otrzymanej z sieci
  73.   Ramka ramka;
  74.   StanObiektu stan;
  75.  
  76.   while(1)
  77.   {
  78.       unsigned long ip;
  79.  
  80.       rozmiar = pmt_net->reciv((char*)&ramka, &ip, sizeof(Ramka));   // oczekiwanie na nadejście ramki - funkcja samoblokująca się
  81.     switch (ramka.typ)
  82.         {
  83.             case STAN_OBIEKTU:
  84.             {
  85.         stan = ramka.stan;
  86.  
  87.         if (stan.iID != pMojObiekt->iID)                     // jeśli to nie mój obiekt
  88.         {
  89.           if (IndeksyOb[stan.iID] == -1)                     // nie ma jeszcze takiego obiektu w tablicy -> trzeba go stworzyć
  90.           {
  91.             CudzeObiekty[iLiczbaCudzychOb] = new ObiektRuchomy(&teren);  
  92.             IndeksyOb[stan.iID] = iLiczbaCudzychOb;          // wpis do tablicy indeksowanej numerami ID
  93.                                                              // ułatwia wyszukiwanie, alternatywą może być tabl. rozproszona                                                                                              
  94.             iLiczbaCudzychOb++;    
  95.           }                                                                    
  96.           CudzeObiekty[IndeksyOb[stan.iID]]->ZmienStan(stan);   // zmiana stanu obiektu obcego         
  97.         }
  98.         break;
  99.       } // case STAN_OBIEKTU
  100.  
  101.     } // switch
  102.   }  // while(1)
  103.   return 1;
  104. }
  105.  
  106. // *****************************************************************
  107. // ****    Wszystko co trzeba zrobić podczas uruchamiania aplikacji
  108. // ****    poza grafiką  
  109. void PoczatekInterakcji()
  110. {
  111.   DWORD dwThreadId;
  112.  
  113.   pMojObiekt = new ObiektRuchomy(&teren);    // tworzenie wlasnego obiektu
  114.  
  115.   for (long i=0;i<4000;i++)            // inicjacja indeksow obcych obiektow
  116.     IndeksyOb[i] = -1;
  117.  
  118.   czas_cyklu_WS = clock();             // pomiar aktualnego czasu
  119.  
  120.   // obiekty sieciowe typu multicast (z podaniem adresu WZR oraz numeru portu)
  121.   multi_reciv = new unicast_net(10001);      // obiekt do odbioru ramek sieciowych
  122.   multi_send = new unicast_net(10001);       // obiekt do wysyłania ramek
  123.  
  124.  
  125.   // uruchomienie watku obslugujacego odbior komunikatow
  126.   threadReciv = CreateThread(
  127.       NULL,                        // no security attributes
  128.       0,                           // use default stack size
  129.       WatekOdbioru,                // thread function
  130.       (void *)multi_reciv,               // argument to thread function
  131.       0,                           // use default creation flags
  132.       &dwThreadId);                // returns the thread identifier
  133.  
  134. }
  135.  
  136.  
  137. // *****************************************************************
  138. // ****    Wszystko co trzeba zrobić w każdym cyklu działania
  139. // ****    aplikacji poza grafiką
  140. void Cykl_WS()
  141. {
  142.   licznik_sym++;  
  143.  
  144.   // obliczenie czasu fDt pomiedzy dwoma kolejnymi cyklami
  145.   if (licznik_sym % 50 == 0)          // jeśli licznik cykli przekroczył pewną wartość, to
  146.   {                                   // należy na nowo obliczyć średni czas cyklu fDt
  147.     char text[200];
  148.     long czas_pop = czas_cyklu_WS;
  149.     czas_cyklu_WS = clock();
  150.     float fFps = (50*CLOCKS_PER_SEC)/(float)(czas_cyklu_WS-czas_pop);
  151.     if (fFps!=0) fDt=1.0/fFps; else fDt=1;
  152.     sprintf(text,"WZR-lab 2017/18 temat 1, wersja c (%0.0f fps  %0.2fms)  ",fFps,1000.0/fFps);
  153.     SetWindowText(okno,text); // wyświetlenie aktualnej ilości klatek/s w pasku okna         
  154.   }  
  155.  
  156.  
  157.   pMojObiekt->Symulacja(fDt);                    // symulacja obiektu własnego
  158.  
  159.   Ramka ramka;                          
  160.   ramka.typ = STAN_OBIEKTU;
  161.   ramka.stan = pMojObiekt->Stan();               // stan własnego obiektu
  162.  
  163.  
  164.   // wysłanie komunikatu o stanie obiektu przypisanego do aplikacji (pMojObiekt):    
  165.   multi_send->send((char*)&ramka, ip,sizeof(Ramka));
  166. }
  167.  
  168. // *****************************************************************
  169. // ****    Wszystko co trzeba zrobić podczas zamykania aplikacji
  170. // ****    poza grafiką
  171. void ZakonczenieInterakcji()
  172. {
  173.   fprintf(f,"Interakcja została zakończona\n");
  174.   fclose(f);
  175. }
  176.  
  177.  
  178. // ************************************************************************
  179. // ****    Obsługa klawiszy służących do sterowania obiektami lub
  180. // ****    widokami
  181. void KlawiszologiaSterowania(UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
  182. {
  183.  
  184.   switch (kod_meldunku)
  185.   {
  186.  
  187.   case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  188.     {
  189.       int x = LOWORD(lParam);
  190.       int y = HIWORD(lParam);
  191.       if (sterowanie_myszkowe)
  192.         pMojObiekt->F = 40000.0;        // siła pchająca do przodu [N]
  193.       break;
  194.     }
  195.   case WM_RBUTTONDOWN: //reakcja na prawy przycisk myszki
  196.     {
  197.       int x = LOWORD(lParam);
  198.       int y = HIWORD(lParam);
  199.       if (sterowanie_myszkowe)
  200.         pMojObiekt->F = -20000.0;        // siła pchająca do tylu
  201.      
  202.       break;
  203.     }
  204.   case WM_MBUTTONDOWN: //reakcja na środkowy przycisk myszki : uaktywnienie/dezaktywacja sterwania myszkowego
  205.     {
  206.       sterowanie_myszkowe = 1 - sterowanie_myszkowe;
  207.       kursor_x = LOWORD(lParam);
  208.       kursor_y = HIWORD(lParam);
  209.       break;
  210.     }
  211.   case WM_LBUTTONUP: //reakcja na puszczenie lewego przycisku myszki
  212.     {  
  213.       if (sterowanie_myszkowe)
  214.         pMojObiekt->F = 0.0;        // siła pchająca do przodu
  215.       break;
  216.     }
  217.   case WM_RBUTTONUP: //reakcja na puszczenie lewy przycisk myszki
  218.     {
  219.       if (sterowanie_myszkowe)
  220.         pMojObiekt->F = 0.0;        // siła pchająca do przodu
  221.       break;
  222.     }
  223.   case WM_MOUSEMOVE:
  224.     {
  225.       int x = LOWORD(lParam);
  226.       int y = HIWORD(lParam);
  227.       if (sterowanie_myszkowe)
  228.       {
  229.         float kat_skretu = (float)(kursor_x - x)/20;
  230.         if (kat_skretu > 45) kat_skretu = 45;
  231.         if (kat_skretu < -45) kat_skretu = -45;
  232.         pMojObiekt->alfa = PI*kat_skretu/180;
  233.       }
  234.       break;
  235.     }
  236.   case WM_KEYDOWN:
  237.     {
  238.  
  239.       switch (LOWORD(wParam))
  240.       {
  241.       case VK_SHIFT:
  242.         {
  243.           SHIFTwcisniety = 1;
  244.           break;
  245.         }        
  246.       case VK_SPACE:
  247.         {
  248.           pMojObiekt->ham = 10.0;       // stopień hamowania (reszta zależy od siły docisku i wsp. tarcia)
  249.           break;                       // 1.0 to maksymalny stopień (np. zablokowanie kół)
  250.         }
  251.       case VK_UP:
  252.         {
  253.  
  254.           pMojObiekt->F = 20000.0;        // siła pchająca do przodu
  255.           break;
  256.         }
  257.       case VK_DOWN:
  258.         {
  259.           pMojObiekt->F = -20000.0;
  260.           break;
  261.         }
  262.       case VK_LEFT:
  263.         {
  264.           if (SHIFTwcisniety) pMojObiekt->alfa = PI*25/180;
  265.           else pMojObiekt->alfa = PI*10/180;
  266.  
  267.           break;
  268.         }
  269.       case VK_RIGHT:
  270.         {
  271.           if (SHIFTwcisniety) pMojObiekt->alfa = -PI*25/180;
  272.           else pMojObiekt->alfa = -PI*10/180;
  273.           break;
  274.         }
  275.       case 'I':   // wypisywanie nr ID
  276.         {
  277.           czy_rysowac_ID = 1 - czy_rysowac_ID;
  278.           break;
  279.         }
  280.       case 'W':   // oddalenie widoku
  281.         {
  282.           //pol_kamery = pol_kamery - kierunek_kamery*0.3;
  283.           if (oddalenie > 0.5) oddalenie /= 1.2;
  284.           else oddalenie = 0;  
  285.           break;
  286.         }    
  287.       case 'S':   // przybliżenie widoku
  288.         {
  289.           //pol_kamery = pol_kamery + kierunek_kamery*0.3;
  290.           if (oddalenie > 0) oddalenie *= 1.2;
  291.           else oddalenie = 0.5;  
  292.           break;
  293.         }    
  294.       case 'Q':   // widok z góry
  295.         {
  296.           //if (sledzenie) break;
  297.           widok_z_gory = 1-widok_z_gory;
  298.           if (widok_z_gory)                // przechodzimy do widoku z góry
  299.           {
  300.             pol_kamery_1 = pol_kamery; kierunek_kamery_1 = kierunek_kamery; pion_kamery_1 = pion_kamery;
  301.             oddalenie_1 = oddalenie; kat_kam_z_1 = kat_kam_z;
  302.  
  303.             //pol_kamery = pol_kamery_2; kierunek_kamery = kierunek_kamery_2; pion_kamery = pion_kamery_2;
  304.             oddalenie = oddalenie_2; kat_kam_z = kat_kam_z_2;
  305.             // Położenie kamery, kierunek oraz pion ustawiamy tak, by obiekt widziany był z góry i jechał
  306.             // początkowo w górę ekranu:
  307.             kierunek_kamery = (pMojObiekt->wPol - teren.srodek).znorm()*(-1);
  308.             pol_kamery = pMojObiekt->wPol - kierunek_kamery*pMojObiekt->dlugosc*10;
  309.             pion_kamery = pMojObiekt->qOrient.obroc_wektor(Wektor3(1,0,0));
  310.           }
  311.           else
  312.           {
  313.             pol_kamery_2 = pol_kamery; kierunek_kamery_2 = kierunek_kamery; pion_kamery_2 = pion_kamery;
  314.             oddalenie_2 = oddalenie; kat_kam_z_2 = kat_kam_z;
  315.  
  316.             // Położenie kamery, kierunek oraz pion ustawiamy tak, by obiekt widziany był z prawego boku i jechał
  317.             // początkowo ze strony lewej na prawą:
  318.             kierunek_kamery = pMojObiekt->qOrient.obroc_wektor(Wektor3(0,0,1))*-1;
  319.             pol_kamery = pMojObiekt->wPol - kierunek_kamery*pMojObiekt->dlugosc*10;
  320.             pion_kamery = (pMojObiekt->wPol - teren.srodek).znorm();
  321.  
  322.             //pol_kamery = pol_kamery_1; kierunek_kamery = kierunek_kamery_1; pion_kamery = pion_kamery_1;
  323.             oddalenie = oddalenie_1; kat_kam_z = kat_kam_z_1;
  324.           }
  325.           break;
  326.         }
  327.       case 'E':   // obrót kamery ku górze (względem lokalnej osi z)
  328.         {
  329.           kat_kam_z += PI*5/180;
  330.           break;
  331.         }    
  332.       case 'D':   // obrót kamery ku dołowi (względem lokalnej osi z)
  333.         {
  334.           kat_kam_z -= PI*5/180;  
  335.           break;
  336.         }
  337.       case 'A':   // włączanie, wyłączanie trybu śledzenia obiektu
  338.         {
  339.           sledzenie = 1 - sledzenie;
  340.           if (sledzenie)
  341.           {
  342.             oddalenie = oddalenie_3; kat_kam_z = kat_kam_z_3;
  343.           }
  344.           else
  345.           {
  346.             oddalenie_3 = oddalenie; kat_kam_z_3 = kat_kam_z;
  347.             widok_z_gory = 0;
  348.             pol_kamery = pol_kamery_1; kierunek_kamery = kierunek_kamery_1; pion_kamery = pion_kamery_1;
  349.             oddalenie = oddalenie_1; kat_kam_z = kat_kam_z_1;
  350.           }
  351.           break;
  352.         }
  353.       case VK_ESCAPE:
  354.         {
  355.           SendMessage(okno, WM_DESTROY,0,0);
  356.           break;
  357.         }
  358.       } // switch po klawiszach
  359.  
  360.       break;
  361.     }
  362.   case WM_KEYUP:
  363.     {
  364.       switch (LOWORD(wParam))
  365.       {
  366.       case VK_SHIFT:
  367.         {
  368.           SHIFTwcisniety = 0;
  369.           break;
  370.         }        
  371.       case VK_SPACE:
  372.         {
  373.           pMojObiekt->ham = 0.0;
  374.           break;
  375.         }
  376.       case VK_UP:
  377.         {
  378.           pMojObiekt->F = 0.0;
  379.  
  380.           break;
  381.         }
  382.       case VK_DOWN:
  383.         {
  384.           pMojObiekt->F = 0.0;
  385.           break;
  386.         }
  387.       case VK_LEFT:
  388.         {
  389.           pMojObiekt->Fb = 0.00;
  390.           pMojObiekt->alfa = 0;
  391.           break;
  392.         }
  393.       case VK_RIGHT:
  394.         {
  395.           pMojObiekt->Fb = 0.00;
  396.           pMojObiekt->alfa = 0;
  397.           break;
  398.         }
  399.  
  400.       }
  401.  
  402.       break;
  403.     }
  404.  
  405.   } // switch po komunikatach
  406. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement