BHXSpecter

Ugly Tilemap Code

May 22nd, 2013
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.88 KB | None | 0 0
  1. #include <allegro5/allegro.h>
  2. #include <allegro5/allegro_image.h>
  3. #include <allegro5/allegro_font.h>
  4. #include <allegro5/allegro_ttf.h>
  5. #include <allegro5/allegro_primitives.h>
  6. #include <vector>
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. const int TILE_SIZE = 32;
  12. const int PLAYER_SIZE = 32;
  13. const int SCREEN_W = 640;
  14. const int SCREEN_H = 480;
  15. const int MAP_X_SIZE = 30;
  16. const int MAP_Y_SIZE = 30;
  17. const float FPS = 60.0;
  18.  
  19. enum MYKEYS{KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_A, KEY_D};
  20.  
  21. void cameraUpdate(float *cameraPosition, float x, float y, int width, int height)
  22. {
  23.     cameraPosition[0] = -(SCREEN_W / 2) + (x + width / 2);
  24.     cameraPosition[1] = -(SCREEN_H / 2) + (y + height / 2);
  25.  
  26.     if(cameraPosition[0] < 0){ cameraPosition[0] = 0; }
  27.     if(cameraPosition[0] + SCREEN_W > TILE_SIZE * MAP_X_SIZE) { cameraPosition[0] = (TILE_SIZE * MAP_X_SIZE) - SCREEN_W; }
  28.     if(cameraPosition[1] < 0){ cameraPosition[1] = 0; }
  29.     if(cameraPosition[1] + SCREEN_H > TILE_SIZE * MAP_Y_SIZE){ cameraPosition[1] = (TILE_SIZE * MAP_Y_SIZE) - SCREEN_H; }
  30. }
  31.  
  32. vector<ALLEGRO_BITMAP*> tiles;
  33. int map[MAP_X_SIZE][MAP_Y_SIZE] = {
  34.     {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4},
  35.     {8, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  36.     {8, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  37.     {8, 3, 3, 3, 3, 7, 5, 5, 7, 3, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 8},
  38.     {8, 3, 3, 3, 3, 7, 5, 5, 7, 3, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 8},
  39.     {8, 3, 3, 3, 3, 7, 5, 5, 7, 3, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 3, 3, 3, 9, 9, 3, 3, 3, 8},
  40.     {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8},
  41.     {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8},
  42.     {8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8},
  43.     {8, 3, 3, 3, 3, 7, 5, 5, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  44.     {8, 3, 3, 3, 3, 7, 5, 5, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 3, 8},
  45.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 8},
  46.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 8},
  47.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 5, 3, 3, 3, 3, 8},
  48.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 5, 3, 3, 3, 3, 8},
  49.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 8},
  50.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 8},
  51.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 8},
  52.     {8, 3, 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  53.     {8, 3, 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  54.     {8, 3, 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  55.     {8, 3, 3, 3, 3, 3, 3, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  56.     {8, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 7, 7, 7, 3, 3, 3, 3, 3, 3, 8},
  57.     {8, 3, 3, 3, 3, 3, 5, 5, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, 3, 7, 3, 3, 3, 3, 3, 8},
  58.     {8, 3, 3, 3, 3, 3, 5, 3, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 8},
  59.     {8, 3, 3, 3, 3, 3, 5, 3, 7, 7, 3, 3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  60.     {8, 3, 3, 3, 3, 5, 5, 3, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  61.     {8, 3, 3, 3, 3, 5, 5, 3, 7, 7, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  62.     {8, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8},
  63.     {6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}
  64. };
  65.  
  66. // int trigger[MAP_X_SIZE][MAP_Y_SIZE] = {};
  67.  
  68. int main()
  69. {
  70.     //float rot = 0.0f;
  71.     int fps = 0, fps_accum = 0;
  72.     double fps_time = 0;
  73.  
  74.     if(!al_init())
  75.     {
  76.         cout << "Failed to init allegro\n";
  77.     }
  78.     if(!al_install_keyboard())
  79.     {
  80.         cout << "Failed to install keyboad\n";
  81.     }
  82.  
  83.     if(!al_init_primitives_addon())
  84.     {
  85.         cout << "Failed to init primitives addon\n";
  86.     }
  87.  
  88.     if(!al_init_image_addon())
  89.     {
  90.         cout << "Failed to init image addon\n";
  91.     }
  92.  
  93.     al_init_font_addon();
  94.     al_init_ttf_addon();
  95.  
  96.     ALLEGRO_BITMAP *sprite, *player;
  97.     ALLEGRO_DISPLAY *display;
  98.     ALLEGRO_EVENT_QUEUE *event_queue;
  99.     ALLEGRO_TIMER *timer;
  100.     ALLEGRO_FONT *fnt;
  101.     ALLEGRO_TRANSFORM camera;
  102.  
  103.     fnt = al_load_ttf_font("pirulen.ttf", 12, 0);
  104.  
  105.     bool doexit = false;
  106.     bool redraw = false;
  107.     bool key[6] = {false, false, false, false, false, false};
  108.  
  109.     float cameraPosition[2] = {0, 0};
  110.  
  111.     timer = al_create_timer(1.0/FPS);
  112.     display = al_create_display(SCREEN_W, SCREEN_H);
  113.     event_queue = al_create_event_queue();
  114.     //al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, 1);
  115.     al_set_window_title(display, "Tilemap Test");
  116.     al_set_window_position(display, 20, 20);
  117.  
  118.     al_register_event_source(event_queue, al_get_display_event_source(display));
  119.     al_register_event_source(event_queue, al_get_timer_event_source(timer));
  120.     al_register_event_source(event_queue, al_get_keyboard_event_source());
  121.  
  122.     sprite = al_load_bitmap("tilesheet.png");
  123.     int tileOffset = 0;
  124.  
  125.     for(int i = 0; i < 10; i++)
  126.     {
  127.         for(int j = 0; j < 2; j++)
  128.         {
  129.             tiles.push_back(al_create_sub_bitmap(sprite, i * TILE_SIZE, j * TILE_SIZE, TILE_SIZE, TILE_SIZE));
  130.             tileOffset = tileOffset + TILE_SIZE;
  131.         }
  132.     }
  133.  
  134.     player = al_load_bitmap("player.png");
  135.     int playerX = SCREEN_W / 2, playerY = SCREEN_H / 2;
  136.  
  137.     al_clear_to_color(al_map_rgb(0, 0, 0));
  138.     al_flip_display();
  139.     al_start_timer(timer);
  140.  
  141.     int camXRelTmapX, camX2RelTmapX2;
  142.     int camYRelTmapY, camY2RelTmapY2;
  143.     int tileX1, tileX2, tileY1, tileY2;
  144.  
  145.     // draw map or get map data rather
  146.     for(int i = 0; i < MAP_X_SIZE; i++)
  147.     {
  148.         for(int j = 0; j < MAP_Y_SIZE; j++)
  149.         {
  150.             camXRelTmapX = i + cameraPosition[0];
  151.             tileX1 = camXRelTmapX / TILE_SIZE;
  152.  
  153.             camX2RelTmapX2 = i * TILE_SIZE + cameraPosition[0] * TILE_SIZE;
  154.             tileX2 = camX2RelTmapX2 / TILE_SIZE;
  155.  
  156.             camYRelTmapY = j + cameraPosition[1];
  157.             tileY1 = camYRelTmapY / TILE_SIZE;
  158.  
  159.             camY2RelTmapY2 = j * TILE_SIZE + cameraPosition[1] * TILE_SIZE;
  160.             tileY2 = camY2RelTmapY2 / TILE_SIZE;
  161.  
  162.             //al_draw_bitmap(tiles[map[j][i]], i * TILE_SIZE, j * TILE_SIZE, 0);
  163.         }
  164.     }
  165.  
  166.     while(!doexit)
  167.     {
  168.         ALLEGRO_EVENT ev;
  169.         al_wait_for_event(event_queue, &ev);
  170.  
  171.         if(ev.type == ALLEGRO_EVENT_TIMER)
  172.         {
  173.             // logic
  174.             if(key[KEY_UP] && playerY >= 32)
  175.             {
  176.                 playerY -= 5;
  177.             }
  178.             if(key[KEY_DOWN] && playerY <= MAP_Y_SIZE * TILE_SIZE - PLAYER_SIZE * 2)
  179.             {
  180.                 playerY += 5;
  181.             }
  182.             if(key[KEY_LEFT] && playerX >= 32)
  183.             {
  184.                 playerX -= 5;
  185.             }
  186.             if(key[KEY_RIGHT] && playerX <= MAP_X_SIZE * TILE_SIZE - PLAYER_SIZE * 2)
  187.             {
  188.                 playerX += 5;
  189.             }
  190.  
  191.             cameraUpdate(cameraPosition, playerX, playerY, PLAYER_SIZE, PLAYER_SIZE);
  192.             al_identity_transform(&camera);
  193.             al_translate_transform(&camera, -cameraPosition[0], -cameraPosition[1]);
  194.             al_use_transform(&camera);
  195.  
  196.             redraw = true;
  197.         }
  198.         else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
  199.         {
  200.             break;
  201.         }
  202.         else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
  203.         {
  204.             switch(ev.keyboard.keycode)
  205.             {
  206.                 case ALLEGRO_KEY_UP:
  207.                     key[KEY_UP] = true;
  208.                     break;
  209.                 case ALLEGRO_KEY_DOWN:
  210.                     key[KEY_DOWN] = true;
  211.                     break;
  212.                 case ALLEGRO_KEY_LEFT:
  213.                     key[KEY_LEFT] = true;
  214.                     break;
  215.                 case ALLEGRO_KEY_RIGHT:
  216.                     key[KEY_RIGHT] = true;
  217.                     break;
  218.                 case ALLEGRO_KEY_A:
  219.                     key[KEY_A] = true;
  220.                     break;
  221.                 case ALLEGRO_KEY_D:
  222.                     key[KEY_D] = true;
  223.                     break;
  224.             }
  225.         }
  226.         else if(ev.type == ALLEGRO_EVENT_KEY_UP)
  227.         {
  228.             switch(ev.keyboard.keycode)
  229.             {
  230.                 case ALLEGRO_KEY_UP:
  231.                     key[KEY_UP] = false;
  232.                     break;
  233.                 case ALLEGRO_KEY_DOWN:
  234.                     key[KEY_DOWN] = false;
  235.                     break;
  236.                 case ALLEGRO_KEY_LEFT:
  237.                     key[KEY_LEFT] = false;
  238.                     break;
  239.                 case ALLEGRO_KEY_RIGHT:
  240.                     key[KEY_RIGHT] = false;
  241.                     break;
  242.                 case ALLEGRO_KEY_A:
  243.                     key[KEY_A] = false;
  244.                     break;
  245.                 case ALLEGRO_KEY_D:
  246.                     key[KEY_D] = false;
  247.                     break;
  248.                 case ALLEGRO_KEY_ESCAPE:
  249.                     doexit = true;
  250.                     break;
  251.             }
  252.         }
  253.  
  254.         if(redraw && al_is_event_queue_empty(event_queue))
  255.         {
  256.             redraw = false;
  257.             al_clear_to_color(al_map_rgb(0, 0, 0));
  258.             double t = al_get_time();
  259.             // draw map code here
  260.             for (int tileX = tileX1; tileX <= tileX2; ++tileX)
  261.             {
  262.                 for(int tileY = tileY1; tileY <= tileY2; ++tileY)
  263.                 {
  264.                     int tileIndex = map[tileX][tileY];
  265.                     al_draw_bitmap(tiles[tileIndex], tileY * TILE_SIZE, tileX * TILE_SIZE, 0);
  266.                 }
  267.             }
  268.             al_draw_bitmap(player, playerX, playerY, 0);  
  269.  
  270.             al_draw_text(fnt, al_map_rgb(255, 255, 255), cameraPosition[0] + 32, cameraPosition[1] + 32, 0, "HP: 9999 MP: 9999 XP: 999999999");
  271.             al_draw_filled_rounded_rectangle(cameraPosition[0] + 4, cameraPosition[1] + SCREEN_H - 30, cameraPosition[0] + 100, cameraPosition[1] + SCREEN_H - 4, 8, 8, al_map_rgb(255, 0, 255));
  272.             al_draw_textf(fnt, al_map_rgb(255, 255, 255), cameraPosition[0] + 8, cameraPosition[1] + SCREEN_H - 22, 0, "FPS: %d", fps);
  273.             al_flip_display();
  274.  
  275.             fps_accum++;
  276.             if(t - fps_time >= 1)
  277.             {
  278.                 fps = fps_accum;
  279.                 fps_accum = 0;
  280.                 fps_time = t;
  281.             }
  282.         }
  283.     }
  284.  
  285.     return 0;
  286.  
  287. }
Advertisement
Add Comment
Please, Sign In to add comment