Advertisement
Guest User

Untitled

a guest
Jan 9th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.95 KB | None | 0 0
  1. #include <allegro.h>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <ctime>
  5. #include <cstdio>
  6.  
  7. using namespace std;
  8.  
  9. /* Funkcja zwalniajaca*/
  10. volatile long speed = 0;
  11. void increment_speed()
  12. {
  13.     speed++;
  14. }
  15. END_OF_FUNCTION(increment_speed);
  16.  
  17. LOCK_VARIABLE(speed);
  18. LOCK_FUNCTION(increment_speed);
  19.  
  20. /* Główna struktura */
  21. struct size_obj
  22. {
  23.     int x, y, width, height;
  24. };
  25.  
  26. class Stone
  27. {
  28. public:
  29.     int pos_x;
  30.     int pos_y;
  31.     BITMAP *Stone = NULL;
  32. public:
  33.     void init()
  34.     {
  35.  
  36.         srand(time(NULL));
  37.         pos_x = rand() % 599 + 1+100;
  38.         pos_y = rand() % 399 + 1+100;
  39.     }
  40.    
  41.     void add_stones(BITMAP *Bufor)
  42.     {
  43.     Stone= load_pcx("stone.pcx", default_palette);
  44.     masked_blit(Stone, Bufor, 0, 0, pos_x, pos_y, Stone->w, Stone->h);
  45.     }
  46.    
  47.     size_obj get_size()
  48.     {
  49.         size_obj temp;
  50.         temp.x = pos_x;
  51.         temp.y = pos_y;
  52.         temp.width = Stone->w;
  53.         temp.height = Stone->h;
  54.         return temp;
  55.     }
  56.  
  57. };
  58.  
  59. /*Klasa pocisku*/
  60. class Bullet
  61. {
  62. public:
  63.     int pos_x;
  64.     int pos_y;
  65.     int angle;
  66.     bool active = false;
  67.     BITMAP *Bullet = NULL;
  68. public:
  69.     void init(float tank_x, float tank_y, int tank_angle)
  70.     {
  71.         active = true;
  72.         angle = tank_angle;
  73.         cout << angle;
  74.         pos_x = tank_x + -1.0*abs(0.6*(angle*1.40625-90))+80;
  75.         pos_y = tank_y + -1.0*abs(0.6*(angle*1.40625-180))+80;
  76.         Bullet = load_bmp("bullet.bmp", default_palette);
  77.     }
  78.     void move(BITMAP* Bufor)
  79.     {
  80.         pos_x += sin((angle*1.40625)*M_PI/180.0)*5.0;
  81.         pos_y += cos((angle*1.40625-180.0)*M_PI/180.0)*5.0;
  82.         if(pos_x < 0 || pos_x > 800 || pos_y < 0 || pos_y > 600)
  83.         {
  84.             destroy();
  85.         }
  86.         masked_blit(Bullet, Bufor, 0, 0, pos_x, pos_y, Bullet->w, Bullet->h);
  87.     }
  88.     size_obj get_size()
  89.     {
  90.         size_obj temp;
  91.         temp.x = pos_x;
  92.         temp.y = pos_y;
  93.         temp.width = Bullet->w;
  94.         temp.height = Bullet->h;
  95.         return temp;
  96.     }
  97.     void stop(BITMAP* Bufor)
  98.     {
  99.         masked_blit(Bullet, Bufor, 0, 0, pos_x, pos_y, Bullet->w, Bullet->h);
  100.     }
  101.     void destroy()
  102.     {
  103.         active = false;
  104.     }
  105. };
  106.  
  107. /* Klasa czołgu*/
  108. class Tank
  109. {
  110. public:
  111.     float pos_x = 0.0;
  112.     float pos_y = 0.0;
  113.     float bfr_pos_x;
  114.     float bfr_pos_y;
  115.     int angle = 0;
  116.     int velocity = 0;
  117.     int counter = 0;
  118.     Bullet TankBullet[2];
  119.     BITMAP *TankBitmap = NULL;
  120. public:
  121.     Tank()
  122.     {
  123.         srand(time(NULL));
  124.         pos_x = rand() % 699 + 1;
  125.         pos_y = rand() % 499 + 1;
  126.     }
  127.     void go_to(BITMAP* Bufor)
  128.     {
  129.         bfr_pos_x = pos_x;
  130.         bfr_pos_y = pos_y;
  131.         pos_x += cos((angle*1.40625+90)*M_PI/180)*velocity;
  132.         pos_y += sin((angle*1.40625+90)*M_PI/180)*velocity;
  133.         if(collision_map())
  134.             back_move();
  135.         rotate_sprite(Bufor, TankBitmap, pos_x, pos_y, itofix(angle));
  136.     }
  137.     void back_move()
  138.     {
  139.         pos_x = bfr_pos_x;
  140.         pos_y = bfr_pos_y;
  141.     }
  142.     bool collision_map()
  143.     {
  144.         return (pos_x < 0 || pos_y < 0 ||pos_x > 800 || pos_y > 600);
  145.     }
  146.     size_obj get_size()
  147.     {
  148.         size_obj temp;
  149.         temp.x = pos_x;
  150.         temp.y = pos_y;
  151.         temp.width = TankBitmap->w;
  152.         temp.height = TankBitmap->h;
  153.         return temp;
  154.     }
  155.     void stop(BITMAP* Bufor)
  156.     {
  157.         rotate_sprite(Bufor, TankBitmap, pos_x, pos_y, itofix(angle));
  158.     }
  159.     void shot()
  160.     {
  161.         for(int i = 0; i <= 1; i++)
  162.             if(!TankBullet[i].active)
  163.             {
  164.                 TankBullet[i].init(pos_x, pos_y, angle);
  165.                 break;
  166.             }
  167.     }
  168. };
  169.  
  170. /* Czołg gracza A */
  171. class PlayerTankA :public Tank
  172. {
  173. public:
  174.     PlayerTankA()
  175.     {
  176.         TankBitmap = load_bitmap("TANKA.pcx", default_palette);
  177.     }
  178.     void move(BITMAP* Bufor)
  179.     {
  180.         velocity = 0;
  181.         if (key[KEY_LEFT])
  182.             angle = angle > 0 ? angle - 1: 255;
  183.         else if (key[KEY_RIGHT])
  184.             angle = angle < 255 ? angle + 1: 0;
  185.         else if (key[KEY_UP])
  186.             velocity--;
  187.         else if (key[KEY_DOWN])
  188.             velocity++;
  189.  
  190.         go_to(Bufor);  
  191.  
  192.         for(int i = 0; i <= 1; i++)
  193.             if(TankBullet[i].active)
  194.                 TankBullet[i].move(Bufor);
  195.  
  196.         counter++;
  197.         if (key[KEY_ENTER] && ((counter == 0) || (counter > 100)))
  198.         {
  199.             counter = 0;
  200.             shot();
  201.         }
  202.     }
  203. };
  204. /* Czołg gracza B*/
  205. class PlayerTankB: public Tank
  206. {
  207. public:
  208.     PlayerTankB()
  209.     {
  210.         TankBitmap = load_bitmap("TANKB.pcx", default_palette);
  211.     }
  212.     void move(BITMAP* Bufor)
  213.     {  
  214.         velocity = 0;
  215.         if (key[KEY_A])
  216.             angle = angle > 0 ? angle - 1: 255;
  217.         else if (key[KEY_D])
  218.             angle = angle < 255 ? angle + 1: 0;
  219.         else if (key[KEY_W])
  220.             velocity--;
  221.         else if (key[KEY_S])
  222.             velocity++;
  223.  
  224.         go_to(Bufor);
  225.  
  226.         for(int i = 0; i <= 1; i++)
  227.             if(TankBullet[i].active)
  228.                 TankBullet[i].move(Bufor);
  229.  
  230.         counter++;
  231.         if (key[KEY_SPACE] && ((counter == 0) || (counter > 100)))
  232.         {
  233.             counter = 0;
  234.             shot();
  235.         }
  236.     }      
  237. };
  238.  
  239. /*Plansza*/
  240. class Board
  241. {
  242. public:
  243.     int point_red = 0;
  244.     int point_blue = 0;
  245.     char text[64];
  246.     PlayerTankA* TankPlayerRed = new PlayerTankA;
  247.     PlayerTankB* TankPlayerBlue = new PlayerTankB;
  248.     BITMAP *Bufor = NULL;
  249.     Stone* Stones = new Stone;
  250. public:
  251.     Board()
  252.     {
  253.         Bufor = create_bitmap(800, 600);
  254.         while(collision_players())
  255.         {
  256.             delete TankPlayerRed;
  257.             TankPlayerRed = new PlayerTankA;
  258.         }
  259.         draw();
  260.     }
  261.     void draw()
  262.     {
  263.         clear_to_color(Bufor, makecol(101, 156, 45));
  264.         TankPlayerBlue->move(Bufor);
  265.         TankPlayerRed->move(Bufor);
  266.             Stones->init();
  267.             Stones->add_stones(Bufor);
  268.            
  269.         if(collision_players() || collision_p1_stones() || collision_p2_stones())
  270.         {
  271.             TankPlayerRed->back_move();
  272.             TankPlayerBlue->back_move();
  273.         }
  274.  
  275.         shoted_red();
  276.         shoted_blue();
  277.         shoted_stone();
  278.         print_text();
  279.         blit(Bufor, screen, 0, 0, 0, 0, 800, 600);
  280.     }
  281.     void print_text()
  282.     {
  283.         sprintf(text, "Player Blue %d", point_blue);
  284.         textout_ex( Bufor, font, text, 10, 10, makecol( 0, 0, 255 ), - 1 );
  285.         sprintf(text, "Player Red %d", point_red);
  286.         textout_ex( Bufor, font, text, 410, 10, makecol( 255, 0, 0 ), - 1 );
  287.     }
  288.     bool collision_players()
  289.     {
  290.         size_obj size_player_blue = TankPlayerBlue->get_size();
  291.         size_obj size_player_red = TankPlayerRed->get_size();
  292.         return collision(size_player_blue, size_player_red);
  293.     }
  294.    
  295.     bool collision_p1_stones()
  296.     {
  297.         size_obj size_player_red = TankPlayerRed->get_size();
  298.         size_obj size_stone = Stones->get_size();
  299.         return collision(size_player_red, size_stone);
  300.     }
  301.    
  302.     bool collision_p2_stones()
  303.     {
  304.         size_obj size_player_blue = TankPlayerBlue->get_size();
  305.         size_obj size_stone = Stones->get_size();
  306.         return collision(size_player_blue, size_stone);
  307.     }
  308.    
  309.  
  310.     void shoted_red()   //zliczanie punktów
  311.     {
  312.         size_obj size_player_red = TankPlayerRed->get_size();
  313.         for(int i = 0; i <= 1; i++)
  314.             if(TankPlayerBlue->TankBullet[i].active)
  315.                 if(collision(size_player_red, TankPlayerBlue->TankBullet[i].get_size()))
  316.                 {
  317.                     TankPlayerBlue->TankBullet[i].destroy();
  318.                     point_blue++;
  319.                 }
  320.  
  321.     }
  322.     void shoted_blue()  //zliczanie punktów
  323.     {
  324.         size_obj size_player_blue = TankPlayerBlue->get_size();
  325.         for(int i = 0; i <= 1; i++)
  326.             if(TankPlayerRed->TankBullet[i].active)
  327.                 if(collision(size_player_blue, TankPlayerRed->TankBullet[i].get_size()))
  328.                 {
  329.                     TankPlayerRed->TankBullet[i].destroy();
  330.                     point_red++;
  331.                 }
  332.  
  333.     }
  334.    
  335.     void shoted_stone()
  336.     {
  337.         size_obj size_stone = Stones->get_size();
  338.         for(int i = 0; i <= 1; i++)
  339.         {
  340.             if(TankPlayerRed->TankBullet[i].active)
  341.                 if(collision(size_stone, TankPlayerRed->TankBullet[i].get_size()))
  342.                 {
  343.                     TankPlayerRed->TankBullet[i].destroy();
  344.                 }
  345.             if(TankPlayerBlue->TankBullet[i].active)
  346.                 if(collision(size_stone, TankPlayerBlue->TankBullet[i].get_size()))
  347.                 {
  348.                     TankPlayerBlue->TankBullet[i].destroy();
  349.                 }
  350.         }
  351.  
  352.     }
  353.    
  354.     bool collision(size_obj obj1, size_obj obj2)
  355.     {
  356.         return (obj1.x < obj2.x + obj2.width &&
  357.         obj1.x + obj1.width > obj2.x &&
  358.         obj1.y < obj2.y + obj2.height &&
  359.         obj1.y + obj1.height > obj2.y);
  360.     }
  361.    
  362. };
  363.  
  364.  
  365. int main()
  366. {
  367.  
  368.     allegro_init();
  369.     install_timer();
  370.     install_int_ex(increment_speed, BPS_TO_TIMER(200));
  371.  
  372.     install_keyboard();
  373.     set_color_depth(16);
  374.     set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
  375.     clear_to_color(screen, makecol(128, 128, 128));
  376.  
  377.    
  378.  
  379.     Board *BoardGame;
  380.     BoardGame = new Board;
  381.     while (!key[KEY_ESC])
  382.     {
  383.         while(speed > 0)
  384.         {
  385.             BoardGame->draw();
  386.             usleep(1000);
  387.         }
  388.         speed--;
  389.     }
  390.     readkey();
  391.     remove_int(increment_speed);
  392.     allegro_exit();
  393.     return 0;
  394. }
  395. END_OF_MAIN();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement