SHARE
TWEET
Untitled
a guest
Nov 29th, 2015
6
Never
- #include <iostream>
- #include <list>
- #include <SDL2/SDL.h>
- #include <cstdlib>
- using namespace std;
- struct ship{
- int pos_x;
- int pos_y;
- int movement;
- };
- struct bullet{
- int pos_x;
- int pos_y;
- };
- void draw_player(int pos_x, int pos_y);
- void draw_enemy(int pos_x, int pos_y);
- void draw_bullet(int pos_x, int pos_y, bool friendly);
- void update_ship(ship &s, unsigned int delta_t);
- bool update_bullet(bullet*, unsigned int, bool);
- void move_ship(ship &s, int dir, bool move);
- bullet* fire(ship&);
- const int STOP = 0, UP = SDLK_UP, DOWN = SDLK_DOWN, LEFT = SDLK_LEFT, RIGHT = SDLK_RIGHT;
- const int WindowWidth = 800;
- const int WindowHeight = 600;
- const int enemy_threshold = 2000;
- const double ShipSpeed = 0.3;
- const double BulletSpeed = 0.7;
- SDL_Renderer *Screen = NULL;
- int main(){
- // init SDL
- SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
- SDL_Window *win = SDL_CreateWindow("tinyshmup", 100, 100, WindowWidth, WindowHeight, 0);
- Screen = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
- // init game objects
- srand(0);
- ship player;
- player.pos_x = WindowWidth / 2;
- player.pos_y = WindowHeight-64;
- // main loop
- bool quit = false;
- unsigned int delta_t = 0;
- unsigned int clock_start = 0;
- unsigned int clock_end = 0;
- unsigned int enemy_timer = 0;
- SDL_Event event;
- list<ship*> enemys;
- list<bullet*> friendly_bullets;
- list<bullet*> enemy_bullets;
- while(quit == false) {
- clock_start = SDL_GetTicks();
- // handle input
- if (SDL_PollEvent(&event)){
- switch(event.type){
- case SDL_QUIT:
- quit = true;
- break;
- case SDL_KEYDOWN:
- if (event.key.keysym.sym == SDLK_q){
- quit = true;
- break;
- }
- else if (event.key.keysym.sym == SDLK_x){
- friendly_bullets.push_back(fire(player));
- }
- move_ship(player, event.key.keysym.sym, true);
- break;
- case SDL_KEYUP:
- move_ship(player, event.key.keysym.sym, false);
- break;
- }
- }
- // update gamestate
- if (enemy_timer >= enemy_threshold){
- ship *tmp = new ship;
- tmp->pos_x = rand() % WindowWidth;
- tmp->pos_y = 16;
- tmp->movement = DOWN;
- enemys.push_back(tmp);
- enemy_timer = 0;
- }
- update_ship(player, delta_t);
- for (list<ship*>::iterator i = enemys.begin(); i != enemys.end();){
- if ((*i)->pos_y >= WindowHeight - 16){
- delete(*i);
- i = enemys.erase(i);
- goto end;
- }
- for (list<bullet*>::iterator j = friendly_bullets.begin(); j != friendly_bullets.end();++j){
- int x = (*i)->pos_x - (*j)->pos_x;
- int y = (*i)->pos_y - (*j)->pos_y;
- if (x*x + y*y <= 16*16){
- (*j)->pos_y = -1;
- delete(*i);
- i = enemys.erase(i);
- goto end;
- }
- }
- update_ship(*(*i), delta_t);
- ++i;
- }
- end:
- for (list<bullet*>::iterator i = friendly_bullets.begin(); i != friendly_bullets.end();){
- if (update_bullet(*i, delta_t, true)){
- delete(*i);
- i = friendly_bullets.erase(i);
- }
- else ++i;
- }
- for (list<bullet*>::iterator i = enemy_bullets.begin(); i != enemy_bullets.end();){
- if (update_bullet(*i, delta_t, false)){
- delete(*i);
- i = enemy_bullets.erase(i);
- }
- else ++i;
- }
- // render game
- SDL_SetRenderDrawColor(Screen, 0, 0, 0, 255);
- SDL_RenderClear(Screen);
- SDL_SetRenderDrawColor(Screen, 255, 255, 255, 255);
- draw_player(player.pos_x, player.pos_y);
- for (list<ship*>::iterator i = enemys.begin(); i != enemys.end(); ++i){
- draw_enemy((*i)->pos_x, (*i)->pos_y);
- }
- SDL_SetRenderDrawColor(Screen, 0, 255, 0, 255);
- for (list<bullet*>::iterator i = friendly_bullets.begin(); i != friendly_bullets.end(); ++i){
- draw_bullet((*i)->pos_x, (*i)->pos_y, true);
- }
- SDL_SetRenderDrawColor(Screen, 255, 0 , 0 , 255);
- for (list<bullet*>::iterator i = enemy_bullets.begin(); i != enemy_bullets.end(); ++i){
- draw_bullet((*i)->pos_x, (*i)->pos_y, true);
- }
- SDL_RenderPresent(Screen);
- SDL_Delay(10);
- clock_end = SDL_GetTicks();
- delta_t = clock_end - clock_start;
- enemy_timer += delta_t;
- }
- SDL_Quit();
- }
- void draw_player(int pos_x, int pos_y){
- SDL_RenderDrawLine(Screen, pos_x, pos_y - 16, pos_x + 16, pos_y + 16);
- SDL_RenderDrawLine(Screen, pos_x + 16, pos_y + 16, pos_x - 16, pos_y + 16);
- SDL_RenderDrawLine(Screen, pos_x - 16, pos_y + 16, pos_x, pos_y - 16);
- }
- void draw_enemy(int pos_x, int pos_y){
- SDL_RenderDrawLine(Screen, pos_x, pos_y + 16, pos_x + 16, pos_y - 16);
- SDL_RenderDrawLine(Screen, pos_x + 16, pos_y - 16, pos_x - 16, pos_y - 16);
- SDL_RenderDrawLine(Screen, pos_x - 16, pos_y - 16, pos_x, pos_y + 16);
- }
- void draw_bullet(int pos_x, int pos_y, bool friendly){
- SDL_RenderDrawLine(Screen, pos_x, pos_y, pos_x, (friendly ? pos_y + 8 : pos_y - 8));
- }
- void move_ship(ship &s, int dir, bool move) {
- if (!move && dir == s.movement) s.movement = STOP;
- else if (!move) return;
- else if (dir == UP || dir == DOWN || dir == LEFT || dir == RIGHT) s.movement = dir;
- }
- void update_ship(ship &s, unsigned int delta_t) {
- int x_t = s.pos_x;
- int y_t = s.pos_y;
- int tm = (int) (ShipSpeed * delta_t);
- switch(s.movement){
- case UP:
- y_t -= tm;
- break;
- case DOWN:
- y_t += tm;
- break;
- case LEFT:
- x_t -= tm;
- break;
- case RIGHT:
- x_t += tm;
- break;
- }
- if (0 <= x_t && x_t <= WindowWidth) s.pos_x= x_t;
- if (0 <= y_t && y_t <= WindowHeight) s.pos_y = y_t;
- }
- bool update_bullet(bullet *b, unsigned int delta_t, bool friendly){
- b->pos_y += (friendly ? -BulletSpeed * delta_t : BulletSpeed * delta_t);
- if (b->pos_y < 0 || b->pos_y > WindowHeight){
- return true;
- }
- return false;
- }
- bullet* fire(ship& shooter){
- bullet* b = new bullet;
- b->pos_x = shooter.pos_x;
- b->pos_y = shooter.pos_y;
- return b;
- }
RAW Paste Data
