Rally X
ELEN3009 Project by Justin Wernick and David Schneider
|
00001 #include "BitmapStore.h" 00002 00003 BitmapStore::BitmapStore(unsigned int blockWidth) 00004 :_blockWidth(blockWidth) 00005 { 00006 _bitmapFont = al_load_font("junction 02.ttf", blockWidth/6, 0); 00007 if (_bitmapFont == NULL) 00008 { 00009 al_show_native_message_box(NULL, "Fatal error", "Fatal error", "The file 'junction 02.ttf' was not found. Ensure that it is located in the working directory.", NULL, ALLEGRO_MESSAGEBOX_ERROR); 00010 throw InstallFailure(); 00011 } 00012 } 00013 00014 BitmapStore::~BitmapStore() 00015 { 00016 for (map<Image,ALLEGRO_BITMAP*>::iterator iter = _bitmaps.begin(); 00017 iter != _bitmaps.end(); ++iter) 00018 { 00019 al_destroy_bitmap(iter->second); 00020 } 00021 _bitmaps.clear(); 00022 al_destroy_font(_bitmapFont); 00023 } 00024 00025 ALLEGRO_BITMAP* BitmapStore::getBitmap(Image image) 00026 { 00027 map<Image,ALLEGRO_BITMAP*>::const_iterator iter = _bitmaps.find(image); 00028 if (iter != _bitmaps.end()) 00029 { 00030 return iter->second; 00031 } 00032 else 00033 { 00034 ALLEGRO_BITMAP* newImage = al_create_bitmap(_blockWidth, _blockWidth); 00035 switch (image) 00036 { 00037 case PLAYER: 00038 drawPlayerCar(newImage); 00039 break; 00040 case ENEMY: 00041 drawEnemyCar(newImage); 00042 break; 00043 case CHECKPOINT: 00044 drawCheckpoint(newImage); 00045 break; 00046 case ROCK: 00047 drawRock(newImage); 00048 break; 00049 case MAZE_WALL: 00050 drawMazeWall(newImage); 00051 break; 00052 case MAZE_FLOOR: 00053 drawMazeFloor(newImage); 00054 break; 00055 case SMOKE: 00056 drawSmoke(newImage); 00057 break; 00058 case CRASHED_CAR: 00059 drawCrashedCar(newImage); 00060 break; 00061 case CLAIMED_CHECKPOINT: 00062 drawClaimedCheckpoint(newImage); 00063 break; 00064 } 00065 00066 _bitmaps.insert(make_pair(image, newImage)); 00067 return newImage; 00068 } 00069 } 00070 00071 void BitmapStore::drawPlayerCar(ALLEGRO_BITMAP* canvas) 00072 { 00073 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00074 al_set_target_bitmap(canvas); 00075 00076 //car body 00077 al_draw_filled_rounded_rectangle(_blockWidth*0.2, 0, _blockWidth*0.8, _blockWidth*0.96, _blockWidth*0.1, _blockWidth*0.1, al_map_rgb(0,0,255)); 00078 00079 //racing stripes 00080 al_draw_filled_rectangle(_blockWidth*0.35, 0, _blockWidth*0.4, _blockWidth*0.3, al_map_rgb(255,255,255)); 00081 al_draw_filled_rectangle(_blockWidth*0.6, 0, _blockWidth*0.65, _blockWidth*0.3, al_map_rgb(255,255,255)); 00082 00083 //windscreen 00084 al_draw_filled_rectangle(_blockWidth*0.3, _blockWidth*0.3, _blockWidth*0.7, _blockWidth*0.5, al_map_rgb (0,0,0)); 00085 00086 //roof 00087 al_draw_rounded_rectangle(_blockWidth*0.3, _blockWidth*0.5, _blockWidth*0.7, _blockWidth*0.9, _blockWidth*0.04, _blockWidth*0.04, al_map_rgb (25,25, 112), _blockWidth*0.04); 00088 00089 //spoiler 00090 al_draw_filled_rectangle(_blockWidth*0.2, _blockWidth*0.96, _blockWidth*0.8, _blockWidth, al_map_rgb (0,0, 225)); 00091 al_draw_rectangle(_blockWidth*0.2, _blockWidth*0.96, _blockWidth*0.8, _blockWidth, al_map_rgb(25,25, 112),_blockWidth*0.04); 00092 00093 //headlights 00094 al_draw_filled_rectangle (_blockWidth*0.3,0,_blockWidth*0.35,_blockWidth*0.06, al_map_rgb(255,225,0)); 00095 al_draw_filled_rectangle (_blockWidth*0.65,0,_blockWidth*0.7,_blockWidth*0.06, al_map_rgb(255,225,0)); 00096 00097 //tyres 00098 al_draw_filled_rounded_rectangle (_blockWidth*0.1,_blockWidth*0.13,_blockWidth*0.2,_blockWidth*0.37,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00099 al_draw_filled_rounded_rectangle (_blockWidth*0.8,_blockWidth*0.13,_blockWidth*0.9,_blockWidth*0.37,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00100 al_draw_filled_rounded_rectangle (_blockWidth*0.1,_blockWidth*0.63,_blockWidth*0.2,_blockWidth*0.87,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00101 al_draw_filled_rounded_rectangle (_blockWidth*0.8,_blockWidth*0.63,_blockWidth*0.9,_blockWidth*0.87,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00102 00103 al_set_target_bitmap(prev_draw); 00104 } 00105 void BitmapStore::drawEnemyCar(ALLEGRO_BITMAP* canvas) 00106 { 00107 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00108 al_set_target_bitmap(canvas); 00109 00110 //car body 00111 al_draw_filled_rounded_rectangle(_blockWidth*0.2, 0, _blockWidth*0.8, _blockWidth*0.96, _blockWidth*0.1, _blockWidth*0.1, al_map_rgb(255,0,0)); 00112 00113 //racing stripes 00114 al_draw_filled_rectangle(_blockWidth*0.35, 0, _blockWidth*0.4, _blockWidth*0.3, al_map_rgb(255,255,255)); 00115 al_draw_filled_rectangle(_blockWidth*0.6, 0, _blockWidth*0.65, _blockWidth*0.3, al_map_rgb(255,255,255)); 00116 00117 //windscreen 00118 al_draw_filled_rectangle(_blockWidth*0.3, _blockWidth*0.3, _blockWidth*0.7, _blockWidth*0.5, al_map_rgb (0,0,0)); 00119 00120 //roof 00121 al_draw_rounded_rectangle(_blockWidth*0.3, _blockWidth*0.5, _blockWidth*0.7, _blockWidth*0.9, _blockWidth*0.04, _blockWidth*0.04, al_map_rgb (25,25, 112), _blockWidth*0.04); 00122 00123 //spoiler 00124 al_draw_filled_rectangle(_blockWidth*0.2, _blockWidth*0.96, _blockWidth*0.8, _blockWidth, al_map_rgb (0,0, 225)); 00125 al_draw_rectangle(_blockWidth*0.2, _blockWidth*0.96, _blockWidth*0.8, _blockWidth, al_map_rgb(25,25, 112),_blockWidth*0.04); 00126 00127 //headlights 00128 al_draw_filled_rectangle (_blockWidth*0.3,0,_blockWidth*0.35,_blockWidth*0.06, al_map_rgb(255,225,0)); 00129 al_draw_filled_rectangle (_blockWidth*0.65,0,_blockWidth*0.7,_blockWidth*0.06, al_map_rgb(255,225,0)); 00130 00131 //tyres 00132 al_draw_filled_rounded_rectangle (_blockWidth*0.1,_blockWidth*0.13,_blockWidth*0.2,_blockWidth*0.37,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00133 al_draw_filled_rounded_rectangle (_blockWidth*0.8,_blockWidth*0.13,_blockWidth*0.9,_blockWidth*0.37,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00134 al_draw_filled_rounded_rectangle (_blockWidth*0.1,_blockWidth*0.63,_blockWidth*0.2,_blockWidth*0.87,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00135 al_draw_filled_rounded_rectangle (_blockWidth*0.8,_blockWidth*0.63,_blockWidth*0.9,_blockWidth*0.87,_blockWidth*0.03,_blockWidth*0.03, al_map_rgb(131,139,131)); 00136 00137 al_set_target_bitmap(prev_draw); 00138 } 00139 void BitmapStore::drawRock(ALLEGRO_BITMAP* canvas) 00140 { 00141 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00142 al_set_target_bitmap(canvas); 00143 00144 ALLEGRO_COLOR colour = al_map_rgb(131,139,131); 00145 al_draw_filled_circle(_blockWidth/2, _blockWidth/2, _blockWidth/2-1, colour); 00146 00147 al_draw_filled_circle(_blockWidth/2, _blockWidth/2, _blockWidth/2-6, colour); 00148 al_draw_filled_circle(_blockWidth/4, _blockWidth/4, _blockWidth/4-1, al_map_rgb(205,197,191)); 00149 al_draw_filled_circle(_blockWidth/3.2, _blockWidth/4.2, _blockWidth/4-2, al_map_rgb(205,197,191)); 00150 al_draw_filled_circle(_blockWidth/1.2, _blockWidth/2, _blockWidth/2-15, al_map_rgb(205,197,191)); 00151 al_draw_filled_circle(_blockWidth/2, _blockWidth/2, _blockWidth/2-8, al_map_rgb(205,205,193)); 00152 00153 al_set_target_bitmap(prev_draw); 00154 } 00155 void BitmapStore::drawCheckpoint(ALLEGRO_BITMAP* canvas) 00156 { 00157 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00158 al_set_target_bitmap(canvas); 00159 00160 ALLEGRO_COLOR colour = al_map_rgb(255,255,0); 00161 00162 al_draw_filled_rectangle (_blockWidth*0.44, _blockWidth*0.1, _blockWidth*0.5, _blockWidth*0.9, colour); 00163 al_draw_filled_rounded_rectangle (_blockWidth*0.34, _blockWidth*0.9, _blockWidth*0.6, _blockWidth*0.98, _blockWidth*0.01, _blockWidth*0.01, colour); 00164 al_draw_filled_circle (_blockWidth*0.47, _blockWidth*0.14, _blockWidth*0.1, colour); 00165 al_draw_filled_triangle (_blockWidth*0.44, _blockWidth*0.26, _blockWidth*0.44, _blockWidth*0.58, _blockWidth*0.8, _blockWidth*0.42, colour); 00166 00167 al_set_target_bitmap(prev_draw); 00168 } 00169 void BitmapStore::drawMazeWall(ALLEGRO_BITMAP* canvas) 00170 { 00171 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00172 al_set_target_bitmap(canvas); 00173 00174 ALLEGRO_COLOR colour = al_map_rgb(203,255,151); 00175 al_clear_to_color(colour); 00176 00177 al_set_target_bitmap(prev_draw); 00178 } 00179 void BitmapStore::drawMazeFloor(ALLEGRO_BITMAP* canvas) 00180 { 00181 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00182 al_set_target_bitmap(canvas); 00183 00184 ALLEGRO_COLOR colour = al_map_rgb(0,0,0); 00185 al_clear_to_color(colour); 00186 00187 al_set_target_bitmap(prev_draw); 00188 } 00189 void BitmapStore::drawSmoke(ALLEGRO_BITMAP* canvas) 00190 { 00191 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00192 al_set_target_bitmap(canvas); 00193 00194 ALLEGRO_COLOR colour = al_map_rgb(255,255,255); 00195 al_draw_circle (_blockWidth/2.3, _blockWidth/2.1, _blockWidth/2-1, colour,1); 00196 al_draw_circle (_blockWidth/4, _blockWidth/4, _blockWidth/4, colour,2); 00197 al_draw_circle (_blockWidth/5, _blockWidth/1.5, _blockWidth/4, colour,4); 00198 al_draw_circle (_blockWidth/2.5, _blockWidth/2.7, _blockWidth/3, colour,3); 00199 al_draw_circle (_blockWidth/1.2, _blockWidth/1.8, _blockWidth/3.7, colour,2); 00200 al_draw_circle (_blockWidth/2.8, _blockWidth/2.2, _blockWidth/6, colour,3); 00201 al_draw_circle (_blockWidth/1.1, _blockWidth/1.2, _blockWidth/3, colour,2); 00202 al_draw_circle (_blockWidth/1.2, _blockWidth/1.7, _blockWidth/2, colour,3); 00203 al_draw_circle (_blockWidth/1.3, _blockWidth/1.3, _blockWidth/5, colour,2); 00204 00205 al_set_target_bitmap(prev_draw); 00206 } 00207 00208 void BitmapStore::drawCrashedCar(ALLEGRO_BITMAP* canvas) 00209 { 00210 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00211 al_set_target_bitmap(canvas); 00212 00213 al_draw_filled_rounded_rectangle(_blockWidth/3.33, _blockWidth/5, _blockWidth/1.25, _blockWidth/1.04, 5, 5, al_map_rgb (200, 200, 200)); 00214 al_draw_circle (_blockWidth/2.3, _blockWidth/2.1, _blockWidth/2-1, al_map_rgb (255, 0, 0),1); 00215 al_draw_circle (_blockWidth/4, _blockWidth/4, _blockWidth/4, al_map_rgb (100, 100, 100),2); 00216 al_draw_circle (_blockWidth/5, _blockWidth/1.5, _blockWidth/4, al_map_rgb (255, 0, 0),4); 00217 al_draw_filled_rectangle(_blockWidth/2.5, _blockWidth/2, _blockWidth/1.43, _blockWidth/1.7, al_map_rgb (0,0, 0)); 00218 al_draw_circle (_blockWidth/2.5, _blockWidth/2.7, _blockWidth/3, al_map_rgb (100, 100, 100),3); 00219 al_draw_circle (_blockWidth/1.2, _blockWidth/1.8, _blockWidth/3.7, al_map_rgb (255, 0, 0),2); 00220 al_draw_rectangle(_blockWidth/3.13, _blockWidth/1.04, _blockWidth/1.25, _blockWidth, al_map_rgb (25,25, 112),1); 00221 al_draw_circle (_blockWidth/2.8, _blockWidth/2.2, _blockWidth/6, al_map_rgb (255, 0, 0),3); 00222 al_draw_circle (_blockWidth/1.1, _blockWidth/1.2, _blockWidth/3, al_map_rgb (100, 100, 100),2); 00223 al_draw_circle (_blockWidth/1.2, _blockWidth/1.7, _blockWidth/2, al_map_rgb (100, 100, 100),3); 00224 al_draw_circle (_blockWidth/1.3, _blockWidth/1.3, _blockWidth/5, al_map_rgb (255, 0, 0),2); 00225 00226 al_set_target_bitmap(prev_draw); 00227 } 00228 00229 void BitmapStore::drawClaimedCheckpoint(ALLEGRO_BITMAP* canvas) 00230 { 00231 ALLEGRO_BITMAP* prev_draw = al_get_target_bitmap(); 00232 al_set_target_bitmap(canvas); 00233 00234 ALLEGRO_COLOR colour = al_map_rgb(255,255,255); 00235 al_draw_text(_bitmapFont, colour, _blockWidth/2, _blockWidth/2, ALLEGRO_ALIGN_CENTRE , "GOTCHA"); 00236 00237 al_set_target_bitmap(prev_draw); 00238 }