Advertisement
Guest User

Untitled

a guest
Dec 16th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 25.68 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 "grafika.h"
  13. #include<string>
  14.  
  15. #include "siec.h"
  16.  
  17. FILE *f = fopen("wzr_zapis.txt","w");     // plik do zapisu informacji testowych
  18.  
  19. ObiektRuchomy *pMojObiekt;               // obiekt przypisany do tej aplikacjis
  20.  
  21. Teren teren;
  22. int iLiczbaCudzychOb = 0;
  23. ObiektRuchomy *CudzeObiekty[1000];  // obiekty z innych aplikacji lub inne obiekty niz pCraft
  24. int IndeksyOb[1000];                // 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. float sr_czestosc;                  // srednia czestosc wysylania ramek w [ramkach/s]
  29. long czas_start = clock();          // czas od poczatku dzialania aplikacji  
  30.  
  31. multicast_net *multi_reciv;         // wsk do obiektu zajmujacego sie odbiorem komunikatow
  32. multicast_net *multi_send;          //   -||-  wysylaniem komunikatow
  33.  
  34. HANDLE threadReciv;                 // uchwyt wątku odbioru komunikatów
  35. extern HWND okno;      
  36. int SHIFTwcisniety = 0;            
  37.  
  38.  
  39. // Parametry widoku:
  40. Wektor3 kierunek_kamery = Wektor3(10,-3,-11);   // kierunek patrzenia
  41. Wektor3 pol_kamery = Wektor3(-5,3,10);          // położenie kamery
  42. Wektor3 pion_kamery = Wektor3(0,1,0);           // kierunek pionu kamery            
  43. bool sledzenie = 1;                             // tryb śledzenia obiektu przez kamerę
  44. float oddalenie = 10.0;                          // oddalenie lub przybliżenie kamery
  45. float zoom = 1.0;                               // zmiana kąta widzenia
  46. float kat_kam_z = 0;                            // obrót kamery góra-dół
  47. bool sterowanie_myszkowe = 0;                   // sterowanie pojazdem za pomocą myszki
  48. int kursor_x, kursor_y;                         // polożenie kursora myszki w chwili włączenia sterowania
  49. char napis1[200], napis2[200], team_numer[10];                  // napisy wyświetlane w trybie graficznym
  50.  
  51. int opoznienia = 0;                
  52. bool podnoszenie_przedm = 1;        // czy mozna podnosic przedmioty
  53. bool rejestracja_uczestnikow = 1;   // rejestracja trwa do momentu wzięcia przedmiotu przez któregokolwiek uczestnika,
  54.                                     // w przeciwnym razie trzeba by przesyłać cały stan środowiska nowicjuszowi
  55. float czas_odnowy_przedm = 90;      // czas w [s] po którym wzięte przedmioty odnawiają się
  56. bool czy_umiejetnosci = 1;          // czy zróżnicowanie umiejętności (dla każdego pojazdu losowane są umiejętności
  57.                                     // zbierania gotówki i paliwa)
  58.  
  59. extern float WyslaniePrzekazu(int ID_adresata, int typ_przekazu, float wartosc_przekazu);
  60.  
  61. enum typy_ramek {STAN_OBIEKTU, WZIECIE_PRZEDMIOTU, ODNOWIENIE_SIE_PRZEDMIOTU, KOLIZJA, PRZEKAZ,
  62.                  PROSBA_O_ZAMKNIECIE, NEGOCJACJE_HANDLOWE, TWORZ_TEAM, DOLACZ_DO_TEAM};
  63.  
  64. enum typy_przekazu {GOTOWKA, PALIWO};
  65.  
  66. bool teams[5] = {true, true, true, true, true};
  67. int nr_mojego_teamu = 0;
  68.  
  69.  
  70. struct Ramka
  71. {  
  72.   int typ_ramki;
  73.   long czas_wyslania;
  74.    
  75.   int iID_adresata;        // nr ID adresata wiadomości (pozostali uczestnicy powinni wiadomość zignorować)
  76.  
  77.   int nr_przedmiotu;       // nr przedmiotu, który został wzięty lub odzyskany
  78.   Wektor3 wdV_kolid;       // wektor prędkości wyjściowej po kolizji (uczestnik o wskazanym adresie powinien
  79.                            // przyjąć tą prędkość)  
  80.  
  81.   int typ_przekazu;        // gotówka, paliwo
  82.   float wartosc_przekazu;  // ilość gotówki lub paliwa
  83.   int nr_druzyny;
  84.  
  85.   StanObiektu stan;
  86. };
  87.  
  88.  
  89. //******************************************
  90. // Funkcja obsługi wątku odbioru komunikatów
  91. DWORD WINAPI WatekOdbioru(void *ptr)
  92. {
  93.   multicast_net *pmt_net=(multicast_net*)ptr;  // wskaźnik do obiektu klasy multicast_net
  94.   int rozmiar;                                 // liczba bajtów ramki otrzymanej z sieci
  95.   Ramka ramka;
  96.   StanObiektu stan;
  97.  
  98.   while(1)
  99.   {
  100.     rozmiar = pmt_net->reciv((char*)&ramka,sizeof(Ramka));   // oczekiwanie na nadejście ramki
  101.     switch (ramka.typ_ramki)
  102.     {
  103.     case STAN_OBIEKTU:           // podstawowy typ ramki informującej o stanie obiektu              
  104.       {
  105.         stan = ramka.stan;
  106.         //fprintf(f,"odebrano stan iID = %d, ID dla mojego obiektu = %d\n",stan.iID,pMojObiekt->iID);
  107.         int niewlasny = 1;
  108.         if ((stan.iID != pMojObiekt->iID))          // jeśli to nie mój własny obiekt
  109.         {
  110.  
  111.           if ((rejestracja_uczestnikow)&&(IndeksyOb[stan.iID] == -1))        // nie ma jeszcze takiego obiektu w tablicy -> trzeba go stworzyć
  112.           {
  113.             CudzeObiekty[iLiczbaCudzychOb] = new ObiektRuchomy();  
  114.             IndeksyOb[stan.iID] = iLiczbaCudzychOb;     // wpis do tablicy indeksowanej numerami ID
  115.             // ułatwia wyszukiwanie, alternatywą może być tabl. rozproszona                                                                                                          
  116.             iLiczbaCudzychOb++;    
  117.             CudzeObiekty[IndeksyOb[stan.iID]]->ZmienStan(stan);   // aktualizacja stanu obiektu obcego         
  118.           }        
  119.           else if (IndeksyOb[stan.iID] != -1)
  120.             CudzeObiekty[IndeksyOb[stan.iID]]->ZmienStan(stan);   // aktualizacja stanu obiektu obcego  
  121.           else                                                    
  122.           {
  123.             Ramka ramka;
  124.             ramka.typ_ramki = PROSBA_O_ZAMKNIECIE;                // żądanie zamkięcia aplikacji
  125.             ramka.iID_adresata = stan.iID;
  126.             int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));
  127.           }
  128.         }
  129.         break;
  130.       }
  131.     case WZIECIE_PRZEDMIOTU:            // ramka informująca, że ktoś wziął przedmiot o podanym numerze
  132.       {
  133.         if ((ramka.nr_przedmiotu < teren.liczba_przedmiotow)&&(stan.iID != pMojObiekt->iID))
  134.         {
  135.           teren.p[ramka.nr_przedmiotu].do_wziecia = 0;
  136.           teren.p[ramka.nr_przedmiotu].czy_ja_wzialem = 0;
  137.           rejestracja_uczestnikow = 0;
  138.         }
  139.         break;
  140.       }
  141.     case ODNOWIENIE_SIE_PRZEDMIOTU:       // ramka informujaca, że przedmiot wcześniej wzięty pojawił się znowu w tym samym miejscu
  142.       {
  143.         if (ramka.nr_przedmiotu < teren.liczba_przedmiotow)
  144.           teren.p[ramka.nr_przedmiotu].do_wziecia = 1;
  145.         break;
  146.       }
  147.     case KOLIZJA:                       // ramka informująca o tym, że obiekt uległ kolizji
  148.       {
  149.         if (ramka.iID_adresata == pMojObiekt->iID)  // ID pojazdu, który uczestniczył w kolizji zgadza się z moim ID
  150.         {
  151.           pMojObiekt->wdV_kolid = ramka.wdV_kolid; // przepisuje poprawkę własnej prędkości
  152.           pMojObiekt->iID_kolid = pMojObiekt->iID; // ustawiam nr. kolidujacego jako własny na znak, że powinienem poprawić prędkość
  153.         }
  154.         break;
  155.       }
  156.     case PRZEKAZ:                       // ramka informująca o przelewie pieniężnym lub przekazaniu towaru    
  157.       {
  158.         if (ramka.iID_adresata == pMojObiekt->iID)  // ID pojazdu, ktory otrzymal przelew zgadza się z moim ID
  159.         {      
  160.           if (ramka.typ_przekazu == GOTOWKA)
  161.             pMojObiekt->pieniadze += ramka.wartosc_przekazu;                   
  162.           else if (ramka.typ_przekazu == PALIWO)
  163.             pMojObiekt->ilosc_paliwa += ramka.wartosc_przekazu;
  164.  
  165.           // należałoby jeszcze przelew potwierdzić (w UDP ramki mogą być gubione!)
  166.         }
  167.         break;
  168.       }
  169.     case PROSBA_O_ZAMKNIECIE:           // ramka informująca, że powinieneś się zamknąć
  170.       {
  171.         if (ramka.iID_adresata == pMojObiekt->iID)
  172.         {  
  173.           SendMessage(okno,WM_DESTROY,0,100);
  174.         }
  175.         break;
  176.       }
  177.     case NEGOCJACJE_HANDLOWE:
  178.       {
  179.         // ------------------------------------------------------------------------
  180.         // --------------- MIEJSCE #1 NA NEGOCJACJE HANDLOWE  ---------------------
  181.         // (szczegóły na stronie w instrukcji do zadania)
  182.  
  183.  
  184.  
  185.  
  186.         // ------------------------------------------------------------------------
  187.  
  188.         break;
  189.       }
  190.     case TWORZ_TEAM:
  191.       {
  192.  
  193.         stan = ramka.stan;
  194.         if ((stan.iID != pMojObiekt->iID))
  195.         {
  196.           int id_gracza_nadawcy = stan.iID;
  197.           std::string test1 = std::to_string(id_gracza_nadawcy);
  198.           std::string napis = "Gracz " + test1 + " zaprasza chętnych do dołączenia do drużyny." ;
  199.  
  200.           int czy_dolaczyc = MessageBox(okno, (napis.c_str()), "Zaproszenie do drużyny", MB_YESNO);
  201.           switch (czy_dolaczyc) {
  202.           case IDYES: {
  203.               // TU CHCE STWORZYC, wyslanie ramki o checi tworzenia teamu
  204.               Ramka ramka_dolacz;
  205.               ramka_dolacz.iID_adresata = id_gracza_nadawcy;
  206.               ramka_dolacz.typ_ramki = DOLACZ_DO_TEAM;                // info o checi nowego teamu
  207.               ramka_dolacz.stan = pMojObiekt->Stan();         // stan własnego obiektu
  208.  
  209.               nr_mojego_teamu = ramka.nr_druzyny;
  210.               std::string nr_tm = std::to_string(nr_mojego_teamu);
  211.               sprintf(team_numer, nr_tm.c_str());
  212.  
  213.               int iRozmiar = multi_send->send_delayed((char*)&ramka_dolacz, sizeof(Ramka));
  214.  
  215.               MessageBox(okno, "Przyjąłeś zaproszenie do drużyny.", "Przyjąłeś zaproszenie", MB_OK);
  216.               break;
  217.           }
  218.           case IDNO: {
  219.               MessageBox(okno, "Odrzuciłeś zaproszenie do drużyny.", "Odrzuciłeś zaproszenie", MB_OK);
  220.               break;
  221.           }
  222.  
  223.           }
  224.         }
  225.  
  226.         break;
  227.       }
  228.     case DOLACZ_DO_TEAM:
  229.       {
  230.         // ramka zwrotna informujaca ze graz chce doalczyc do druzyny
  231.         if (ramka.iID_adresata == pMojObiekt->iID) {
  232.             // druzyna zakladana przeze mnie
  233.             int id_przyjmujacego = ramka.stan.iID;
  234.             std::string text_info = "Gracz przyjął " + std::to_string(id_przyjmujacego) + " zaproszenie do twojej drużyny.";
  235.             MessageBox(okno, text_info.c_str(), "Przyjęto zaproszenie", MB_OK);
  236.         }
  237.         break;
  238.       }
  239.  
  240.     } // switch po typach ramek
  241.   }  // while(1)
  242.   return 1;
  243. }
  244.  
  245. // *****************************************************************
  246. // ****    Wszystko co trzeba zrobić podczas uruchamiania aplikacji
  247. // ****    poza grafiką  
  248. void PoczatekInterakcji()
  249. {
  250.   DWORD dwThreadId;
  251.  
  252.   pMojObiekt = new ObiektRuchomy();    // tworzenie wlasnego obiektu
  253.  
  254.   for (long i=0;i<1000;i++)            // inicjacja indeksow obcych obiektow
  255.     IndeksyOb[i] = -1;
  256.  
  257.   czas_cyklu_WS = clock();             // pomiar aktualnego czasu
  258.  
  259.   // obiekty sieciowe typu multicast (z podaniem adresu WZR oraz numeru portu)
  260.   multi_reciv = new multicast_net("224.10.10.15",10001);      // obiekt do odbioru ramek sieciowych
  261.   multi_send = new multicast_net("224.10.10.15",10001);       // obiekt do wysyłania ramek
  262.  
  263.   if (opoznienia)
  264.   {
  265.     float srednie_opoznienie = 3*(float)rand()/RAND_MAX, wariancja_opoznienia = 2;
  266.     multi_send->PrepareDelay(srednie_opoznienie,wariancja_opoznienia);
  267.   }
  268.  
  269.   // uruchomienie watku obslugujacego odbior komunikatow
  270.   threadReciv = CreateThread(
  271.     NULL,                        // no security attributes
  272.     0,                           // use default stack size
  273.     WatekOdbioru,                // thread function
  274.     (void *)multi_reciv,               // argument to thread function
  275.     0,                           // use default creation flags
  276.     &dwThreadId);                // returns the thread identifier
  277.  
  278. }
  279.  
  280.  
  281. // *****************************************************************
  282. // ****    Wszystko co trzeba zrobić w każdym cyklu działania
  283. // ****    aplikacji poza grafiką
  284. void Cykl_WS()
  285. {
  286.   licznik_sym++;  
  287.  
  288.   // obliczenie średniego czasu pomiędzy dwoma kolejnnymi symulacjami po to, by zachować  fizycznych
  289.   if (licznik_sym % 50 == 0)          // jeśli licznik cykli przekroczył pewną wartość, to
  290.   {                                   // należy na nowo obliczyć średni czas cyklu fDt
  291.     char text[200];
  292.     long czas_pop = czas_cyklu_WS;
  293.     czas_cyklu_WS = clock();
  294.     float fFps = (50*CLOCKS_PER_SEC)/(float)(czas_cyklu_WS-czas_pop);
  295.     if (fFps!=0) fDt=1.0/fFps; else fDt=1;
  296.  
  297.     sprintf(napis1," %0.0f_fps, paliwo = %0.2f, gotowka = %d,",fFps,pMojObiekt->ilosc_paliwa,pMojObiekt->pieniadze);
  298.     if (licznik_sym % 500 == 0) sprintf(napis2,"");
  299.   }  
  300.  
  301.   pMojObiekt->Symulacja(fDt);                    // symulacja własnego obiektu
  302.  
  303.  
  304.   if ((pMojObiekt->iID_kolid > -1)&&             // wykryto kolizję - wysyłam specjalną ramkę, by poinformować o tym drugiego uczestnika
  305.     (pMojObiekt->iID_kolid != pMojObiekt->iID)) // oczywiście wtedy, gdy nie chodzi o mój pojazd
  306.   {
  307.     Ramka ramka;
  308.     ramka.typ_ramki = KOLIZJA;
  309.     ramka.iID_adresata = pMojObiekt->iID_kolid;
  310.     ramka.wdV_kolid = pMojObiekt->wdV_kolid;
  311.     int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));
  312.    
  313.     char text[128];
  314.     sprintf(napis2,"Kolizja_z_obiektem_o_ID = %d",pMojObiekt->iID_kolid);
  315.     //SetWindowText(okno,text);
  316.  
  317.     pMojObiekt->iID_kolid = -1;
  318.   }
  319.  
  320.   // wyslanie komunikatu o stanie obiektu przypisanego do aplikacji (pMojObiekt):    
  321.   if (licznik_sym % 1 == 0)      
  322.   {
  323.     Ramka ramka;
  324.     ramka.typ_ramki = STAN_OBIEKTU;
  325.     ramka.stan = pMojObiekt->Stan();         // stan własnego obiektu
  326.     int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));
  327.   }
  328.  
  329.   long czas_akt = clock();
  330.  
  331.   // sprawdzam, czy nie najechałem na monetę lub beczkę z paliwem. Jeśli tak, to zdobywam pieniądze lub paliwo oraz wysyłam innym uczestnikom
  332.   // informację o zabraniu beczki: (wcześniej trzeba wcisnąć P)
  333.   for (long i=0;i<teren.liczba_przedmiotow;i++)
  334.   {
  335.     if ((teren.p[i].do_wziecia == 1)&&(podnoszenie_przedm)&&
  336.       ((teren.p[i].wPol - pMojObiekt->wPol + Wektor3(0,pMojObiekt->wPol.y - teren.p[i].wPol.y,0)).dlugosc() < pMojObiekt->promien))
  337.     {
  338.  
  339.       long wartosc = teren.p[i].wartosc;
  340.      
  341.       if (teren.p[i].typ == MONETA)
  342.       {
  343.         if (czy_umiejetnosci)
  344.           wartosc = (long)(float)wartosc*pMojObiekt->umiejetn_zb_monet;  
  345.         pMojObiekt->pieniadze += wartosc;  
  346.         sprintf(napis2,"Wziecie_gotowki_o_wartosci_ %d",wartosc);
  347.       }
  348.       else
  349.       {
  350.         if (czy_umiejetnosci)
  351.           wartosc = (float)wartosc*pMojObiekt->umiejetn_zb_paliwa;
  352.         pMojObiekt->ilosc_paliwa += wartosc;
  353.         sprintf(napis2,"Wziecie_paliwa_w_ilosci_ %d",wartosc);
  354.       }
  355.  
  356.       teren.p[i].do_wziecia = 0;
  357.       teren.p[i].czy_ja_wzialem = 1;
  358.       teren.p[i].czas_wziecia = clock();
  359.       rejestracja_uczestnikow = 0;     // koniec rejestracji nowych uczestników
  360.  
  361.       Ramka ramka;
  362.       ramka.typ_ramki = WZIECIE_PRZEDMIOTU;
  363.       ramka.nr_przedmiotu = i;
  364.       ramka.stan = pMojObiekt->Stan();
  365.       int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));
  366.     }
  367.     else if ((teren.p[i].do_wziecia == 0)&&(teren.p[i].czy_ja_wzialem)&&(teren.p[i].czy_odnawialny)&&
  368.       (czas_akt - teren.p[i].czas_wziecia >= czas_odnowy_przedm*CLOCKS_PER_SEC))
  369.     {                              // jeśli minął pewnien okres czasu przedmiot może zostać przywrócony
  370.       teren.p[i].do_wziecia = 1;
  371.       Ramka ramka;
  372.       ramka.typ_ramki = ODNOWIENIE_SIE_PRZEDMIOTU;
  373.       ramka.nr_przedmiotu = i;
  374.       int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));
  375.     }
  376.   } // for po przedmiotach
  377.  
  378.  
  379. }
  380.  
  381. // *****************************************************************
  382. // ****    Wszystko co trzeba zrobić podczas zamykania aplikacji
  383. // ****    poza grafiką
  384. void ZakonczenieInterakcji()
  385. {
  386.   fprintf(f,"Koniec interakcji\n");
  387.   fclose(f);
  388. }
  389.  
  390. // Funkcja wysylajaca ramke z przekazem, zwraca zrealizowaną wartość przekazu
  391. float WyslaniePrzekazu(int ID_adresata, int typ_przekazu, float wartosc_przekazu)
  392. {
  393.   Ramka ramka;
  394.   ramka.typ_ramki = PRZEKAZ;
  395.   ramka.iID_adresata = ID_adresata;
  396.   ramka.typ_przekazu = typ_przekazu;
  397.   ramka.wartosc_przekazu = wartosc_przekazu;
  398.  
  399.   // tutaj należałoby uzyskać potwierdzenie przekazu zanim sumy zostaną odjęte
  400.   if (typ_przekazu == GOTOWKA)
  401.   {
  402.     if (pMojObiekt->pieniadze < wartosc_przekazu)
  403.       ramka.wartosc_przekazu = pMojObiekt->pieniadze;
  404.     pMojObiekt->pieniadze -= ramka.wartosc_przekazu;
  405.     sprintf(napis2,"Przelew_sumy_ %f _na_rzecz_ID_ %d",wartosc_przekazu,ID_adresata);
  406.   }
  407.   else if (typ_przekazu == PALIWO)
  408.   {
  409.     // odszukanie adresata, sprawdzenie czy jest odpowiednio blisko:
  410.     int indeks_adresata = -1;
  411.     for (int i=0;i<iLiczbaCudzychOb;i++)
  412.       if (CudzeObiekty[i]->iID == ID_adresata) {indeks_adresata = i; break;}
  413.     if ((CudzeObiekty[indeks_adresata]->wPol - pMojObiekt->wPol).dlugosc() >
  414.          CudzeObiekty[indeks_adresata]->dlugosc + pMojObiekt->dlugosc)
  415.       ramka.wartosc_przekazu = 0;
  416.     else
  417.     {
  418.       if (pMojObiekt->ilosc_paliwa < wartosc_przekazu)
  419.         ramka.wartosc_przekazu = pMojObiekt->ilosc_paliwa;
  420.       pMojObiekt->ilosc_paliwa -= ramka.wartosc_przekazu;
  421.       sprintf(napis2,"Przekazanie_paliwa_w_ilości_ %f _na_rzecz_ID_ %d",wartosc_przekazu,ID_adresata);
  422.     }
  423.   }
  424.  
  425.   if (ramka.wartosc_przekazu > 0)
  426.     int iRozmiar = multi_send->send_delayed((char*)&ramka,sizeof(Ramka));  
  427.  
  428.   return ramka.wartosc_przekazu;
  429. }
  430.  
  431.  
  432. // ************************************************************************
  433. // ****    Obsługa klawiszy służących do sterowania obiektami lub
  434. // ****    widokami
  435. void KlawiszologiaSterowania(UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
  436. {
  437.  
  438.   switch (kod_meldunku)
  439.   {
  440.  
  441.   case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  442.     {
  443.       int x = LOWORD(lParam);
  444.       int y = HIWORD(lParam);
  445.       if (sterowanie_myszkowe)
  446.         pMojObiekt->F = 4100.0;        // siła pchająca do przodu
  447.       break;
  448.     }
  449.   case WM_RBUTTONDOWN: //reakcja na prawy przycisk myszki
  450.     {
  451.       int x = LOWORD(lParam);
  452.       int y = HIWORD(lParam);
  453.       if (sterowanie_myszkowe)
  454.         pMojObiekt->F = -2100.0;        // siła pchająca do tylu
  455.       break;
  456.     }
  457.   case WM_MBUTTONDOWN: //reakcja na środkowy przycisk myszki : uaktywnienie/dezaktywacja sterwania myszkowego
  458.     {
  459.       sterowanie_myszkowe = 1 - sterowanie_myszkowe;
  460.       kursor_x = LOWORD(lParam);
  461.       kursor_y = HIWORD(lParam);
  462.       break;
  463.     }
  464.   case WM_LBUTTONUP: //reakcja na puszczenie lewego przycisku myszki
  465.     {  
  466.       if (sterowanie_myszkowe)
  467.         pMojObiekt->F = 0.0;        // siła pchająca do przodu
  468.       break;
  469.     }
  470.   case WM_RBUTTONUP: //reakcja na puszczenie lewy przycisk myszki
  471.     {
  472.       if (sterowanie_myszkowe)
  473.         pMojObiekt->F = 0.0;        // siła pchająca do przodu
  474.       break;
  475.     }
  476.   case WM_MOUSEMOVE:
  477.     {
  478.       int x = LOWORD(lParam);
  479.       int y = HIWORD(lParam);
  480.       if (sterowanie_myszkowe)
  481.       {
  482.         float kat_skretu = (float)(kursor_x - x)/20;
  483.         if (kat_skretu > 45) kat_skretu = 45;
  484.         if (kat_skretu < -45) kat_skretu = -45;
  485.         pMojObiekt->alfa = PI*kat_skretu/180;
  486.       }
  487.       break;
  488.     }
  489.   case WM_KEYDOWN:
  490.     {
  491.  
  492.       switch (LOWORD(wParam))
  493.       {
  494.       case VK_SHIFT:
  495.         {
  496.           SHIFTwcisniety = 1;
  497.           break;
  498.         }        
  499.       case VK_SPACE:
  500.         {
  501.           pMojObiekt->ham = 1.0;       // stopień hamowania (reszta zależy od siły docisku i wsp. tarcia)
  502.           break;                       // 1.0 to maksymalny stopień (np. zablokowanie kół)
  503.         }
  504.       case VK_UP:
  505.         {
  506.  
  507.           pMojObiekt->F = 4100.0;        // siła pchająca do przodu
  508.           break;
  509.         }
  510.       case VK_DOWN:
  511.         {
  512.           pMojObiekt->F = -2100.0;        // sila pchajaca do tylu
  513.           break;
  514.         }
  515.       case VK_LEFT:
  516.         {
  517.           if (SHIFTwcisniety) pMojObiekt->alfa = PI*35/180;
  518.           else pMojObiekt->alfa = PI*15/180;
  519.  
  520.           break;
  521.         }
  522.       case VK_RIGHT:
  523.         {
  524.           if (SHIFTwcisniety) pMojObiekt->alfa = -PI*35/180;
  525.           else pMojObiekt->alfa = -PI*15/180;
  526.           break;
  527.         }
  528.       case 'W':   // przybliżenie widoku
  529.         {
  530.           //pol_kamery = pol_kamery - kierunek_kamery*0.3;
  531.           if (oddalenie > 0.5) oddalenie /= 1.2;
  532.           else oddalenie = 0;  
  533.           break;
  534.         }    
  535.       case 'S':   // oddalenie widoku
  536.         {
  537.           //pol_kamery = pol_kamery + kierunek_kamery*0.3;
  538.           if (oddalenie > 0) oddalenie *= 1.2;
  539.           else oddalenie = 0.5;  
  540.           break;
  541.         }    
  542.       case 'Q':   // widok z góry
  543.         {
  544.           pol_kamery = Wektor3(0,100,0);
  545.           kierunek_kamery = Wektor3(0,-1,0.01);
  546.           pion_kamery = Wektor3(0,0,-1);
  547.           break;
  548.         }
  549.       case 'E':   // obrót kamery ku górze (względem lokalnej osi z)
  550.         {
  551.           kat_kam_z += PI*5/180;
  552.           break;
  553.         }    
  554.       case 'D':   // obrót kamery ku dołowi (względem lokalnej osi z)
  555.         {
  556.           kat_kam_z -= PI*5/180;  
  557.           break;
  558.         }
  559.       case 'A':   // włączanie, wyłączanie trybu śledzenia obiektu
  560.         {
  561.           sledzenie = 1 - sledzenie;
  562.           break;
  563.         }
  564.       case 'Z':   // zoom - zmniejszenie kąta widzenia
  565.         {
  566.           zoom /= 1.1;
  567.           RECT rc;
  568.           GetClientRect (okno, &rc);
  569.           ZmianaRozmiaruOkna(rc.right - rc.left,rc.bottom-rc.top);
  570.           break;
  571.         }
  572.       case 'X':   // zoom - zwiększenie kąta widzenia
  573.         {
  574.           zoom *= 1.1;
  575.           RECT rc;
  576.           GetClientRect (okno, &rc);
  577.           ZmianaRozmiaruOkna(rc.right - rc.left,rc.bottom-rc.top);
  578.           break;
  579.         }
  580.       case 'P':   // podnoszenie przedmiotów
  581.         {
  582.           //Wektor3 w_przod = pMojObiekt->qOrient.obroc_wektor(Wektor3(1,0,0));
  583.           //+ Wector3(0,pMojObiekt->wPol.y - teren.p[i].wPol.y,0)
  584.           podnoszenie_przedm = 1 - podnoszenie_przedm;
  585.           break;
  586.         }
  587.       case 'F':  // przekazanie 10 kg paliwa pojazdowi, który znajduje się najbliżej
  588.         {
  589.           float min_odleglosc = 1e10;
  590.           int indeks_min = -1;
  591.           for (int i=0;i<iLiczbaCudzychOb;i++)
  592.           {
  593.             if (min_odleglosc > (CudzeObiekty[i]->wPol - pMojObiekt->wPol).dlugosc() )
  594.             {
  595.               min_odleglosc = (CudzeObiekty[i]->wPol - pMojObiekt->wPol).dlugosc();
  596.               indeks_min = i;
  597.             }
  598.           }
  599.  
  600.           float ilosc_p =  0;
  601.           if (indeks_min > -1)
  602.             ilosc_p = WyslaniePrzekazu(CudzeObiekty[indeks_min]->iID, PALIWO, 10);
  603.          
  604.           if (ilosc_p == 0)
  605.             MessageBox(okno,"Paliwa nie dało się przekazać, bo być może najbliższy obiekt ruchomy znajduje się zbyt daleko.",
  606.               "Nie dało się przekazać paliwa!",MB_OK);
  607.           break;
  608.         }
  609.       case 'G':  // przekazanie 100 jednostek gotowki pojazdowi, który znajduje się najbliżej
  610.         {
  611.           float min_odleglosc = 1e10;
  612.           int indeks_min = -1;
  613.           for (int i=0;i<iLiczbaCudzychOb;i++)
  614.           {
  615.             if (min_odleglosc > (CudzeObiekty[i]->wPol - pMojObiekt->wPol).dlugosc() )
  616.             {
  617.               min_odleglosc = (CudzeObiekty[i]->wPol - pMojObiekt->wPol).dlugosc();
  618.               indeks_min = i;
  619.             }
  620.           }
  621.  
  622.           float ilosc_p =  0;
  623.           if (indeks_min > -1)
  624.             ilosc_p = WyslaniePrzekazu(CudzeObiekty[indeks_min]->iID, GOTOWKA, 100);
  625.          
  626.           if (ilosc_p == 0)
  627.             MessageBox(okno,"Gotówki nie dało się przekazać, bo być może najbliższy obiekt ruchomy znajduje się zbyt daleko.",
  628.               "Nie dało się przekazać gotówki!",MB_OK);
  629.           break;
  630.         }
  631.       case 'T':
  632.         {
  633.           int czy_stworzyc_team = MessageBox(NULL, "Czy napewno chcesz stworzyć zespół?", "Potwierdź cheć założenia założenia zespołu", MB_YESNO);
  634.           switch (czy_stworzyc_team) {
  635.             case IDYES:
  636.             {
  637.                 // TU CHCE STWORZYC, wyslanie ramki o checi tworzenia teamu
  638.                 int nr_teamu = 0;
  639.                 for (int i = 0; i < sizeof(teams) ; i++) {
  640.                     if (teams[i] == true) // jezeli team dostepny to zwroc nr teamu
  641.                     {
  642.                         nr_teamu = (i + 1);
  643.                         teams[i] = false;
  644.                         break;
  645.                     }
  646.                 }
  647.                 if (nr_teamu > 0) {
  648.                     Ramka ramka;
  649.                     ramka.nr_druzyny = nr_teamu;
  650.                     ramka.typ_ramki = TWORZ_TEAM;                // info o checi nowego teamu
  651.                     ramka.stan = pMojObiekt->Stan();         // stan własnego obiektu
  652.  
  653.                     nr_mojego_teamu = nr_teamu;
  654.                     std::string nr_tm = std::to_string(nr_mojego_teamu);
  655.                     sprintf(team_numer, nr_tm.c_str());
  656.  
  657.  
  658.                     int iRozmiar = multi_send->send_delayed((char*)&ramka, sizeof(Ramka));
  659.                 }
  660.                 else {
  661.                     MessageBox(NULL, "Limit zespołów osiągnięto. Nie można stworzyć więcej zespołów.", "Nie można stworzyć nowego zespołu", MB_OK);
  662.                 }
  663.  
  664.                 break;
  665.             }
  666.             case IDNO:
  667.             {
  668.                 break;
  669.             }
  670.           }
  671.           break;
  672.         }
  673.       } // switch po klawiszach
  674.  
  675.       break;
  676.     }
  677.   case WM_KEYUP:
  678.     {
  679.       switch (LOWORD(wParam))
  680.       {
  681.       case VK_SHIFT:
  682.         {
  683.           SHIFTwcisniety = 0;
  684.           break;
  685.         }        
  686.       case VK_SPACE:
  687.         {
  688.           pMojObiekt->ham = 0.0;
  689.           break;
  690.         }
  691.       case VK_UP:
  692.         {
  693.           pMojObiekt->F = 0.0;
  694.  
  695.           break;
  696.         }
  697.       case VK_DOWN:
  698.         {
  699.           pMojObiekt->F = 0.0;
  700.           break;
  701.         }
  702.       case VK_LEFT:
  703.         {
  704.           pMojObiekt->Fb = 0.00;
  705.           pMojObiekt->alfa = 0;
  706.           break;
  707.         }
  708.       case VK_RIGHT:
  709.         {
  710.           pMojObiekt->Fb = 0.00;
  711.           pMojObiekt->alfa = 0;
  712.           break;
  713.         }
  714.  
  715.       }
  716.  
  717.       break;
  718.     }
  719.  
  720.   } // switch po komunikatach
  721. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement