Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
MATTHEW SLUG 0.5 - main.cc

main.cc

Caricato da: Matthew
Scarica il programma completo

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <vector>
  6. #include <fstream>
  7. #include <sstream>
  8. #include "mylib.h"
  9. #include "Character.h"
  10. #include "Bullet.h"
  11. #include "Object.h"
  12. #include "Enemy.h"
  13.  
  14. using namespace std;
  15.  
  16. volatile int flag = 0;
  17.  
  18. void timer()
  19. {
  20.         flag = 1;
  21. }
  22. END_OF_FUNCTION(timer)
  23.  
  24. void check_keyboard(Character *character, vector<Bullet> &bullet)
  25. {
  26.         if(key[KEY_RIGHT])
  27.                 {
  28.             character->setSpriteN(0);
  29.                         //If key_right pressed and not flying, move right
  30.                         if(!character->getFlying())
  31.                                 character->setSpeedX(7);
  32.                         //test-=5;
  33.                 }
  34.                 else if(key[KEY_LEFT])
  35.                 {
  36.              character->setSpriteN(1);
  37.                         //If key_left pressed and not flying, move left
  38.                         if(!character->getFlying())
  39.                                 character->setSpeedX(-7);
  40.                 }
  41.                 else
  42.                 {
  43.                         //Else do not move
  44.                         if(!character->getJumping())
  45.                                 character->setSpeedX(0);
  46.                 }
  47.  
  48.                 if(key[KEY_UP])
  49.                 {
  50.                         //If key_up pressed and not flying, jump
  51.                         if(!character->getFlying())
  52.                         {
  53.                                 character->setSpeedY(-15);
  54.                                 character->setFlying(true);
  55.                                 character->setJumping(true);
  56.                         }
  57.                 }
  58.  
  59.                 if(key[KEY_SPACE])
  60.                 {
  61.                         //If key_space pressed, fire
  62.                         //if(bullet.size()<5)
  63.                         {
  64.                                 if(character->CanFire() | character->getAuto()) //Only if allowed
  65.                                 {
  66.                                     int speed=20;
  67.  
  68.                                     float x = character->getX() + character->getW();
  69.                                     if(character->getSpriteN()==1)
  70.                                     {
  71.                                         x = character->getX();
  72.                                         speed=-20;
  73.                                     }
  74.                                     bullet.push_back(*new Bullet((int)x, character->getY()+((int)(character->getH()/2.4)), speed, 1));
  75.                                     character->AllowFire(false);
  76.                                 }
  77.                         }
  78.                 }
  79.                 else character->AllowFire(true);
  80. }
  81.  
  82. void move_bullet(vector<Bullet> &bullet, Bullet *bull, int index)
  83. {
  84.         if(bull->getY() <0)
  85.         {
  86.                 //If it goes beyond the top border, destroy it
  87.                 bullet.erase(bullet.begin()+index);
  88.         }
  89.         else if(bull->getY() >600)
  90.         {
  91.                 //If it goes beyond the bottom border, destroy it
  92.                 bullet.erase(bullet.begin()+index);
  93.         }
  94. }
  95.  
  96. void draw_screen(BITMAP* buf, BITMAP* back, Character *character, vector<Object> &object, vector<Enemy> &enemy,
  97.                 vector<Bullet> &bullet,int tx, int *temp)
  98. {
  99.         //Draw background
  100.         draw_sprite(buf,back,*temp,0);
  101.         if(*temp<0)
  102.                 draw_sprite(buf,back,*temp+back->w,0);
  103.         else if(*temp>0)
  104.                 draw_sprite(buf,back,*temp-back->w,0);
  105.         if(abs(*temp)>=back->w)
  106.                 *temp=0;
  107.  
  108.         //Draw bullets
  109.         for(unsigned int i=0; i<bullet.size(); i++)
  110.         {
  111.                 draw_sprite(buf, bullet[i].getSprite(), (int)bullet[i].getX(), (int)bullet[i].getY());
  112.         }
  113.  
  114.         //Draw enemies
  115.         for(unsigned int i=0; i<enemy.size(); i++)
  116.         {
  117.                 //Draw only enemies in the screen
  118.                 if(enemy[i].onScreen())
  119.                 {
  120.                         draw_sprite(buf, enemy[i].getSprite(), (int)enemy[i].getX(), (int)enemy[i].getY());
  121.                         drawLife(buf, &enemy[i]);
  122.                 }
  123.         }
  124.  
  125.         //Draw objects
  126.         for(unsigned int i=0; i<object.size(); i++)
  127.         {
  128.                 //Draw only objects in the screen
  129.                 if(object[i].onScreen())
  130.                 {
  131.                         blit(object[i].getSprite(),buf,0,0, (int)object[i].getX(), (int)object[i].getY(),object[i].getW(),object[i].getH());
  132.                 }
  133.         }
  134.  
  135.         draw_sprite(buf, character->getSprite(), (int)character->getX(), (int)character->getY());
  136.         drawLife(buf, character);
  137.  
  138.         draw_sprite(screen,buf,0,0);
  139.         clear_to_color(buf,makecol(255,255,255));
  140. }
  141.  
  142. void initLevel(int n, vector<Object> &obj, vector<Enemy> &ene, string *back)
  143. {
  144.         stringstream lfname;
  145.         ifstream sti;
  146.         int on, x, y, w;
  147.         string path;
  148.         BITMAP *tb, *tb2;
  149.  
  150.         //Get level file name
  151.         lfname<<"levels/level";
  152.         lfname<<n;
  153.         lfname<<".txt";
  154.  
  155.         //Open level file
  156.         sti.open(lfname.str().c_str(),ios::in);
  157.         if(!sti.is_open())
  158.         {
  159.                   allegro_message("Cannot open level file!\n");
  160.                   allegro_exit();
  161.                   exit(-1);
  162.         }
  163.  
  164.         //**********************
  165.         //   Load background
  166.         //**********************
  167.         sti>>*back;
  168.  
  169.         //**********************
  170.         //     Load enemies
  171.         //**********************
  172.  
  173.         tb = load_bitmap("images/sprite2.bmp",default_palette);
  174.         tb2 = load_bitmap("images/sprite2b.bmp",default_palette);
  175.         if((!tb) | (!tb2))
  176.                 error_load_bitmap();
  177.  
  178.         //Get the number of enemies
  179.         sti>>on;
  180.         for(int i=0; i<on; i++)
  181.         {
  182.                 sti>>x;
  183.                 sti>>y;
  184.                 sti>>w;  //Load life
  185.                 ene.push_back(*(new Enemy(tb)));
  186.                 ene[i].loadSprite(tb2);
  187.                 ene[i].setX(x);
  188.                 ene[i].setY(y);
  189.                 ene[i].setLife(w);
  190.         }
  191.  
  192.         //**********************
  193.         //     Load objects
  194.         //**********************
  195.         //Get the number of objects
  196.         sti>>on;
  197.  
  198.         //Load objects from level file
  199.         for(int i=0; i<on; i++)
  200.         {
  201.                 sti>>x;
  202.                 sti>>y;
  203.                 sti>>w;
  204.                 sti>>path;
  205.                 if(path!="-")
  206.                 {
  207.                         tb = load_bitmap(path.c_str(),default_palette);
  208.                         if((!tb))
  209.                                 error_load_bitmap();
  210.                 }
  211.                 obj.push_back(*(new Object(tb)));
  212.  
  213.                 obj[i].setX(x);
  214.                 obj[i].setY(y);
  215.                 obj[i].setW(w);
  216.         }
  217.         sti.close();
  218.  
  219.  
  220.         //**********************
  221.         //    Load bullets
  222.         //**********************
  223.         Bullet::bsprite.push_back(load_bitmap("images/bullet1.bmp",default_palette));
  224. }
  225.  
  226.  
  227. int main()
  228. {
  229.   allegro_init();
  230.  
  231.   install_keyboard();
  232.   set_color_depth(32);
  233.   set_gfx_mode(GFX_AUTODETECT,800,600,0,0);
  234.   int flag10=0;
  235.   int absx=0, dx;
  236.   Character *cha=NULL;
  237.   vector<Enemy> ene;
  238.   vector<Bullet> bul;
  239.   vector<Object> obj;
  240.   BITMAP *back=NULL;
  241.   BITMAP *buf;
  242.   string path;
  243.  
  244.   //**********************
  245.   //     Load hero
  246.   //**********************
  247.   //TODO: check if loaded well
  248.   cha=new Character(load_bitmap("images/sprite0.bmp",default_palette));
  249.   cha->loadSprite(load_bitmap("images/sprite0b.bmp",default_palette));
  250.   cha->setSpriteN(0);
  251.   cha->setX(350);
  252.  
  253.   //Initialize level
  254.   initLevel(1,obj,ene, &path);
  255.   back = load_bitmap(path.c_str(),default_palette);
  256.   if(!back)
  257.       error_load_bitmap();
  258.  
  259.   //Create the buffer
  260.   buf = create_bitmap(800,600);
  261.  
  262.   //Create the timer
  263.   LOCK_VARIABLE(flag);
  264.   LOCK_FUNCTION(timer);
  265.   install_int(timer,30);
  266.  
  267.  
  268.   //Load init message
  269.   BITMAP *title = load_bitmap("images/title.bmp",default_palette);
  270.   if(!title)
  271.         error_load_bitmap();
  272.  
  273.   //Show init message
  274.   draw_sprite(screen, title ,0,0);
  275.   textout_centre_ex(screen, font, "Press any key to play...",
  276.                     SCREEN_W / 2, 500,
  277.                     makecol(0, 255, 0), makecol(0, 0, 0));
  278.   while(!keypressed()){}
  279.  
  280.   //Play game
  281.   while(!key[KEY_ESC])
  282.   {
  283.         rest(10);
  284.     if(flag)
  285.     {
  286.         dx = cha->getX();
  287.         flag = 0;
  288.         flag10++;
  289.         if(cha->getDead())
  290.         {
  291.               //If character is dead, game over
  292.               title = load_bitmap("images/gameover.bmp",default_palette);
  293.               if(!title)
  294.                   error_load_bitmap();
  295.  
  296.               clear_to_color(buf,makecol(0,0,0));
  297.               draw_sprite(buf,title,0,0);
  298.               textout_centre_ex(buf, font, "Press esc to quit...",
  299.                   SCREEN_W / 2, 500,
  300.                   makecol(0, 255, 0), makecol(0, 0, 0));
  301.               draw_sprite(screen,buf,0,0);
  302.         }
  303.         else if(ene.size()==0)
  304.         {
  305.           title = load_bitmap("images/complete.bmp",default_palette);
  306.           if(!title)
  307.              error_load_bitmap();
  308.           clear_to_color(buf,makecol(0,0,0));
  309.           draw_sprite(buf,title,0,100);
  310.           textout_centre_ex(buf, font, "The adventure continues, write your own levels.",
  311.                                   SCREEN_W / 2, 300,
  312.                                   makecol(0, 255, 0), makecol(0, 0, 0));
  313.           textout_centre_ex(buf, font, "Game developed by Sesia Matteo, official member of www.pierotofy.it",
  314.                         SCREEN_W / 2, 330,
  315.                         makecol(0, 255, 0), makecol(0, 0, 0));
  316.           textout_centre_ex(buf, font, "Contact me at matthew@pierotofy.it for info and to report bugs.",
  317.                                   SCREEN_W / 2, 340,
  318.                                   makecol(0, 255, 0), makecol(0, 0, 0));
  319.           textout_centre_ex(buf, font, "Press esc to quit...",
  320.               SCREEN_W / 2, 500,
  321.               makecol(0, 255, 0), makecol(0, 0, 0));
  322.               draw_sprite(screen,buf,0,0);
  323.         }
  324.         else
  325.         {
  326.             check_keyboard(cha, bul);
  327.  
  328.             //Move the character
  329.             cha->move(obj,cha);
  330.  
  331.             //Destroy enemies killed, move the others
  332.             for(unsigned int i=0; i<ene.size(); i++)
  333.             {
  334.                 if(ene[i].getDead())
  335.                     ene.erase(ene.begin()+i);
  336.                 else
  337.                 {
  338.                     if(ene[i].onScreen())
  339.                     {
  340.                         ene[i].move(obj,cha);
  341.                         if(flag10==10)
  342.                         {
  343.                           ene[i].Attack(bul,obj,ene,cha);
  344.                         }
  345.                     }
  346.                 }
  347.             }
  348.             if(flag10==10) flag10=0;
  349.  
  350.             //Destroy dead bullets and move the others
  351.             for(unsigned int i=0; i<bul.size(); i++)
  352.             {
  353.                 if(bul[i].getDead())
  354.                      bul.erase(bul.begin()+i);
  355.                 else
  356.                 {
  357.                      bul[i].move(obj, ene, cha);
  358.                 }
  359.             }
  360.  
  361.             //Move the dynamic objects
  362.             for(unsigned int i=0; i<obj.size(); i++)
  363.             {
  364.                 if(obj[i].getDynamic() && obj[i].onScreen())
  365.                 {
  366.                     obj[i].move();
  367.                 }
  368.             }
  369.             dx-=cha->getX();
  370.             dx*=-1;
  371.             //Scroll screen
  372.             for(unsigned int i=0; i<ene.size(); i++)
  373.             {
  374.                 ene[i].scroll(dx);
  375.             }
  376.             for(unsigned int i=0; i<obj.size(); i++)
  377.             {
  378.                 obj[i].scroll(dx);
  379.             }
  380.             cha->scroll(dx);
  381.             absx-=dx;
  382.             if(!back)
  383.                error_load_bitmap();
  384.  
  385.             draw_screen(buf, back, cha, obj, ene, bul, dx, &absx);
  386.       }
  387.     }
  388.   };
  389.  
  390.   remove_int(timer);
  391.  
  392.   destroy_bitmap(buf);
  393.  
  394.   allegro_exit();
  395.   return 0;
  396. }
  397. END_OF_MAIN()