Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <allegro5/allegro.h>
- #include <allegro5/allegro_image.h>
- #include <allegro5/allegro_font.h>
- #include <allegro5/allegro_ttf.h>
- #include <allegro5/allegro_primitives.h>
- #include <vector>
- #include <iostream>
- using namespace std;
- const int TILE_SIZE = 32;
- const int PLAYER_SIZE = 32;
- const int SCREEN_W = 640;
- const int SCREEN_H = 480;
- const int MAP_X_SIZE = 30;
- const int MAP_Y_SIZE = 30;
- const float FPS = 60.0;
- enum MYKEYS{KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_A, KEY_D};
- void cameraUpdate(float *cameraPosition, float x, float y, int width, int height)
- {
- cameraPosition[0] = -(SCREEN_W / 2) + (x + width / 2);
- cameraPosition[1] = -(SCREEN_H / 2) + (y + height / 2);
- if(cameraPosition[0] < 0){ cameraPosition[0] = 0; }
- if(cameraPosition[0] + SCREEN_W > TILE_SIZE * MAP_X_SIZE) { cameraPosition[0] = (TILE_SIZE * MAP_X_SIZE) - SCREEN_W; }
- if(cameraPosition[1] < 0){ cameraPosition[1] = 0; }
- if(cameraPosition[1] + SCREEN_H > TILE_SIZE * MAP_Y_SIZE){ cameraPosition[1] = (TILE_SIZE * MAP_Y_SIZE) - SCREEN_H; }
- }
- vector<ALLEGRO_BITMAP*> tiles;
- int map[MAP_X_SIZE][MAP_Y_SIZE] = {
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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},
- {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}
- };
- // int trigger[MAP_X_SIZE][MAP_Y_SIZE] = {};
- int main()
- {
- //float rot = 0.0f;
- int fps = 0, fps_accum = 0;
- double fps_time = 0;
- if(!al_init())
- {
- cout << "Failed to init allegro\n";
- }
- if(!al_install_keyboard())
- {
- cout << "Failed to install keyboad\n";
- }
- if(!al_init_primitives_addon())
- {
- cout << "Failed to init primitives addon\n";
- }
- if(!al_init_image_addon())
- {
- cout << "Failed to init image addon\n";
- }
- al_init_font_addon();
- al_init_ttf_addon();
- ALLEGRO_BITMAP *sprite, *player;
- ALLEGRO_DISPLAY *display;
- ALLEGRO_EVENT_QUEUE *event_queue;
- ALLEGRO_TIMER *timer;
- ALLEGRO_FONT *fnt;
- ALLEGRO_TRANSFORM camera;
- fnt = al_load_ttf_font("pirulen.ttf", 12, 0);
- bool doexit = false;
- bool redraw = false;
- bool key[6] = {false, false, false, false, false, false};
- float cameraPosition[2] = {0, 0};
- timer = al_create_timer(1.0/FPS);
- display = al_create_display(SCREEN_W, SCREEN_H);
- event_queue = al_create_event_queue();
- //al_set_display_flag(display, ALLEGRO_FULLSCREEN_WINDOW, 1);
- al_set_window_title(display, "Tilemap Test");
- al_set_window_position(display, 20, 20);
- al_register_event_source(event_queue, al_get_display_event_source(display));
- al_register_event_source(event_queue, al_get_timer_event_source(timer));
- al_register_event_source(event_queue, al_get_keyboard_event_source());
- sprite = al_load_bitmap("tilesheet.png");
- int tileOffset = 0;
- for(int i = 0; i < 10; i++)
- {
- for(int j = 0; j < 2; j++)
- {
- tiles.push_back(al_create_sub_bitmap(sprite, i * TILE_SIZE, j * TILE_SIZE, TILE_SIZE, TILE_SIZE));
- tileOffset = tileOffset + TILE_SIZE;
- }
- }
- player = al_load_bitmap("player.png");
- int playerX = SCREEN_W / 2, playerY = SCREEN_H / 2;
- al_clear_to_color(al_map_rgb(0, 0, 0));
- al_flip_display();
- al_start_timer(timer);
- int camXRelTmapX, camX2RelTmapX2;
- int camYRelTmapY, camY2RelTmapY2;
- int tileX1, tileX2, tileY1, tileY2;
- // draw map or get map data rather
- for(int i = 0; i < MAP_X_SIZE; i++)
- {
- for(int j = 0; j < MAP_Y_SIZE; j++)
- {
- camXRelTmapX = i + cameraPosition[0];
- tileX1 = camXRelTmapX / TILE_SIZE;
- camX2RelTmapX2 = i * TILE_SIZE + cameraPosition[0] * TILE_SIZE;
- tileX2 = camX2RelTmapX2 / TILE_SIZE;
- camYRelTmapY = j + cameraPosition[1];
- tileY1 = camYRelTmapY / TILE_SIZE;
- camY2RelTmapY2 = j * TILE_SIZE + cameraPosition[1] * TILE_SIZE;
- tileY2 = camY2RelTmapY2 / TILE_SIZE;
- //al_draw_bitmap(tiles[map[j][i]], i * TILE_SIZE, j * TILE_SIZE, 0);
- }
- }
- while(!doexit)
- {
- ALLEGRO_EVENT ev;
- al_wait_for_event(event_queue, &ev);
- if(ev.type == ALLEGRO_EVENT_TIMER)
- {
- // logic
- if(key[KEY_UP] && playerY >= 32)
- {
- playerY -= 5;
- }
- if(key[KEY_DOWN] && playerY <= MAP_Y_SIZE * TILE_SIZE - PLAYER_SIZE * 2)
- {
- playerY += 5;
- }
- if(key[KEY_LEFT] && playerX >= 32)
- {
- playerX -= 5;
- }
- if(key[KEY_RIGHT] && playerX <= MAP_X_SIZE * TILE_SIZE - PLAYER_SIZE * 2)
- {
- playerX += 5;
- }
- cameraUpdate(cameraPosition, playerX, playerY, PLAYER_SIZE, PLAYER_SIZE);
- al_identity_transform(&camera);
- al_translate_transform(&camera, -cameraPosition[0], -cameraPosition[1]);
- al_use_transform(&camera);
- redraw = true;
- }
- else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
- {
- break;
- }
- else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
- {
- switch(ev.keyboard.keycode)
- {
- case ALLEGRO_KEY_UP:
- key[KEY_UP] = true;
- break;
- case ALLEGRO_KEY_DOWN:
- key[KEY_DOWN] = true;
- break;
- case ALLEGRO_KEY_LEFT:
- key[KEY_LEFT] = true;
- break;
- case ALLEGRO_KEY_RIGHT:
- key[KEY_RIGHT] = true;
- break;
- case ALLEGRO_KEY_A:
- key[KEY_A] = true;
- break;
- case ALLEGRO_KEY_D:
- key[KEY_D] = true;
- break;
- }
- }
- else if(ev.type == ALLEGRO_EVENT_KEY_UP)
- {
- switch(ev.keyboard.keycode)
- {
- case ALLEGRO_KEY_UP:
- key[KEY_UP] = false;
- break;
- case ALLEGRO_KEY_DOWN:
- key[KEY_DOWN] = false;
- break;
- case ALLEGRO_KEY_LEFT:
- key[KEY_LEFT] = false;
- break;
- case ALLEGRO_KEY_RIGHT:
- key[KEY_RIGHT] = false;
- break;
- case ALLEGRO_KEY_A:
- key[KEY_A] = false;
- break;
- case ALLEGRO_KEY_D:
- key[KEY_D] = false;
- break;
- case ALLEGRO_KEY_ESCAPE:
- doexit = true;
- break;
- }
- }
- if(redraw && al_is_event_queue_empty(event_queue))
- {
- redraw = false;
- al_clear_to_color(al_map_rgb(0, 0, 0));
- double t = al_get_time();
- // draw map code here
- for (int tileX = tileX1; tileX <= tileX2; ++tileX)
- {
- for(int tileY = tileY1; tileY <= tileY2; ++tileY)
- {
- int tileIndex = map[tileX][tileY];
- al_draw_bitmap(tiles[tileIndex], tileY * TILE_SIZE, tileX * TILE_SIZE, 0);
- }
- }
- al_draw_bitmap(player, playerX, playerY, 0);
- al_draw_text(fnt, al_map_rgb(255, 255, 255), cameraPosition[0] + 32, cameraPosition[1] + 32, 0, "HP: 9999 MP: 9999 XP: 999999999");
- 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));
- al_draw_textf(fnt, al_map_rgb(255, 255, 255), cameraPosition[0] + 8, cameraPosition[1] + SCREEN_H - 22, 0, "FPS: %d", fps);
- al_flip_display();
- fps_accum++;
- if(t - fps_time >= 1)
- {
- fps = fps_accum;
- fps_accum = 0;
- fps_time = t;
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment