Quintinon
Member #8,554
April 2007
|
I'm having a weird problem I know I shouldn't be running into with my program ... but I have basically a game engine that displays a character and a screen full of 32x32 tiles of 'grass'.(These are place holder graphics for the real game ... no point in getting a bunch done when the engine doesn't even work) I can draw the character and move him around fine, but when I start drawing the tiles(even just one row slows it down considerably) it gets HORRIBLE ... I don't understand what could be going wrong here and would like some help. Main program cpp file.
| 1 | #include <allegro.h> | | 2 | #include <string> | | 3 | #include "MapEngine.h" | | 4 | //************************************************************************* | | 5 | //Initialization | | 6 | | | 7 | BITMAP *buffer; | | 8 | bool updateMap; | | 9 | BITMAP *Test; | | 10 | int x = 0; | | 11 | int y = 0; | | 12 | int xBoundry = 640; | | 13 | int yBoundry = 480; | | 14 | //************************************************************************* | | 15 | //Timer | | 16 | | | 17 | volatile long speed_counter=0; | | 18 | void increment_speed_counter() | | 19 | { | | 20 | speed_counter++; | | 21 | } | | 22 | END_OF_FUNCTION(increment_speed_counter); | | 23 | | | 24 | //************************************************************************* | | 25 | //Engine | | 26 | | | 27 | void engine(void) | | 28 | { | | 29 | allegro_init(); | | 30 | install_keyboard(); | | 31 | install_timer(); | | 32 | install_mouse(); | | 33 | set_mouse_speed(1,1); | | 34 | set_mouse_range(0,0, xBoundry, yBoundry); | | 35 | install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,0); | | 36 | LOCK_VARIABLE(speed_counter); | | 37 | LOCK_FUNCTION(increment_speed_counter); | | 38 | install_int_ex(increment_speed_counter, BPS_TO_TIMER(60)); | | 39 | set_color_depth(16); | | 40 | if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0) != 0) | | 41 | { | | 42 | allegro_exit(); | | 43 | exit(1); | | 44 | } | | 45 | buffer = create_bitmap(640,480); | | 46 | clear_bitmap(buffer); | | 47 | Test = load_bitmap("Images\\Test.bmp", desktop_palette); | | 48 | loadMap("Test.map"); | | 49 | loadTiles(); | | 50 | } | | 51 | //************************************************************************* | | 52 | //Program for calling necessary functions | | 53 | | | 54 | void program(void) | | 55 | { | | 56 | if(key[KEY_LEFT] && x > 0) | | 57 | { | | 58 | x--; | | 59 | updateMap = true; | | 60 | } | | 61 | else if(key[KEY_RIGHT] && x < xBoundry - 16) | | 62 | { | | 63 | x++; | | 64 | updateMap = true; | | 65 | } | | 66 | if(key[KEY_DOWN] && y < yBoundry - 16) | | 67 | { | | 68 | y++; | | 69 | updateMap = true; | | 70 | } | | 71 | else if(key[KEY_UP] && y > 0) | | 72 | { | | 73 | y--; | | 74 | updateMap = true; | | 75 | } | | 76 | } | | 77 | //************************************************************************* | | 78 | //Display | | 79 | | | 80 | void display(void) | | 81 | { | | 82 | draw_sprite(buffer, drawMap(0,0,0,0), 0, 0); | | 83 | draw_sprite(buffer, Test, x, y); | | 84 | draw_sprite(screen,buffer,0,0); | | 85 | clear_bitmap(buffer); | | 86 | } | | 87 | | | 88 | //************************************************************************* | | 89 | //Main Program | | 90 | | | 91 | int main(int argc, char *argv[]) | | 92 | { | | 93 | engine(); | | 94 | | | 95 | while(!key[KEY_ESC]) | | 96 | { | | 97 | while(speed_counter>0) | | 98 | { | | 99 | program(); | | 100 | speed_counter--; | | 101 | } | | 102 | if(updateMap) | | 103 | { | | 104 | display(); | | 105 | updateMap = false; | | 106 | } | | 107 | } | | 108 | if(key[KEY_ESC]) | | 109 | { | | 110 | destroy_bitmap(Test); | | 111 | destroy_bitmap(buffer); | | 112 | } | | 113 | | | 114 | return 0; | | 115 | } | | 116 | END_OF_MAIN() |
Header file for MapEngine. #ifndef MapEngine_h_included
#define MapEngine_h_included
int loadMap(std::string s);
int loadTiles(void);
BITMAP* drawMap(int x, int y, int a, int b);
#endif
Cpp file for MapEngine | 1 | #include <allegro.h> | | 2 | #include <fstream> | | 3 | #include <string> | | 4 | using namespace std; | | 5 | | | 6 | BITMAP *buffer1; | | 7 | BITMAP *Tile; | | 8 | int length; | | 9 | int height; | | 10 | int tileX = 0; | | 11 | int tileY = 0; | | 12 | int map[1000][1000]; | | 13 | string tiles[1000]; | | 14 | int xBoundry1 = 640; | | 15 | int yBoundry1 = 480; | | 16 | | | 17 | int loadMap(string s) | | 18 | { | | 19 | ifstream fileIn(("Map\\" + s).c_str()); | | 20 | fileIn >> length; | | 21 | fileIn >> height; | | 22 | map[length][height]; // x, y | | 23 | int x = 0; | | 24 | int y = 0; | | 25 | while (x < length - 1) | | 26 | { | | 27 | while (y < height - 1) | | 28 | { | | 29 | fileIn >> map[x][y]; | | 30 | y++; | | 31 | } | | 32 | x++; | | 33 | y = 0; | | 34 | } | | 35 | fileIn.close(); | | 36 | buffer1 = create_bitmap(640,480); | | 37 | return 0; | | 38 | } | | 39 | | | 40 | int loadTiles(void) //Sprite number | | 41 | { | | 42 | ifstream fileIn("Tiles\\tiles.shl"); | | 43 | int y = 0; | | 44 | fileIn >> y; | | 45 | int i = 0; | | 46 | tiles[y]; | | 47 | while (i < y) | | 48 | { | | 49 | fileIn >> tiles<i>; | | 50 | tiles<i> = "Tiles\\" + tiles<i>; | | 51 | i++; | | 52 | } | | 53 | fileIn.close(); | | 54 | return 0; | | 55 | } | | 56 | | | 57 | string getTile(int x) | | 58 | { | | 59 | string s = tiles[x] + ".bmp"; | | 60 | return s; | | 61 | } | | 62 | | | 63 | BITMAP* drawMap(int x, int y, int a, int b) //x is leftmost tile, y is upper most tile | | 64 | //(a,b) is start pixil for [x][y] | | 65 | { | | 66 | int origA = a, origB = b; | | 67 | clear_bitmap(buffer1); | | 68 | while(a <= xBoundry1 + 32) | | 69 | { | | 70 | while (b <= yBoundry1 + 32) | | 71 | { | | 72 | Tile = load_bitmap(getTile(map[x][y]).c_str(), desktop_palette); | | 73 | draw_sprite(buffer1, Tile, a, b); | | 74 | b += 32; | | 75 | } | | 76 | a += 32; | | 77 | b = origB; | | 78 | } | | 79 | return buffer1; | | 80 | } |
and for the map file right now I'm using 50x50 of grass, which it should only be displaying around half of that I think.
|