SHARE
TWEET

Tiler

Archon Jun 26th, 2015 (edited) 153 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <SDL.h>
  2. #include <SDL_image.h>
  3.  
  4. enum Pattern{
  5.     SQUARE,
  6.     HEX1,
  7.     HEX2
  8. };
  9.  
  10. const int
  11.     MIN_ZOOM = 1,
  12.     MAX_ZOOM = 20;
  13.  
  14. int main(int argc, char* argv[]){
  15.     int
  16.         screenX = 800,
  17.         screenY = 600;
  18.  
  19.     SDL_Init(SDL_INIT_VIDEO);
  20.     IMG_Init(IMG_INIT_PNG | IMG_INIT_JPG | IMG_INIT_TIF);
  21.     SDL_Window *window = SDL_CreateWindow("Tiler: [1,2,3]: tile mode  [+,-]: zoom  [esc]: quit",
  22.                                           50, 50, screenX, screenY, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
  23.     SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
  24.  
  25.     Pattern pattern = SQUARE;
  26.     int zoom = 3;
  27.  
  28.     bool loop = true;
  29.     while (loop){
  30.         //handle input
  31.         SDL_Event e;
  32.         while(SDL_PollEvent(&e)){
  33.             switch(e.type){
  34.             case SDL_QUIT:
  35.                 loop = false;
  36.                 break;
  37.  
  38.             case SDL_KEYDOWN:
  39.                 switch(e.key.keysym.sym){
  40.                 case SDLK_ESCAPE:
  41.                     loop = false;
  42.                     break;
  43.                 case SDLK_1:
  44.                 case SDLK_KP_1:
  45.                     pattern = SQUARE;
  46.                     break;
  47.                 case SDLK_2:
  48.                 case SDLK_KP_2:
  49.                     pattern = HEX1;
  50.                     break;
  51.                 case SDLK_3:
  52.                 case SDLK_KP_3:
  53.                     pattern = HEX2;
  54.                     break;
  55.                 case SDLK_PLUS:
  56.                 case SDLK_KP_PLUS:
  57.                     ++zoom;
  58.                     if (zoom > MAX_ZOOM)
  59.                         zoom = MAX_ZOOM;
  60.                     break;
  61.                 case SDLK_MINUS:
  62.                 case SDLK_KP_MINUS:
  63.                     --zoom;
  64.                     if (zoom < MIN_ZOOM)
  65.                         zoom = MIN_ZOOM;
  66.                     break;
  67.                 }
  68.                 break;
  69.  
  70.             case SDL_WINDOWEVENT:
  71.                 switch(e.window.event) {
  72.                 case SDL_WINDOWEVENT_SIZE_CHANGED:
  73.                 case SDL_WINDOWEVENT_RESIZED:
  74.                 case SDL_WINDOWEVENT_MAXIMIZED:
  75.                 case SDL_WINDOWEVENT_RESTORED:
  76.                     SDL_GetRendererOutputSize(renderer, &screenX, &screenY);
  77.                     break;
  78.                 }
  79.             }
  80.         }
  81.  
  82.         // load image
  83.         SDL_Surface *tileSurface = IMG_Load(argc > 1 ? argv[1] : "tile.bmp");
  84.         SDL_Texture *tile = SDL_CreateTextureFromSurface(renderer, tileSurface);
  85.         SDL_FreeSurface(tileSurface);
  86.  
  87.         SDL_SetRenderDrawColor(renderer, 24, 82, 161, 255);
  88.  
  89.         int w, h;
  90.         SDL_QueryTexture(tile, 0, 0, &w, &h);
  91.         w *= zoom;
  92.         h *= zoom;
  93.  
  94.         if (tile){
  95.  
  96.             switch(pattern){
  97.             case SQUARE:
  98.                 for (int y = 0; y < screenY; y += h)
  99.                     for (int x = 0; x < screenX; x += w){
  100.                         SDL_Rect r = {x, y, w, h};
  101.                         SDL_RenderCopy(renderer, tile, 0, &r);
  102.                     }
  103.                 break;
  104.             case HEX1:{
  105.                 int rows = screenY / h + 1;
  106.                 for (int y = 0; y < rows; ++y)
  107.                     for (int x = (y % 2 == 0 ? 0 : -w/2); x < screenX; x += w){
  108.                         SDL_Rect r = {x, y*h, w, h};
  109.                         SDL_RenderCopy(renderer, tile, 0, &r);
  110.                     }
  111.                 break;
  112.             }
  113.             case HEX2: {
  114.                 int cols = screenX / w + 1;
  115.                 for (int x = 0; x < cols; ++x)
  116.                     for (int y = (x % 2 == 0 ? 0 : -h/2); y < screenY; y += h){
  117.                         SDL_Rect r = {x*w, y, w, h};
  118.                         SDL_RenderCopy(renderer, tile, 0, &r);
  119.                     }
  120.                 break;
  121.             }
  122.             }
  123.         }
  124.  
  125.         SDL_RenderPresent(renderer);
  126.  
  127.         // clean up
  128.         SDL_DestroyTexture(tile);
  129.     }
  130.  
  131.     SDL_DestroyRenderer(renderer);
  132.     SDL_DestroyWindow(window);
  133.     SDL_Quit();
  134.     return 0;
  135. }
RAW Paste Data
Top