Advertisement
qtinio

main a z policjom wiadomo co robic

May 28th, 2019
1,634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /****************************************************
  2. Wirtualne zespoly robocze - przykladowy projekt w C++
  3. Do zadań dotyczących współpracy, ekstrapolacji i
  4. autonomicznych obiektów
  5. ****************************************************/
  6.  
  7. #include <windows.h>
  8. #include <math.h>
  9. #include <time.h>
  10. #include <string>
  11. #include <gl\gl.h>
  12. #include <gl\glu.h>
  13. #include <iterator>
  14. #include <map>
  15. using namespace std;
  16.  
  17. #include "objects.h"
  18. #include "agents.h"
  19. #include "graphics.h"
  20. #include "net.h"
  21.  
  22.  
  23. bool if_different_skills = false;                    // czy zró¿nicowanie umiejêtnoœci (dla ka¿dego pojazdu losowane s¹ umiejêtnoœci
  24.                                                      // zbierania gotówki i paliwa)
  25. bool if_autonomous_control = false;                  // sterowanie autonomiczne pojazdem
  26.  
  27.  
  28. FILE *f = fopen("wzrlog.txt", "w");                  // plik do zapisu informacji testowych
  29.  
  30. MovableObject *my_vehicle;                           // Object przypisany do tej aplikacji
  31.                                                      //MovableObject *MyOwnObjects[1000];                 // obiekty przypisane do tej aplikacji max. 1000 (mogą być zarówno sterowalne, jak i poza kontrolą lub wrogie)
  32.                                                      //int iNumberOfOwnObjects = 5;
  33.                                                      //int iAkt = 0;                                      // numer obiektu spośród przypisanych do tej aplikacji, który jest w danym momencie aktywny - sterowalny
  34.  
  35. Terrain terrain;
  36. map<int, MovableObject*> network_vehicles;
  37.  
  38. AutoPilot *ap;
  39.  
  40. float fDt;                                           // sredni czas pomiedzy dwoma kolejnymi cyklami symulacji i wyswietlania
  41. long VW_cycle_time, counter_of_simulations;          // zmienne pomocnicze potrzebne do obliczania fDt
  42. long start_time = clock();                           // czas od poczatku dzialania aplikacji  
  43. long group_existing_time = clock();                  // czas od pocz¹tku istnienia grupy roboczej (czas od uruchom. pierwszej aplikacji)      
  44.  
  45. multicast_net *multi_reciv;                          // wsk do obiektu zajmujacego sie odbiorem komunikatow
  46. multicast_net *multi_send;                           //   -||-  wysylaniem komunikatow
  47.  
  48. HANDLE threadReciv;                                  // uchwyt w¹tku odbioru komunikatów
  49. extern HWND main_window;
  50. CRITICAL_SECTION m_cs;                               // do synchronizacji wątków
  51.  
  52. bool SHIFT_pressed = 0;
  53. bool CTRL_pressed = 0;
  54. bool ALT_pressed = 0;
  55. bool L_pressed = 0;
  56. //bool rejestracja_uczestnikow = true;   // rejestracja trwa do momentu wziêcia przedmiotu przez któregokolwiek uczestnika,
  57. // w przeciwnym razie trzeba by przesy³aæ ca³y state œrodowiska nowicjuszowi
  58.  
  59. // Parametry widoku:
  60. extern ViewParameters par_view;
  61.  
  62. bool mouse_control = 0;                              // sterowanie pojazdem za pomoc¹ myszki
  63. int cursor_x, cursor_y;                              // polo¿enie kursora myszki w chwili w³¹czenia sterowania
  64.  
  65. bool autopilot_presentation_mode = 0;                // czy pokazywać test autopilota
  66. float autopilot_presentation_current_time = 0;       // czas jaki upłynął od początku testu autopilota
  67. float autopilot_time_step = 0.01;                    // stały krok czasowy wolny od możliwości sprzętowych (zamiast fDt)
  68. float autopilot_test_time = 600;                     // całkowity czas testu
  69.  
  70. // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  71. const double PALIWO_STANDARD = 25;
  72. const double PALIWO_CENA_RYNKOWA = 10;
  73. const double MNOZNIK_2_LITROW = 0.2;
  74. bool blokada_czasowa = false;
  75. // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  76.  
  77. extern float TransferSending(int ID_receiver, int transfer_type, float transfer_value);
  78.  
  79. enum frame_types {
  80.     OBJECT_STATE, ITEM_TAKING, ITEM_RENEWAL, COLLISION, TRANSFER, KOMU_KOMU_BO_IDE_DO_DOMU, CHETNIE_KUPIE_BO_MAM_MALO_STRASZNIE, RACHUNEK_ZA_ZAKUPY, RACHUNEK_ZA_SPRZEDAZ
  81. };
  82.  
  83. enum transfer_types { MONEY, FUEL };
  84.  
  85. struct Frame
  86. {
  87.     int iID;                   // identyfikator użytkownika
  88.     int frame_type;            // typ ramki
  89.     ObjectState state;         // stan obiektu
  90.  
  91.     int iID_receiver;          // nr ID adresata wiadomoœci (pozostali uczestnicy powinni wiadomoœæ zignorowaæ)
  92.  
  93.     int item_number;           // nr przedmiotu, który zosta³ wziêty lub odzyskany
  94.     Vector3 vdV_collision;     // wektor prêdkoœci wyjœciowej po kolizji (uczestnik o wskazanym adresie powinien
  95.                                // przyj¹æ t¹ prêdkoœæ)  
  96.  
  97.     int transfer_type;         // typ przekazu: gotówka, paliwo
  98.     float transfer_value;      // wielkość przekazu - ilość gotówki lub paliwa
  99.     int team_number;
  100.  
  101.     long existing_time;        // czas istnienia - czas jaki uplynął od uruchomienia programu
  102. };
  103.  
  104.  
  105. //******************************************
  106. // Funkcja obs³ugi w¹tku odbioru komunikatów
  107. DWORD WINAPI ReceiveThreadFunction(void *ptr)
  108. {
  109.     multicast_net *pmt_net = (multicast_net*)ptr;  // wskaŸnik do obiektu klasy multicast_net
  110.     int size;                                      // liczba bajtów ramki otrzymanej z sieci
  111.     Frame frame;
  112.     ObjectState state;
  113.  
  114.     while (1)
  115.     {
  116.         size = pmt_net->reciv((char*)&frame, sizeof(Frame));   // oczekiwanie na nadejœcie ramki
  117.                                                                // Lock the Critical section
  118.         EnterCriticalSection(&m_cs);               // wejście na ścieżkę krytyczną - by inne wątki (np. główny) nie współdzielił
  119.  
  120.         switch (frame.frame_type)
  121.         {
  122.         case OBJECT_STATE:                    // podstawowy typ ramki informuj¹cej o stanie obiektu              
  123.         {
  124.             state = frame.state;
  125.             //fprintf(f,"odebrano state iID = %d, ID dla mojego obiektu = %d\n",state.iID,my_vehicle->iID);
  126.             if ((frame.iID != my_vehicle->iID))          // jeœli to nie mój w³asny Object
  127.             {
  128.  
  129.                 if ((network_vehicles.size() == 0) || (network_vehicles[frame.iID] == NULL))         // nie ma jeszcze takiego obiektu w tablicy -> trzeba go stworzyæ
  130.                 {
  131.                     // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  132.  
  133.  
  134.                     // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  135.                     MovableObject *ob = new MovableObject(&terrain);
  136.                     ob->iID = frame.iID;
  137.                     network_vehicles[frame.iID] = ob;
  138.                     if (frame.existing_time > group_existing_time) group_existing_time = frame.existing_time;
  139.                     ob->ChangeState(state);   // aktualizacja stanu obiektu obcego
  140.                     terrain.InsertObjectIntoSectors(ob);
  141.                     // wys³anie nowemu uczestnikowi informacji o wszystkich wziêtych przedmiotach:
  142.                     for (long i = 0; i < terrain.number_of_items; i++)
  143.                         if ((terrain.p[i].to_take == 0) && (terrain.p[i].if_taken_by_me))
  144.                         {
  145.                             Frame frame;
  146.                             frame.frame_type = ITEM_TAKING;
  147.                             frame.item_number = i;
  148.                             frame.state = my_vehicle->State();
  149.                             frame.iID = my_vehicle->iID;
  150.                             int iSIZE = multi_send->send((char*)&frame, sizeof(Frame));
  151.                         }
  152.  
  153.                 }
  154.                 else if ((network_vehicles.size() > 0) && (network_vehicles[frame.iID] != NULL))
  155.                 {
  156.                     terrain.DeleteObjectsFromSectors(network_vehicles[frame.iID]);
  157.                     network_vehicles[frame.iID]->ChangeState(state);   // aktualizacja stanu obiektu obcego    
  158.                     terrain.InsertObjectIntoSectors(network_vehicles[frame.iID]);
  159.                 }
  160.  
  161.             }
  162.             break;
  163.         }
  164.         // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  165.         case KOMU_KOMU_BO_IDE_DO_DOMU:
  166.         {
  167.             if (my_vehicle->iID != frame.iID_receiver) {
  168.                 // jak sprzedawca stoi z paliwem
  169.                 double ilosc_sprzedawanego = frame.transfer_value;
  170.                 double cena_za_litr = 10 - ((frame.state.amount_of_fuel - PALIWO_STANDARD) / 2)*MNOZNIK_2_LITROW;
  171.  
  172.                 // za ile to kupie
  173.                 int suma = (int)(cena_za_litr * ilosc_sprzedawanego);
  174.                 if (suma > my_vehicle->state.money)
  175.                     suma = my_vehicle->state.money;
  176.  
  177.                 // wyslanie pieniedzy
  178.                 TransferSending(frame.iID, MONEY, suma);
  179.  
  180.                 // wyslanei rachunku
  181.                 Frame odpowiedz;
  182.                 odpowiedz.frame_type = RACHUNEK_ZA_SPRZEDAZ;
  183.                 odpowiedz.vdV_collision = my_vehicle->vdV_collision;
  184.                 odpowiedz.iID = my_vehicle->iID;
  185.                 odpowiedz.iID_receiver = frame.iID;
  186.                 odpowiedz.state = my_vehicle->state;
  187.                 odpowiedz.transfer_type = suma;
  188.                 odpowiedz.transfer_value = ilosc_sprzedawanego;
  189.                 int iRozmiar = multi_send->send((char*)&odpowiedz, sizeof(Frame));
  190.  
  191.                 // komunikat
  192.                 LPCSTR b;
  193.                 std::string s1 = "Zakupiono paliwa za ";
  194.                 std::string s2 = std::to_string(suma / ilosc_sprzedawanego);
  195.                 std::string s3 = "/L w ilosci ";
  196.                 std::string s4 = std::to_string(ilosc_sprzedawanego);
  197.                 std::string s = s1 + s2 + s3 + s4;
  198.                 b = (LPCSTR)s.c_str();
  199.  
  200.                 MessageBox(nullptr, b, "Otrzymano paliwo", MB_OK);
  201.             }
  202.             break;
  203.         }
  204.         case RACHUNEK_ZA_SPRZEDAZ:
  205.         {
  206.             // ehh no i musze zaplacic
  207.             if (my_vehicle->iID == frame.iID_receiver) {
  208.                 int ilosc_sprzedawanego = frame.transfer_value;
  209.                 TransferSending(frame.iID, FUEL, ilosc_sprzedawanego);
  210.                 int suma = frame.transfer_type;
  211.  
  212.                 // komunikat
  213.                 LPCSTR b;
  214.                 std::string s1 = "Sprzedano paliwa za ";
  215.                 std::string s2 = std::to_string(suma/ ilosc_sprzedawanego);
  216.                 std::string s3 = "/L w ilosci ";
  217.                 std::string s4 = std::to_string(ilosc_sprzedawanego);
  218.                 std::string s = s1 + s2 + s3 + s4;
  219.                 b = (LPCSTR)s.c_str();
  220.  
  221.                 MessageBox(nullptr, b, "Sprzedano paliwo", MB_OK);
  222.  
  223.             }
  224.             break;
  225.         }
  226.         case CHETNIE_KUPIE_BO_MAM_MALO_STRASZNIE:                    
  227.         {
  228.             // zaoferuj kupno jezeli masz odpowiednia ilosc paliwa
  229.             if (my_vehicle->state.amount_of_fuel > 25) {
  230.                 // jak stoje z paliwem
  231.                 double ilosc_do_sprzedania = my_vehicle->state.amount_of_fuel - 25;
  232.                 double cena_za_litr = 10 + ((-frame.state.amount_of_fuel + 4 + PALIWO_STANDARD)/ 2)*MNOZNIK_2_LITROW;
  233.                
  234.                 // jakie zapotrzebowanie oglosil kupujacy
  235.                 double ilosc_sprzedawanego = frame.transfer_value;
  236.                 if (ilosc_do_sprzedania > ilosc_sprzedawanego)
  237.                     ilosc_sprzedawanego = ilosc_do_sprzedania;
  238.                
  239.                 // wyslanie potrzebnego paliwa
  240.                 TransferSending(frame.iID, FUEL, ilosc_sprzedawanego);
  241.  
  242.                 // za ile sprzedam dzwoncie po 0-700
  243.                 int suma = (int)(cena_za_litr * ilosc_sprzedawanego);
  244.  
  245.                 // wyslanei rachunku
  246.                 Frame odpowiedz;
  247.                 odpowiedz.frame_type = RACHUNEK_ZA_ZAKUPY;
  248.                 odpowiedz.vdV_collision = my_vehicle->vdV_collision;
  249.                 odpowiedz.iID = my_vehicle->iID;
  250.                 odpowiedz.iID_receiver = frame.iID;
  251.                 odpowiedz.state = my_vehicle->state;
  252.                 odpowiedz.transfer_type = suma;
  253.                 odpowiedz.transfer_value = ilosc_sprzedawanego;
  254.                 int iRozmiar = multi_send->send((char*)&odpowiedz, sizeof(Frame));
  255.  
  256.                 // komunikat
  257.                 LPCSTR b;
  258.                 std::string s1 = "Sprzedano paliwa za ";
  259.                 std::string s2 = std::to_string(suma / ilosc_sprzedawanego);
  260.                 std::string s3 = "/L w ilosci ";
  261.                 std::string s4 = std::to_string(ilosc_sprzedawanego);
  262.                 std::string s = s1 + s2 + s3 + s4;
  263.                 b = (LPCSTR)s.c_str();
  264.  
  265.                 MessageBox(nullptr, b, "Sprzedano paliwo", MB_OK);
  266.             }
  267.             break;
  268.         }
  269.         case RACHUNEK_ZA_ZAKUPY:
  270.         {
  271.             // ehh no i musze zaplacic
  272.             if (my_vehicle->iID == frame.iID_receiver) {
  273.                 int suma = frame.transfer_type;
  274.                 if (my_vehicle->state.money < suma)
  275.                     suma = my_vehicle->state.money;
  276.                 TransferSending(frame.iID, MONEY, suma);
  277.                 double ilosc_sprzedawanego = frame.transfer_value;
  278.  
  279.                 // komunikat
  280.                 LPCSTR b;
  281.                 std::string s1 = "Zakupiono paliwa za ";
  282.                 std::string s2 = std::to_string(suma/ ilosc_sprzedawanego);
  283.                 std::string s3 = "/L w ilosci ";
  284.                 std::string s4 = std::to_string(ilosc_sprzedawanego);
  285.                 std::string s = s1 + s2 + s3 + s4;
  286.                 b = (LPCSTR)s.c_str();
  287.  
  288.                 MessageBox(nullptr, b, "Otrzymano paliwo", MB_OK);
  289.  
  290.             }
  291.             break;
  292.         }
  293.         // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  294.         case ITEM_TAKING:                     // ramka informuj¹ca, ¿e ktoœ wzi¹³ przedmiot o podanym numerze
  295.         {
  296.             state = frame.state;
  297.             if ((frame.item_number < terrain.number_of_items) && (frame.iID != my_vehicle->iID))
  298.             {
  299.                 terrain.p[frame.item_number].to_take = 0;
  300.                 terrain.p[frame.item_number].if_taken_by_me = 0;
  301.             }
  302.             break;
  303.         }
  304.         case ITEM_RENEWAL:                    // ramka informujaca, ¿e przedmiot wczeœniej wziêty pojawi³ siê znowu w tym samym miejscu
  305.         {
  306.             if (frame.item_number < terrain.number_of_items)
  307.                 terrain.p[frame.item_number].to_take = 1;
  308.             break;
  309.         }
  310.         case COLLISION:                       // ramka informuj¹ca o tym, ¿e Object uleg³ kolizji
  311.         {
  312.             if (frame.iID_receiver == my_vehicle->iID)  // ID pojazdu, który uczestniczy³ w kolizji zgadza siê z moim ID
  313.             {
  314.                 my_vehicle->vdV_collision = frame.vdV_collision;     // przepisuje poprawkê w³asnej prêdkoœci
  315.                 my_vehicle->iID_collider = my_vehicle->iID;         // ustawiam nr. kolidujacego jako w³asny na znak, ¿e powinienem poprawiæ prêdkoœæ
  316.             }
  317.             break;
  318.         }
  319.         case TRANSFER:                       // ramka informuj¹ca o przelewie pieniê¿nym lub przekazaniu towaru    
  320.         {
  321.             if (frame.iID_receiver == my_vehicle->iID)  // ID pojazdu, ktory otrzymal przelew zgadza siê z moim ID
  322.             {
  323.                 if (frame.transfer_type == MONEY)
  324.                     my_vehicle->state.money += frame.transfer_value;
  325.                 else if (frame.transfer_type == FUEL)
  326.                     my_vehicle->state.amount_of_fuel += frame.transfer_value;
  327.  
  328.                 // nale¿a³oby jeszcze przelew potwierdziæ (w UDP ramki mog¹ byæ gubione!)
  329.             }
  330.             break;
  331.         }
  332.  
  333.         } // switch po typach ramek
  334.           // Opuszczenie ścieżki krytycznej / Release the Critical section
  335.         LeaveCriticalSection(&m_cs);               // wyjście ze ścieżki krytycznej
  336.     }  // while(1)
  337.     return 1;
  338. }
  339.  
  340. // *****************************************************************
  341. // ****    Wszystko co trzeba zrobiæ podczas uruchamiania aplikacji
  342. // ****    poza grafik¹  
  343. void InteractionInitialisation()
  344. {
  345.     DWORD dwThreadId;
  346.  
  347.     my_vehicle = new MovableObject(&terrain);    // tworzenie wlasnego obiektu
  348.     if (if_different_skills == false)
  349.         my_vehicle->planting_skills = my_vehicle->money_collection_skills = my_vehicle->fuel_collection_skills = 1.0;
  350.  
  351.     ap = new AutoPilot();
  352.  
  353.     VW_cycle_time = clock();             // pomiar aktualnego czasu
  354.  
  355.                                          // obiekty sieciowe typu multicast (z podaniem adresu WZR oraz numeru portu)
  356.     multi_reciv = new multicast_net("224.15.12.120", 20000);      // Object do odbioru ramek sieciowych
  357.     multi_send = new multicast_net("224.15.12.120", 20000);       // Object do wysy³ania ramek
  358.  
  359.                                                                   // uruchomienie watku obslugujacego odbior komunikatow
  360.     threadReciv = CreateThread(
  361.         NULL,                        // no security attributes
  362.         0,                           // use default stack size
  363.         ReceiveThreadFunction,       // thread function
  364.         (void *)multi_reciv,         // argument to thread function
  365.         0,                           // use default creation flags
  366.         &dwThreadId);                // returns the thread identifier
  367.  
  368. }
  369.  
  370.  
  371. // *****************************************************************
  372. // ****    Wszystko co trzeba zrobiæ w ka¿dym cyklu dzia³ania
  373. // ****    aplikacji poza grafik¹
  374. void VirtualWorldCycle()
  375. {
  376.  
  377.     // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  378.     // o ale mam duzo benzyny o matko
  379.     if (my_vehicle->state.amount_of_fuel > 60 && blokada_czasowa == false) {
  380.         Frame frame;
  381.         frame.frame_type = KOMU_KOMU_BO_IDE_DO_DOMU;
  382.         frame.vdV_collision = my_vehicle->vdV_collision;
  383.         frame.iID = my_vehicle->iID;
  384.         frame.state = my_vehicle->state;
  385.         frame.transfer_value = my_vehicle->state.amount_of_fuel - 60;
  386.         MessageBox(main_window, "Wyslano zapytanie o sprzedaz nadmiaru paliwa", "O prosze", MB_OK);
  387.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  388.         blokada_czasowa = true;
  389.     } else
  390.     if (my_vehicle->state.amount_of_fuel < 15 && blokada_czasowa == false) {
  391.         Frame frame;
  392.         frame.frame_type = CHETNIE_KUPIE_BO_MAM_MALO_STRASZNIE;
  393.         frame.vdV_collision = my_vehicle->vdV_collision;
  394.         frame.iID = my_vehicle->iID;
  395.         frame.state = my_vehicle->state;
  396.         frame.transfer_value = 25 - my_vehicle->state.amount_of_fuel;
  397.         MessageBox(main_window, "Wyslano zapytanie o wysylke paliwa", "O prosze", MB_OK);
  398.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  399.         blokada_czasowa = true;
  400.     }
  401.  
  402.     // MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  403.  
  404.     counter_of_simulations++;
  405.     // obliczenie œredniego czasu pomiêdzy dwoma kolejnnymi symulacjami po to, by zachowaæ  fizycznych
  406.     if (counter_of_simulations % 50 == 0)          // jeśli licznik cykli przekroczy³ pewn¹ wartoœæ, to
  407.     {                                              // należy na nowo obliczyæ œredni czas cyklu fDt
  408.         char text[200];
  409.         long prev_time = VW_cycle_time;
  410.         VW_cycle_time = clock();
  411.         float fFps = (50 * CLOCKS_PER_SEC) / (float)(VW_cycle_time - prev_time);
  412.         if (fFps != 0) fDt = 1.0 / fFps; else fDt = 1;
  413.  
  414.         sprintf(par_view.inscription1, " %0.0f_fps, fuel = %0.2f, money = %d", fFps, my_vehicle->state.amount_of_fuel, my_vehicle->state.money);
  415.         if (counter_of_simulations % 500 == 0) sprintf(par_view.inscription2, "");
  416.         if (counter_of_simulations % 700 == 0) blokada_czasowa = false;
  417.     }
  418.  
  419.     if (autopilot_presentation_mode)
  420.     {
  421.         ap->AutoControl(my_vehicle);
  422.         terrain.DeleteObjectsFromSectors(my_vehicle);
  423.         my_vehicle->Simulation(autopilot_time_step);
  424.         terrain.InsertObjectIntoSectors(my_vehicle);
  425.         autopilot_presentation_current_time += autopilot_time_step;
  426.         sprintf(par_view.inscription2, "POKAZ TESTU AUTOPILOTA: CZAS = %f", autopilot_presentation_current_time);
  427.         if (autopilot_presentation_current_time >= autopilot_test_time)
  428.         {
  429.             autopilot_presentation_mode = false;
  430.             MessageBox(main_window, "Koniec pokazu testu autopilota", "Czy chcesz zamknac program?", MB_OK);
  431.             SendMessage(main_window, WM_DESTROY, 0, 0);
  432.         }
  433.  
  434.     }
  435.     else
  436.     {
  437.         terrain.DeleteObjectsFromSectors(my_vehicle);
  438.         my_vehicle->Simulation(fDt);                    // symulacja w³asnego obiektu
  439.         terrain.InsertObjectIntoSectors(my_vehicle);
  440.     }
  441.  
  442.  
  443.     if ((my_vehicle->iID_collider > -1) &&             // wykryto kolizjê - wysy³am specjaln¹ ramkê, by poinformowaæ o tym drugiego uczestnika
  444.         (my_vehicle->iID_collider != my_vehicle->iID)) // oczywiœcie wtedy, gdy nie chodzi o mój pojazd
  445.     {
  446.         Frame frame;
  447.         frame.frame_type = COLLISION;
  448.         frame.iID_receiver = my_vehicle->iID_collider;
  449.         frame.vdV_collision = my_vehicle->vdV_collision;
  450.         frame.iID = my_vehicle->iID;
  451.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  452.  
  453.         char text[128];
  454.         sprintf(par_view.inscription2, "Kolizja_z_obiektem_o_ID = %d", my_vehicle->iID_collider);
  455.         //SetWindowText(main_window,text);
  456.  
  457.         my_vehicle->iID_collider = -1;
  458.     }
  459.  
  460.     // wyslanie komunikatu o stanie obiektu przypisanego do aplikacji (my_vehicle):    
  461.  
  462.     Frame frame;
  463.     frame.frame_type = OBJECT_STATE;
  464.     frame.state = my_vehicle->State();         // state w³asnego obiektu
  465.     frame.iID = my_vehicle->iID;
  466.     frame.existing_time = clock() - start_time;
  467.     int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  468.  
  469.  
  470.  
  471.     // wziêcie przedmiotu -> wysy³anie ramki
  472.     if (my_vehicle->number_of_taking_item > -1)
  473.     {
  474.         Frame frame;
  475.         frame.frame_type = ITEM_TAKING;
  476.         frame.item_number = my_vehicle->number_of_taking_item;
  477.         frame.state = my_vehicle->State();
  478.         frame.iID = my_vehicle->iID;
  479.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  480.  
  481.         sprintf(par_view.inscription2, "Wziecie_przedmiotu_o_wartosci_ %f", my_vehicle->taking_value);
  482.  
  483.         my_vehicle->number_of_taking_item = -1;
  484.         my_vehicle->taking_value = 0;
  485.     }
  486.  
  487.     // odnawianie siê przedmiotu -> wysy³anie ramki
  488.     if (my_vehicle->number_of_renewed_item > -1)
  489.     {                             // jeœli min¹³ pewnien okres czasu przedmiot mo¿e zostaæ przywrócony
  490.         Frame frame;
  491.         frame.frame_type = ITEM_RENEWAL;
  492.         frame.item_number = my_vehicle->number_of_renewed_item;
  493.         frame.iID = my_vehicle->iID;
  494.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  495.  
  496.  
  497.         my_vehicle->number_of_renewed_item = -1;
  498.     }
  499.  
  500.  
  501.  
  502.     // --------------------------------------------------------------------
  503.     // --------------- MIEJSCE NA ALGORYTM STEROWANIA ---------------------
  504.     // (dobór si³y F w granicach (-F_max/2, F_max), k¹ta skrêtu kó³ wheel_turn_angle (-alpha_max, alpha_max) oraz
  505.     // si³y o hamowania breaking_degree (0,1) [+ decyzji w zwi¹zku ze wspó³prac¹] w zale¿noœci od sytuacji)
  506.     if (if_autonomous_control)
  507.     {
  508.         ap->AutoControl(my_vehicle);
  509.         sprintf(par_view.inscription2, "F=%f,_ham=%f,_alfa=%f", my_vehicle->F, my_vehicle->breaking_degree, my_vehicle->state.wheel_turn_angle);
  510.     }
  511.  
  512.  
  513. }
  514.  
  515. // *****************************************************************
  516. // ****    Wszystko co trzeba zrobiæ podczas zamykania aplikacji
  517. // ****    poza grafik¹
  518. void EndOfInteraction()
  519. {
  520.     fprintf(f, "Koniec interakcji\n");
  521.     fclose(f);
  522. }
  523.  
  524. // Funkcja wysylajaca ramke z przekazem, zwraca zrealizowan¹ wartoœæ przekazu
  525. float TransferSending(int ID_receiver, int transfer_type, float transfer_value)
  526. {
  527.     Frame frame;
  528.     frame.frame_type = TRANSFER;
  529.     frame.iID_receiver = ID_receiver;
  530.     frame.transfer_type = transfer_type;
  531.     frame.transfer_value = transfer_value;
  532.     frame.iID = my_vehicle->iID;
  533.  
  534.     // tutaj nale¿a³oby uzyskaæ potwierdzenie przekazu zanim sumy zostan¹ odjête
  535.     if (transfer_type == MONEY)
  536.     {
  537.         if (my_vehicle->state.money < transfer_value)
  538.             frame.transfer_value = my_vehicle->state.money;
  539.         my_vehicle->state.money -= frame.transfer_value;
  540.         sprintf(par_view.inscription2, "Przelew_sumy_ %f _na_rzecz_ID_ %d", transfer_value, ID_receiver);
  541.     }
  542.     else if (transfer_type == FUEL)
  543.     {
  544.         if (my_vehicle->state.amount_of_fuel < transfer_value)
  545.             frame.transfer_value = my_vehicle->state.amount_of_fuel;
  546.         my_vehicle->state.amount_of_fuel -= frame.transfer_value;
  547.         sprintf(par_view.inscription2, "Przekazanie_paliwa_w_ilosci_ %f _na_rzecz_ID_ %d", transfer_value, ID_receiver);
  548.     }
  549.  
  550.     if (frame.transfer_value > 0)
  551.         int iRozmiar = multi_send->send((char*)&frame, sizeof(Frame));
  552.  
  553.     return frame.transfer_value;
  554. }
  555.  
  556.  
  557.  
  558.  
  559.  
  560. //deklaracja funkcji obslugi okna
  561. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  562.  
  563.  
  564. HWND main_window;                   // uchwyt do okna aplikacji
  565. HDC g_context = NULL;        // uchwyt kontekstu graficznego
  566.  
  567. bool terrain_edition_mode = 0;
  568.  
  569. //funkcja Main - dla Windows
  570. int WINAPI WinMain(HINSTANCE hInstance,
  571.     HINSTANCE hPrevInstance,
  572.     LPSTR     lpCmdLine,
  573.     int       nCmdShow)
  574. {
  575.     //Initilize the critical section:
  576.     InitializeCriticalSection(&m_cs);
  577.  
  578.     MSG system_message;       //innymi slowy "komunikat"
  579.     WNDCLASS window_class; //klasa głównego okna aplikacji
  580.  
  581.     static char class_name[] = "Basic";
  582.  
  583.     //Definiujemy klase głównego okna aplikacji
  584.     //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
  585.     //adres funkcji przetwarzajacej komunikaty
  586.     window_class.style = CS_HREDRAW | CS_VREDRAW;
  587.     window_class.lpfnWndProc = WndProc; //adres funkcji realizującej przetwarzanie meldunków
  588.     window_class.cbClsExtra = 0;
  589.     window_class.cbWndExtra = 0;
  590.     window_class.hInstance = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu
  591.     window_class.hIcon = 0;
  592.     window_class.hCursor = LoadCursor(0, IDC_ARROW);
  593.     window_class.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
  594.     window_class.lpszMenuName = "Menu";
  595.     window_class.lpszClassName = class_name;
  596.  
  597.     //teraz rejestrujemy klasę okna głównego
  598.     RegisterClass(&window_class);
  599.  
  600.     /*tworzymy main_window główne
  601.     main_window będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym
  602.     i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu
  603.     będzie widoczne na ekranie */
  604.     main_window = CreateWindow(class_name, "WZR 2018/19, temat 4, wersja g [Y-autopilot, F10-test autop.]", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
  605.         100, 100, 1200, 800, NULL, NULL, hInstance, NULL);
  606.  
  607.  
  608.     ShowWindow(main_window, nCmdShow);
  609.  
  610.     //odswiezamy zawartosc okna
  611.     UpdateWindow(main_window);
  612.  
  613.  
  614.  
  615.     // GŁÓWNA PĘTLA PROGRAMU
  616.  
  617.     // pobranie komunikatu z kolejki jeśli funkcja PeekMessage zwraca wartość inną niż FALSE,
  618.     // w przeciwnym wypadku symulacja wirtualnego świata wraz z wizualizacją
  619.     ZeroMemory(&system_message, sizeof(system_message));
  620.     while (system_message.message != WM_QUIT)
  621.     {
  622.         if (PeekMessage(&system_message, NULL, 0U, 0U, PM_REMOVE))
  623.         {
  624.             TranslateMessage(&system_message);
  625.             DispatchMessage(&system_message);
  626.         }
  627.         else
  628.         {
  629.             VirtualWorldCycle();    // Cykl wirtualnego świata
  630.             InvalidateRect(main_window, NULL, FALSE);
  631.         }
  632.     }
  633.  
  634.     return (int)system_message.wParam;
  635. }
  636.  
  637. // ************************************************************************
  638. // ****    Obs³uga klawiszy s³u¿¹cych do sterowania obiektami lub
  639. // ****    widokami
  640. void MessagesHandling(UINT message_type, WPARAM wParam, LPARAM lParam)
  641. {
  642.  
  643.     int LCONTROL = GetKeyState(VK_LCONTROL);
  644.     int RCONTROL = GetKeyState(VK_RCONTROL);
  645.     int LALT = GetKeyState(VK_LMENU);
  646.     int RALT = GetKeyState(VK_RMENU);
  647.  
  648.  
  649.     switch (message_type)
  650.     {
  651.  
  652.     case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
  653.     {
  654.         int x = LOWORD(lParam);
  655.         int y = HIWORD(lParam);
  656.         if (mouse_control)
  657.             my_vehicle->F = my_vehicle->F_max;        // si³a pchaj¹ca do przodu
  658.  
  659.         break;
  660.     }
  661.     case WM_RBUTTONDOWN: //reakcja na prawy przycisk myszki
  662.     {
  663.         int x = LOWORD(lParam);
  664.         int y = HIWORD(lParam);
  665.         int LSHIFT = GetKeyState(VK_LSHIFT);   // sprawdzenie czy lewy Shift wciśnięty, jeśli tak, to LSHIFT == 1
  666.         int RSHIFT = GetKeyState(VK_RSHIFT);
  667.  
  668.         if (mouse_control)
  669.             my_vehicle->F = -my_vehicle->F_max / 2;        // si³a pchaj¹ca do tylu
  670.         else if (wParam & MK_SHIFT)                    // odznaczanie wszystkich obiektów  
  671.         {
  672.             for (long i = 0; i < terrain.number_of_selected_items; i++)
  673.                 terrain.p[terrain.selected_items[i]].if_selected = 0;
  674.             terrain.number_of_selected_items = 0;
  675.         }
  676.         else                                          // zaznaczenie obiektów
  677.         {
  678.             RECT r;
  679.             //GetWindowRect(main_window,&r);
  680.             GetClientRect(main_window, &r);
  681.             //Vector3 w = Cursor3dCoordinates(x, r.bottom - r.top - y);
  682.             Vector3 w = terrain.Cursor3D_CoordinatesWithoutParallax(x, r.bottom - r.top - y);
  683.  
  684.  
  685.             //float radius = (w - point_click).length();
  686.             float min_dist = 1e10;
  687.             long index_min = -1;
  688.             bool if_movable_obj;
  689.             for (map<int, MovableObject*>::iterator it = network_vehicles.begin(); it != network_vehicles.end(); ++it)
  690.             {
  691.                 if (it->second)
  692.                 {
  693.                     MovableObject *ob = it->second;
  694.                     float xx, yy, zz;
  695.                     ScreenCoordinates(&xx, &yy, &zz, ob->state.vPos);
  696.                     yy = r.bottom - r.top - yy;
  697.                     float odl_kw = (xx - x)*(xx - x) + (yy - y)*(yy - y);
  698.                     if (min_dist > odl_kw)
  699.                     {
  700.                         min_dist = odl_kw;
  701.                         index_min = ob->iID;
  702.                         if_movable_obj = 1;
  703.                     }
  704.                 }
  705.             }
  706.  
  707.  
  708.             // trzeba to przerobić na wersję sektorową, gdyż przedmiotów może być dużo!
  709.             // niestety nie jest to proste.
  710.  
  711.             //Item **item_tab_pointer = NULL;
  712.             //long number_of_items_in_radius = terrain.ItemsInRadius(&item_tab_pointer, w,100);
  713.  
  714.             for (long i = 0; i < terrain.number_of_items; i++)
  715.             {
  716.                 float xx, yy, zz;
  717.                 Vector3 placement;
  718.                 if ((terrain.p[i].type == ITEM_EDGE) || (terrain.p[i].type == ITEM_WALL))
  719.                 {
  720.                     placement = (terrain.p[terrain.p[i].param_i[0]].vPos + terrain.p[terrain.p[i].param_i[1]].vPos) / 2;
  721.                 }
  722.                 else
  723.                     placement = terrain.p[i].vPos;
  724.                 ScreenCoordinates(&xx, &yy, &zz, placement);
  725.                 yy = r.bottom - r.top - yy;
  726.                 float odl_kw = (xx - x)*(xx - x) + (yy - y)*(yy - y);
  727.                 if (min_dist > odl_kw)
  728.                 {
  729.                     min_dist = odl_kw;
  730.                     index_min = i;
  731.                     if_movable_obj = 0;
  732.                 }
  733.             }
  734.  
  735.             if (index_min > -1)
  736.             {
  737.                 //fprintf(f,"zaznaczono przedmiot %d pol = (%f, %f, %f)\n",ind_min,terrain.p[ind_min].vPos.x,terrain.p[ind_min].vPos.y,terrain.p[ind_min].vPos.z);
  738.                 //terrain.p[ind_min].if_selected = 1 - terrain.p[ind_min].if_selected;
  739.                 if (if_movable_obj)
  740.                 {
  741.                     network_vehicles[index_min]->if_selected = 1 - network_vehicles[index_min]->if_selected;
  742.  
  743.                     if (network_vehicles[index_min]->if_selected)
  744.                         sprintf(par_view.inscription2, "zaznaczono_ obiekt_ID_%d", network_vehicles[index_min]->iID);
  745.                 }
  746.                 else
  747.                 {
  748.                     terrain.SelectUnselectItemOrGroup(index_min);
  749.                 }
  750.                 //char lan[256];
  751.                 //sprintf(lan, "klikniêto w przedmiot %d pol = (%f, %f, %f)\n",ind_min,terrain.p[ind_min].vPos.x,terrain.p[ind_min].vPos.y,terrain.p[ind_min].vPos.z);
  752.                 //SetWindowText(main_window,lan);
  753.             }
  754.             Vector3 point_click = Cursor3dCoordinates(x, r.bottom - r.top - y);
  755.  
  756.         }
  757.  
  758.         break;
  759.     }
  760.     case WM_MBUTTONDOWN: //reakcja na œrodkowy przycisk myszki : uaktywnienie/dezaktywacja sterwania myszkowego
  761.     {
  762.         mouse_control = 1 - mouse_control;
  763.         cursor_x = LOWORD(lParam);
  764.         cursor_y = HIWORD(lParam);
  765.         break;
  766.     }
  767.     case WM_LBUTTONUP: //reakcja na puszczenie lewego przycisku myszki
  768.     {
  769.         if (mouse_control)
  770.             my_vehicle->F = 0.0;        // si³a pchaj¹ca do przodu
  771.         break;
  772.     }
  773.     case WM_RBUTTONUP: //reakcja na puszczenie lewy przycisk myszki
  774.     {
  775.         if (mouse_control)
  776.             my_vehicle->F = 0.0;        // si³a pchaj¹ca do przodu
  777.         break;
  778.     }
  779.     case WM_MOUSEMOVE:
  780.     {
  781.         int x = LOWORD(lParam);
  782.         int y = HIWORD(lParam);
  783.         if (mouse_control)
  784.         {
  785.             float wheel_turn_angle = (float)(cursor_x - x) / 20;
  786.             if (wheel_turn_angle > 45) wheel_turn_angle = 45;
  787.             if (wheel_turn_angle < -45) wheel_turn_angle = -45;
  788.             my_vehicle->state.wheel_turn_angle = PI*wheel_turn_angle / 180;
  789.         }
  790.         break;
  791.     }
  792.     case WM_MOUSEWHEEL:     // ruch kó³kiem myszy -> przybli¿anie, oddalanie widoku
  793.     {
  794.         int zDelta = GET_WHEEL_DELTA_WPARAM(wParam);  // dodatni do przodu, ujemny do ty³u
  795.                                                       //fprintf(f,"zDelta = %d\n",zDelta);          // zwykle +-120, jak siê bardzo szybko zakrêci to czasmi wyjdzie +-240
  796.         if (zDelta > 0) {
  797.             if (par_view.distance > 0.5) par_view.distance /= 1.2;
  798.             else par_view.distance = 0;
  799.         }
  800.         else {
  801.             if (par_view.distance > 0) par_view.distance *= 1.2;
  802.             else par_view.distance = 0.5;
  803.         }
  804.  
  805.         break;
  806.     }
  807.     case WM_KEYDOWN:
  808.     {
  809.  
  810.         switch (LOWORD(wParam))
  811.         {
  812.         case VK_SHIFT:
  813.         {
  814.             SHIFT_pressed = 1;
  815.             break;
  816.         }
  817.         case VK_CONTROL:
  818.         {
  819.             CTRL_pressed = 1;
  820.             break;
  821.         }
  822.         case VK_MENU:
  823.         {
  824.             ALT_pressed = 1;
  825.             break;
  826.         }
  827.  
  828.         case VK_SPACE:
  829.         {
  830.             my_vehicle->breaking_degree = 1.0;       // stopieñ hamowania (reszta zale¿y od si³y docisku i wsp. tarcia)
  831.             break;                       // 1.0 to maksymalny stopieñ (np. zablokowanie kó³)
  832.         }
  833.         case VK_UP:
  834.         {
  835.             if (CTRL_pressed && par_view.top_view)
  836.                 par_view.shift_to_bottom += par_view.distance / 2;       // przesunięcie widoku z kamery w górę
  837.             else
  838.                 my_vehicle->F = my_vehicle->F_max;        // si³a pchaj¹ca do przodu
  839.             break;
  840.         }
  841.         case VK_DOWN:
  842.         {
  843.             if (CTRL_pressed && par_view.top_view)
  844.                 par_view.shift_to_bottom -= par_view.distance / 2;       // przesunięcie widoku z kamery w dół
  845.             else
  846.                 my_vehicle->F = -my_vehicle->F_max / 2;        // sila pchajaca do tylu
  847.             break;
  848.         }
  849.         case VK_LEFT:
  850.         {
  851.             if (CTRL_pressed && par_view.top_view)
  852.                 par_view.shift_to_right += par_view.distance / 2;
  853.             else
  854.             {
  855.                 if (my_vehicle->wheel_turn_speed < 0) {
  856.                     my_vehicle->wheel_turn_speed = 0;
  857.                     my_vehicle->if_keep_steer_wheel = true;
  858.                 }
  859.                 else {
  860.                     if (SHIFT_pressed) my_vehicle->wheel_turn_speed = 0.5;
  861.                     else my_vehicle->wheel_turn_speed = 0.5 / 4;
  862.                 }
  863.             }
  864.  
  865.             break;
  866.         }
  867.         case VK_RIGHT:
  868.         {
  869.             if (CTRL_pressed && par_view.top_view)
  870.                 par_view.shift_to_right -= par_view.distance / 2;
  871.             else
  872.             {
  873.                 if (my_vehicle->wheel_turn_speed > 0) {
  874.                     my_vehicle->wheel_turn_speed = 0;
  875.                     my_vehicle->if_keep_steer_wheel = true;
  876.                 }
  877.                 else {
  878.                     if (SHIFT_pressed) my_vehicle->wheel_turn_speed = -0.5;
  879.                     else my_vehicle->wheel_turn_speed = -0.5 / 4;
  880.                 }
  881.             }
  882.             break;
  883.         }
  884.         case VK_HOME:
  885.         {
  886.             if (CTRL_pressed && par_view.top_view)
  887.                 par_view.shift_to_right = par_view.shift_to_bottom = 0;
  888.  
  889.             break;
  890.         }
  891.         case 'W':   // przybli¿enie widoku
  892.         {
  893.             //initial_camera_position = initial_camera_position - initial_camera_direction*0.3;
  894.             if (par_view.distance > 0.5)par_view.distance /= 1.2;
  895.             else par_view.distance = 0;
  896.             break;
  897.         }
  898.         case 'S':   // distance widoku
  899.         {
  900.             //initial_camera_position = initial_camera_position + initial_camera_direction*0.3;
  901.             if (par_view.distance > 0) par_view.distance *= 1.2;
  902.             else par_view.distance = 0.5;
  903.             break;
  904.         }
  905.         case 'Q':   // widok z góry
  906.         {
  907.             par_view.top_view = 1 - par_view.top_view;
  908.             if (par_view.top_view)
  909.                 SetWindowText(main_window, "Włączono widok z góry!");
  910.             else
  911.                 SetWindowText(main_window, "Wyłączono widok z góry.");
  912.             break;
  913.         }
  914.         case 'E':   // obrót kamery ku górze (wzglêdem lokalnej osi z)
  915.         {
  916.             par_view.cam_angle_z += PI * 5 / 180;
  917.             break;
  918.         }
  919.         case 'D':   // obrót kamery ku do³owi (wzglêdem lokalnej osi z)
  920.         {
  921.             par_view.cam_angle_z -= PI * 5 / 180;
  922.             break;
  923.         }
  924.         case 'A':   // w³¹czanie, wy³¹czanie trybu œledzenia obiektu
  925.         {
  926.             par_view.tracking = 1 - par_view.tracking;
  927.             break;
  928.         }
  929.         case 'Z':   // zoom - zmniejszenie k¹ta widzenia
  930.         {
  931.             par_view.zoom /= 1.1;
  932.             RECT rc;
  933.             GetClientRect(main_window, &rc);
  934.             WindowSizeChange(rc.right - rc.left, rc.bottom - rc.top);
  935.             break;
  936.         }
  937.         case 'X':   // zoom - zwiêkszenie k¹ta widzenia
  938.         {
  939.             par_view.zoom *= 1.1;
  940.             RECT rc;
  941.             GetClientRect(main_window, &rc);
  942.             WindowSizeChange(rc.right - rc.left, rc.bottom - rc.top);
  943.             break;
  944.         }
  945.  
  946.         case 'F':  // przekazanie 10 kg paliwa pojazdom zaznaczonym
  947.         {
  948.             for (map<int, MovableObject*>::iterator it = network_vehicles.begin(); it != network_vehicles.end(); ++it)
  949.             {
  950.                 if (it->second)
  951.                 {
  952.                     MovableObject *ob = it->second;
  953.                     if (ob->if_selected)
  954.                         float ilosc_p = TransferSending(ob->iID, FUEL, 10);
  955.                 }
  956.             }
  957.             break;
  958.         }
  959.         case 'G':  // przekazanie 100 jednostek gotowki pojazdom zaznaczonym
  960.         {
  961.             for (map<int, MovableObject*>::iterator it = network_vehicles.begin(); it != network_vehicles.end(); ++it)
  962.             {
  963.                 if (it->second)
  964.                 {
  965.                     MovableObject *ob = it->second;
  966.                     if (ob->if_selected)
  967.                         float ilosc_p = TransferSending(ob->iID, MONEY, 100);
  968.                 }
  969.             }
  970.             break;
  971.         }
  972.         case 'Y':
  973.             if (if_autonomous_control) if_autonomous_control = false;
  974.             else if_autonomous_control = true;
  975.  
  976.             if (if_autonomous_control)
  977.                 sprintf(par_view.inscription1, "Wlaczenie_autosterowania,_teraz_pojazd_staje_sie_samochodem");
  978.             else
  979.             {
  980.                 my_vehicle->state.wheel_turn_angle = my_vehicle->F = my_vehicle->breaking_degree = 0;
  981.                 sprintf(par_view.inscription1, "Wylaczenie_autosterowania");
  982.             }
  983.             break;
  984.         case 'L':     // rozpoczęcie zaznaczania metodą lasso
  985.             L_pressed = true;
  986.             break;
  987.         case VK_F10:  // sumulacja automatycznego sterowania obiektem w celu jego oceny poza czasem rzeczywistym
  988.         {
  989.             //float czas_proby = 600;               // czas testu w sekundach
  990.             bool if_parameters_optimal = true;    // pe³ne umiejêtnoœci, sta³y czas kroku
  991.             Terrain t2;
  992.             MovableObject *Object = new MovableObject(&t2);
  993.             //AutoPilot *a = new AutoPilot(&t2,Object);
  994.             float time_step = -1;
  995.             if (if_parameters_optimal)
  996.             {
  997.                 Object->planting_skills = Object->money_collection_skills = Object->fuel_collection_skills = 1.0;
  998.                 time_step = autopilot_time_step;
  999.             }
  1000.             else
  1001.             {
  1002.                 Object->planting_skills = my_vehicle->planting_skills;
  1003.                 Object->money_collection_skills = my_vehicle->money_collection_skills;
  1004.                 Object->fuel_collection_skills = my_vehicle->fuel_collection_skills;
  1005.                 time_step = fDt;
  1006.             }
  1007.             long money_at_start = Object->state.money;
  1008.  
  1009.             char lanc[256];
  1010.             sprintf(lanc, "Test sterowania autonomicznego dla um.got = %1.1f, um.pal = %1.1f, krok = %f[s], - prosze czekac!", Object->money_collection_skills, Object->fuel_collection_skills, time_step);
  1011.             SetWindowText(main_window, lanc);
  1012.             long t_start = clock();
  1013.  
  1014.  
  1015.             ap->ControlTest(Object, time_step, autopilot_test_time);
  1016.  
  1017.  
  1018.             char lan[512], lan1[512];
  1019.             sprintf(lan, "Uzyskano %d gotowki w ciagu %f sekund (krok = %f), ilosc paliwa = %f, czy pokazac caly test?", Object->state.money - money_at_start, autopilot_test_time, time_step, Object->state.amount_of_fuel);
  1020.             sprintf(lan1, "Test autonomicznego sterowania, czas testu = %f s.", (float)(clock() - t_start) / CLOCKS_PER_SEC);
  1021.             int result = MessageBox(main_window, lan, lan1, MB_YESNO);
  1022.             if (result == 6)
  1023.             {
  1024.                 autopilot_presentation_mode = true;
  1025.                 autopilot_presentation_current_time = 0;
  1026.                 my_vehicle->planting_skills = my_vehicle->money_collection_skills = my_vehicle->fuel_collection_skills = 1.0;
  1027.             }
  1028.  
  1029.  
  1030.             break;
  1031.         }
  1032.  
  1033.  
  1034.         } // switch po klawiszach
  1035.  
  1036.         break;
  1037.     }
  1038.  
  1039.     case WM_KEYUP:
  1040.     {
  1041.         switch (LOWORD(wParam))
  1042.         {
  1043.         case VK_SHIFT:
  1044.         {
  1045.             SHIFT_pressed = 0;
  1046.             break;
  1047.         }
  1048.         case VK_CONTROL:
  1049.         {
  1050.             CTRL_pressed = 0;
  1051.             break;
  1052.         }
  1053.         case VK_MENU:
  1054.         {
  1055.             ALT_pressed = 0;
  1056.             break;
  1057.         }
  1058.         case 'L':     // zakonczenie zaznaczania metodą lasso
  1059.             L_pressed = false;
  1060.             break;
  1061.         case VK_SPACE:
  1062.         {
  1063.             my_vehicle->breaking_degree = 0.0;
  1064.             break;
  1065.         }
  1066.         case VK_UP:
  1067.         {
  1068.             my_vehicle->F = 0.0;
  1069.  
  1070.             break;
  1071.         }
  1072.         case VK_DOWN:
  1073.         {
  1074.             my_vehicle->F = 0.0;
  1075.             break;
  1076.         }
  1077.         case VK_LEFT:
  1078.         {
  1079.             if (my_vehicle->if_keep_steer_wheel) my_vehicle->wheel_turn_speed = -0.5 / 4;
  1080.             else my_vehicle->wheel_turn_speed = 0;
  1081.             my_vehicle->if_keep_steer_wheel = false;
  1082.             break;
  1083.         }
  1084.         case VK_RIGHT:
  1085.         {
  1086.             if (my_vehicle->if_keep_steer_wheel) my_vehicle->wheel_turn_speed = 0.5 / 4;
  1087.             else my_vehicle->wheel_turn_speed = 0;
  1088.             my_vehicle->if_keep_steer_wheel = false;
  1089.             break;
  1090.         }
  1091.  
  1092.         }
  1093.  
  1094.         break;
  1095.     }
  1096.  
  1097.     } // switch po komunikatach
  1098. }
  1099.  
  1100. /********************************************************************
  1101. FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/
  1102. LRESULT CALLBACK WndProc(HWND main_window, UINT message_type, WPARAM wParam, LPARAM lParam)
  1103. {
  1104.  
  1105.     // PONIŻSZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI
  1106.  
  1107.  
  1108.     MessagesHandling(message_type, wParam, lParam);
  1109.  
  1110.     switch (message_type)
  1111.     {
  1112.     case WM_CREATE:  //system_message wysyłany w momencie tworzenia okna
  1113.     {
  1114.  
  1115.         g_context = GetDC(main_window);
  1116.  
  1117.         srand((unsigned)time(NULL));
  1118.         int result = GraphicsInitialization(g_context);
  1119.         if (result == 0)
  1120.         {
  1121.             printf("nie udalo sie otworzyc okna graficznego\n");
  1122.             //exit(1);
  1123.         }
  1124.  
  1125.         InteractionInitialisation();
  1126.  
  1127.         SetTimer(main_window, 1, 10, NULL);
  1128.  
  1129.         return 0;
  1130.     }
  1131.     case WM_KEYDOWN:
  1132.     {
  1133.         switch (LOWORD(wParam))
  1134.         {
  1135.         case VK_F1:  // wywolanie systemu pomocy
  1136.         {
  1137.             char lan[1024], lan_bie[1024];
  1138.             //GetSystemDirectory(lan_sys,1024);
  1139.             GetCurrentDirectory(1024, lan_bie);
  1140.             strcpy(lan, "C:\\Program Files\\Internet Explorer\\iexplore ");
  1141.             strcat(lan, lan_bie);
  1142.             strcat(lan, "\\pomoc.htm");
  1143.             int wyni = WinExec(lan, SW_NORMAL);
  1144.             if (wyni < 32)  // proba uruchominia pomocy nie powiodla sie
  1145.             {
  1146.                 strcpy(lan, "C:\\Program Files\\Mozilla Firefox\\firefox ");
  1147.                 strcat(lan, lan_bie);
  1148.                 strcat(lan, "\\pomoc.htm");
  1149.                 wyni = WinExec(lan, SW_NORMAL);
  1150.                 if (wyni < 32)
  1151.                 {
  1152.                     char lan_win[1024];
  1153.                     GetWindowsDirectory(lan_win, 1024);
  1154.                     strcat(lan_win, "\\notepad pomoc.txt ");
  1155.                     wyni = WinExec(lan_win, SW_NORMAL);
  1156.                 }
  1157.             }
  1158.             break;
  1159.         }
  1160.         case VK_ESCAPE:   // wyjście z programu
  1161.         {
  1162.             SendMessage(main_window, WM_DESTROY, 0, 0);
  1163.             break;
  1164.         }
  1165.         }
  1166.         return 0;
  1167.     }
  1168.  
  1169.     case WM_PAINT:
  1170.     {
  1171.         PAINTSTRUCT paint;
  1172.         HDC context;
  1173.         context = BeginPaint(main_window, &paint);
  1174.  
  1175.         DrawScene();
  1176.         SwapBuffers(context);
  1177.  
  1178.         EndPaint(main_window, &paint);
  1179.  
  1180.         return 0;
  1181.     }
  1182.  
  1183.     case WM_TIMER:
  1184.  
  1185.         return 0;
  1186.  
  1187.     case WM_SIZE:
  1188.     {
  1189.         int cx = LOWORD(lParam);
  1190.         int cy = HIWORD(lParam);
  1191.  
  1192.         WindowSizeChange(cx, cy);
  1193.  
  1194.         return 0;
  1195.     }
  1196.  
  1197.     case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna
  1198.         if (lParam == 100)
  1199.             MessageBox(main_window, "Jest zbyt późno na dołączenie do wirtualnego świata. Trzeba to zrobić zanim inni uczestnicy zmienią jego state.", "Zamknięcie programu", MB_OK);
  1200.  
  1201.         EndOfInteraction();
  1202.         EndOfGraphics();
  1203.  
  1204.         ReleaseDC(main_window, g_context);
  1205.         KillTimer(main_window, 1);
  1206.  
  1207.         PostQuitMessage(0);
  1208.         return 0;
  1209.  
  1210.     default: //standardowa obsługa pozostałych meldunków
  1211.         return DefWindowProc(main_window, message_type, wParam, lParam);
  1212.     }
  1213.  
  1214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement