SHARE
TWEET

Untitled

a guest Nov 29th, 2015 6 Never
  1. #include <iostream>
  2. #include <list>
  3. #include <SDL2/SDL.h>
  4. #include <cstdlib>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. struct ship{
  10.     int pos_x;
  11.     int pos_y;
  12.     int movement;
  13. };
  14.  
  15. struct bullet{
  16.     int pos_x;
  17.     int pos_y;
  18. };
  19.  
  20.  
  21. void draw_player(int pos_x, int pos_y);
  22. void draw_enemy(int pos_x, int pos_y);
  23. void draw_bullet(int pos_x, int pos_y, bool friendly);
  24.  
  25. void update_ship(ship &s, unsigned int  delta_t);
  26. bool update_bullet(bullet*, unsigned int, bool);
  27.  
  28. void move_ship(ship &s, int dir, bool move);
  29. bullet* fire(ship&);
  30.  
  31. const int STOP = 0, UP = SDLK_UP, DOWN = SDLK_DOWN, LEFT = SDLK_LEFT, RIGHT = SDLK_RIGHT;
  32.  
  33. const int WindowWidth = 800;
  34. const int WindowHeight = 600;
  35. const int enemy_threshold = 2000;
  36.  
  37. const double ShipSpeed = 0.3;
  38. const double BulletSpeed = 0.7;
  39.  
  40. SDL_Renderer *Screen = NULL;
  41.  
  42. int main(){
  43.     // init SDL
  44.     SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
  45.     SDL_Window *win = SDL_CreateWindow("tinyshmup", 100, 100, WindowWidth, WindowHeight, 0);
  46.     Screen = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
  47.     // init game objects
  48.     srand(0);
  49.     ship player;
  50.     player.pos_x = WindowWidth / 2;
  51.     player.pos_y = WindowHeight-64;
  52.  
  53.     // main loop
  54.     bool quit = false;
  55.     unsigned int  delta_t = 0;
  56.     unsigned int clock_start = 0;
  57.     unsigned int clock_end = 0;
  58.     unsigned int enemy_timer = 0;
  59.     SDL_Event event;
  60.     list<ship*>   enemys;
  61.     list<bullet*> friendly_bullets;
  62.     list<bullet*> enemy_bullets;
  63.     while(quit == false) {
  64.         clock_start = SDL_GetTicks();
  65.         // handle input
  66.         if (SDL_PollEvent(&event)){
  67.             switch(event.type){
  68.                 case SDL_QUIT:
  69.                     quit = true;
  70.                     break;
  71.                 case SDL_KEYDOWN:
  72.                     if (event.key.keysym.sym == SDLK_q){
  73.                         quit = true;
  74.                         break;
  75.                     }
  76.                     else if (event.key.keysym.sym == SDLK_x){
  77.                         friendly_bullets.push_back(fire(player));
  78.                     }
  79.                     move_ship(player, event.key.keysym.sym, true);
  80.                     break;
  81.                 case SDL_KEYUP:
  82.                     move_ship(player, event.key.keysym.sym, false);
  83.                     break;
  84.             }
  85.         }
  86.         // update gamestate
  87.         if (enemy_timer >= enemy_threshold){
  88.             ship *tmp = new ship;
  89.             tmp->pos_x = rand() % WindowWidth;
  90.             tmp->pos_y = 16;
  91.             tmp->movement = DOWN;
  92.             enemys.push_back(tmp);
  93.             enemy_timer = 0;
  94.         }
  95.  
  96.  
  97.         update_ship(player, delta_t);
  98.         for (list<ship*>::iterator i = enemys.begin(); i != enemys.end();){
  99.             if ((*i)->pos_y >= WindowHeight - 16){
  100.                 delete(*i);
  101.                 i = enemys.erase(i);
  102.                 goto end;
  103.             }
  104.             for (list<bullet*>::iterator j = friendly_bullets.begin(); j != friendly_bullets.end();++j){
  105.                 int x = (*i)->pos_x - (*j)->pos_x;
  106.                 int y = (*i)->pos_y - (*j)->pos_y;
  107.  
  108.                 if (x*x + y*y <= 16*16){
  109.                     (*j)->pos_y = -1;
  110.                     delete(*i);
  111.                     i = enemys.erase(i);
  112.                     goto end;
  113.                 }
  114.             }
  115.             update_ship(*(*i), delta_t);            
  116.             ++i;
  117.         }
  118. end:
  119.         for (list<bullet*>::iterator i = friendly_bullets.begin(); i != friendly_bullets.end();){
  120.             if (update_bullet(*i, delta_t, true)){
  121.                 delete(*i);
  122.                 i = friendly_bullets.erase(i);
  123.             }
  124.             else ++i;
  125.         }
  126.         for (list<bullet*>::iterator i = enemy_bullets.begin(); i != enemy_bullets.end();){
  127.             if (update_bullet(*i, delta_t, false)){
  128.                 delete(*i);
  129.                 i = enemy_bullets.erase(i);
  130.             }
  131.             else ++i;
  132.         }
  133.         // render game
  134.         SDL_SetRenderDrawColor(Screen, 0,   0,   0,   255);
  135.         SDL_RenderClear(Screen);
  136.         SDL_SetRenderDrawColor(Screen, 255, 255, 255, 255);
  137.         draw_player(player.pos_x, player.pos_y);
  138.         for (list<ship*>::iterator i = enemys.begin(); i != enemys.end(); ++i){
  139.             draw_enemy((*i)->pos_x, (*i)->pos_y);
  140.         }
  141.         SDL_SetRenderDrawColor(Screen, 0,   255, 0, 255);
  142.         for (list<bullet*>::iterator i = friendly_bullets.begin(); i != friendly_bullets.end(); ++i){
  143.             draw_bullet((*i)->pos_x, (*i)->pos_y, true);
  144.         }
  145.         SDL_SetRenderDrawColor(Screen, 255, 0  , 0  , 255);
  146.         for (list<bullet*>::iterator i = enemy_bullets.begin(); i != enemy_bullets.end(); ++i){
  147.             draw_bullet((*i)->pos_x, (*i)->pos_y, true);
  148.         }
  149.         SDL_RenderPresent(Screen);
  150.         SDL_Delay(10);
  151.         clock_end = SDL_GetTicks();
  152.         delta_t = clock_end - clock_start;
  153.         enemy_timer += delta_t;
  154.     }
  155.  
  156.     SDL_Quit();
  157. }
  158.  
  159. void draw_player(int pos_x, int pos_y){
  160.     SDL_RenderDrawLine(Screen, pos_x, pos_y - 16, pos_x + 16, pos_y + 16);
  161.     SDL_RenderDrawLine(Screen, pos_x + 16, pos_y + 16, pos_x - 16, pos_y + 16);
  162.     SDL_RenderDrawLine(Screen, pos_x - 16, pos_y + 16, pos_x, pos_y - 16);
  163. }
  164.  
  165. void draw_enemy(int pos_x, int pos_y){
  166.     SDL_RenderDrawLine(Screen, pos_x, pos_y + 16, pos_x + 16, pos_y - 16);
  167.     SDL_RenderDrawLine(Screen, pos_x + 16, pos_y - 16, pos_x - 16, pos_y - 16);
  168.     SDL_RenderDrawLine(Screen, pos_x - 16, pos_y - 16, pos_x, pos_y + 16);
  169. }
  170.  
  171. void draw_bullet(int pos_x, int pos_y, bool friendly){
  172.     SDL_RenderDrawLine(Screen, pos_x, pos_y, pos_x, (friendly ? pos_y + 8 : pos_y - 8));
  173. }
  174.  
  175. void move_ship(ship &s, int dir, bool move) {
  176.     if (!move && dir == s.movement) s.movement = STOP;
  177.     else if (!move) return;
  178.     else if (dir == UP || dir == DOWN || dir == LEFT || dir == RIGHT) s.movement = dir;
  179. }
  180.  
  181. void update_ship(ship &s, unsigned int delta_t) {
  182.     int x_t = s.pos_x;
  183.     int y_t = s.pos_y;
  184.     int tm = (int) (ShipSpeed * delta_t);
  185.     switch(s.movement){
  186.         case UP:
  187.             y_t -= tm;
  188.             break;
  189.         case DOWN:
  190.             y_t += tm;
  191.             break;
  192.         case LEFT:
  193.             x_t -= tm;
  194.             break;
  195.         case RIGHT:
  196.             x_t += tm;
  197.             break;
  198.     }
  199.     if (0 <= x_t && x_t <= WindowWidth) s.pos_x= x_t;
  200.     if (0 <= y_t && y_t <= WindowHeight) s.pos_y = y_t;
  201. }
  202.  
  203. bool update_bullet(bullet *b, unsigned int delta_t, bool friendly){
  204.     b->pos_y += (friendly ? -BulletSpeed * delta_t : BulletSpeed * delta_t);
  205.     if (b->pos_y < 0 || b->pos_y > WindowHeight){
  206.         return true;
  207.     }
  208.     return false;
  209. }
  210.  
  211. bullet* fire(ship& shooter){
  212.     bullet* b = new bullet;
  213.     b->pos_x = shooter.pos_x;
  214.     b->pos_y = shooter.pos_y;
  215.     return b;
  216. }
RAW Paste Data
Top