Advertisement
sebbu

minifygamejam 1 pong

Mar 15th, 2014
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <cstring>
  6. #include <exception>
  7.  
  8. #include "SDL.h"
  9. #include "SDL2_gfxPrimitives.h"
  10. #include "SDL_ttf.h"
  11.  
  12. #include "pong.hpp"
  13.  
  14. using namespace std;
  15.  
  16. int main(int argc, char* argv[]) {
  17.     if(argc==2) {
  18.         if( strcmp(argv[1],"-v")==0 || strcmp(argv[1],"--version")==0 ) {
  19.             cout << "PONG version 0.0.1 by sebbu" << endl;
  20.         }
  21.     }
  22.     int res=0;
  23.     res=SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_EVENTS);
  24.     if(res!=0) {
  25.         fprintf(stderr, "\nUnable to initialize SDL:  %s\n", SDL_GetError() );
  26.         return 1;
  27.     }
  28.     atexit(SDL_Quit);
  29.     //SDL initialized
  30.     if(TTF_Init()==-1) {
  31.         fprintf(stderr, "TTF_Init: %s\n", TTF_GetError());
  32.         exit(2);
  33.     }
  34.     TTF_Font *font;
  35.     font=TTF_OpenFont("arial.ttf", 16);
  36.     if(!font) {
  37.         fprintf(stderr, "TTF_OpenFont: %s\n", TTF_GetError());
  38.         // handle error
  39.         exit(2);
  40.     }
  41.     //SDL_ttf initialized
  42.     SDL_Window *window;
  43.     const int width=640;
  44.     const int height=480;
  45.     window = SDL_CreateWindow(
  46.         "PONG",                     // window title
  47.         SDL_WINDOWPOS_UNDEFINED,    // initial x position
  48.         SDL_WINDOWPOS_UNDEFINED,    // initial y position
  49.         width,                      // width, in pixels
  50.         height,                     // height, in pixels
  51.         SDL_WINDOW_OPENGL           // flags - see below
  52.     );
  53.     if (window == NULL) {
  54.         // In the event that the window could not be made...
  55.         fprintf(stderr, "Could not create window: %s\n", SDL_GetError());
  56.         return 1;
  57.     }
  58.     SDL_Renderer *renderer = NULL;
  59.     renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  60.    
  61.     unsigned int fps=60;//frame per second
  62.     unsigned int t1=0;//time start loop
  63.     unsigned int t2=0;//time end loop
  64.    
  65.     int x=width/2;//x position ball
  66.     int y=height/2;//y position ball
  67.     int size=5;//size ball
  68.     const int bm=2;//ball move (in px)
  69.    
  70.     const int pm=8;//player move (in px)
  71.     const int ps=20;//player size from screen border
  72.     const int pw=10;//player width
  73.    
  74.     int p1y=y;//player 1 y position
  75.     int p1s=size*4;//player 1 size
  76.     int p1l=0;//player 1 lives
  77.     char p1t[21];
  78.    
  79.     int p2y=y;//player 2 y position
  80.     int p2s=size*4;//player 2 size
  81.     int p2l=0;//player 2 lives
  82.     char p2t[21];
  83.    
  84.     SDL_Rect dst;
  85.     dst.x=0;
  86.     dst.y=0;
  87.    
  88.     bool cond=true;//loop
  89.    
  90.     enum direction {
  91.         UP=0,
  92.         UPRIGHT=45,
  93.         RIGHT=90,
  94.         DOWNRIGHT=135,
  95.         DOWN=180,
  96.         DOWNLEFT=225,
  97.         LEFT=270,
  98.         UPLEFT=315
  99.     };
  100.     int dir=UPRIGHT;//degree angle of ball, top is 0, right 90, bottom 180, left 270
  101.    
  102.     SDL_Event e;
  103.     SDL_Surface *text_surface1;
  104.     SDL_Surface *text_surface2;
  105.     SDL_Texture *tex1;
  106.     SDL_Texture *tex2;
  107.    
  108.     while (cond) {
  109.         t1=SDL_GetTicks();
  110.         if (SDL_PollEvent(&e)) {
  111.             if (e.type == SDL_QUIT) {
  112.                 cond=false;
  113.                 continue;
  114.             }
  115.             else if(e.type == SDL_KEYDOWN) {
  116.                 switch(e.key.keysym.scancode) {
  117.                     case SDL_SCANCODE_ESCAPE:
  118.                         cond=false;
  119.                         continue;
  120.                     case SDL_SCANCODE_W: //player 1 up
  121.                         p1y-=pm;
  122.                         break;
  123.                     case SDL_SCANCODE_S: //player 1 down
  124.                         p1y+=pm;
  125.                         break;
  126.                     case SDL_SCANCODE_UP: // player 2 up
  127.                         p2y-=pm;
  128.                         break;
  129.                     case SDL_SCANCODE_DOWN: //player 2 down
  130.                         p2y+=pm;
  131.                         break;
  132.                     default:
  133.                         break;
  134.                 }
  135.             }
  136.         }
  137.         //fix positions
  138.         if(p1y<p1s/2) p1y=p1s/2;
  139.         if(p2y<p2s/2) p2y=p2s/2;
  140.         if(p1y>height-p1s/2) p1y=height-p1s/2;
  141.         if(p2y>height-p2s/2) p2y=height-p2s/2;
  142.         //fix sizes
  143.         if(size<1) size=1;
  144.         if(p1s<1) p1s=1;
  145.         if(p2s<1) p2s=1;
  146.         //move ball
  147.         switch(dir) {
  148.             case UPRIGHT:
  149.                 x+=bm;
  150.                 y-=bm;
  151.                 break;
  152.             case DOWNRIGHT:
  153.                 x+=bm;
  154.                 y+=bm;
  155.                 break;
  156.             case DOWNLEFT:
  157.                 x-=bm;
  158.                 y+=bm;
  159.                 break;
  160.             case UPLEFT:
  161.                 x-=bm;
  162.                 y-=bm;
  163.                 break;
  164.         }
  165.         //players collisions
  166.         if( x+size <= ps+pw && ( ( y+size >= p1y-p1s && y+size <= p1y+p1s ) || ( y-size <= p1y+p1s && y-size >= p1y-p1s) ) ) { //player 1 (left)
  167.             if(dir==UPLEFT) dir=UPRIGHT;
  168.             if(dir==DOWNLEFT) dir=DOWNRIGHT;
  169.             //dir-=90;
  170.             //dir=(180-dir)%360;
  171.             //dir+=90;
  172.         }
  173.         if( x+size >= width-ps-pw && ( ( y+size >= p2y-p2s && y+size <= p2y+p2s ) || ( y-size <= p2y+p2s && y-size >= p2y-p2s) ) ) { //player 2 (right)
  174.             if(dir==UPRIGHT) dir=UPLEFT;
  175.             if(dir==DOWNRIGHT) dir=DOWNLEFT;
  176.             //dir-=90;
  177.             //dir=(180-dir)%360;
  178.             //dir+=90;
  179.         }
  180.         //borders collisions
  181.         if( x+size >= width ) { //RIGHT
  182.             if(dir==UPRIGHT) dir=UPLEFT;
  183.             if(dir==DOWNRIGHT) dir=DOWNLEFT;
  184.             //dir=(dir+180)%360;
  185.             x=width/2;
  186.             y=height/2;
  187.             p2l+=1;
  188.         }
  189.         if( y+size > height ) { //DOWN
  190.             if(dir==DOWNRIGHT) dir=UPRIGHT;
  191.             if(dir==DOWNLEFT) dir=UPLEFT;
  192.             //dir=(180-dir)%360;
  193.         }
  194.         if( x-size < 0 ) { //LEFT
  195.             if(dir==UPLEFT) dir=UPRIGHT;
  196.             if(dir==DOWNLEFT) dir=DOWNRIGHT;
  197.             //dir=(dir+180)%360;
  198.             x=width/2;
  199.             y=height/2;
  200.             p1l+=1;
  201.         }
  202.         if( y-size < 0 ) { //UP
  203.             if(dir==UPRIGHT) dir=DOWNRIGHT;
  204.             if(dir==UPLEFT) dir=DOWNLEFT;
  205.             //dir=(180-dir)%360;
  206.         }
  207.         //if(dir<0) dir+=360;
  208.         //clear
  209.         SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
  210.         SDL_RenderClear(renderer);
  211.         //score
  212.         SDL_Color color={0,0,255,255};
  213.         sprintf(p1t, "Player 1: %d", p1l);
  214.         sprintf(p2t, "Player 2: %d", p2l);
  215.         if(!(text_surface1=TTF_RenderText_Solid(font, p1t, color))) {
  216.             //handle error here, perhaps print TTF_GetError at least
  217.             fprintf(stderr, "TTF_RenderText_Solid: %s\n", TTF_GetError());
  218.             exit(2);
  219.         }
  220.         if(!(text_surface2=TTF_RenderText_Solid(font, p2t, color))) {
  221.             //handle error here, perhaps print TTF_GetError at least
  222.             fprintf(stderr, "TTF_RenderText_Solid: %s\n", TTF_GetError());
  223.             exit(2);
  224.         }
  225.         if(true) {
  226.             tex1=SDL_CreateTextureFromSurface(renderer, text_surface1);
  227.             SDL_FreeSurface(text_surface1);
  228.             dst.w=text_surface1->w;
  229.             dst.h=text_surface1->h;
  230.             dst.x=5;
  231.             dst.y=5;
  232.             SDL_RenderCopy(renderer, tex1, NULL, &dst);
  233.             SDL_DestroyTexture(tex1);
  234.             tex2=SDL_CreateTextureFromSurface(renderer, text_surface2);
  235.             SDL_FreeSurface(text_surface2);
  236.             dst.x=width-dst.w-5;
  237.             SDL_RenderCopy(renderer, tex2, NULL, &dst);
  238.             SDL_DestroyTexture(tex2);
  239.         }
  240.         //ball
  241.         filledCircleRGBA(renderer, x, y, size, 255, 0, 0, 255);
  242.         //left player
  243.         boxRGBA(renderer, ps, p1y-p1s, ps+pw, p1y+p1s, 0, 255, 0, 255);
  244.         //right player
  245.         boxRGBA(renderer, width-ps-pw, p2y-p2s, width-ps, p2y+p2s, 0, 255, 0, 255);
  246.         //render
  247.         SDL_RenderPresent(renderer);
  248.         t2=SDL_GetTicks();
  249.         if( (t2-t1) < (1000/fps)) {
  250.             SDL_Delay( (1000/fps) - (t2-t1) );
  251.         }
  252.     }
  253.     // Close and destroy the window
  254.     SDL_DestroyWindow(window);
  255.     TTF_CloseFont(font);
  256.     TTF_Quit();
  257.     return 0;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement