1int main
()
2{
3 ALLEGRO_DISPLAY *display
;
4
5 if(!al_init())
6 {
7 al_show_native_message_box(0,
0,
"Error",
"Falied to initialize allegro",
0,
0);
8 return -1;
9 }
10
11 display
= al_create_display(ScreenWidth, ScreenHeight
);
12
13 if(!display
)
14 {
15 al_show_native_message_box(0,
0,
"Error",
"Falied to initialize the display",
0,
0);
16 return -1;
17 }
18
19 Player player
;
20 Enemy enemy
;
21 Enemy enemy2
;
22 Enemy enemy3
;
23 Enemy enemy4
;
24 Enemy enemy5
;
25 Enemy enemy6
;
26 Enemy enemy7
;
27 Enemy enemy8
;
28 Enemy enemy9
;
29 Enemy enemy10
;
30 Coin coin
;
31 Coin coin2
;
32 Coin coin3
;
33 Coin coin4
;
34 Coin coin5
;
35 Coin coin6
;
36 Coin coin7
;
37 Coin coin8
;
38 Coin coin9
;
39 Coin coin10
;
40 Coin coin11
;
41 Arrow arrow
;
42 Key
key;
43 int groundHeight
= 535;
44 bool done
= false, active
= false, draw
= true;
45 bool jump
= false;
46 bool gotKey
= false;
47 int sourceX
= 32, sourceY
= 0;
48 int coinCount
= 0;
49 const float FPS
= 60.
0;
50 const float frameFPS
= 15.
0;
51 const float enemyFPS
= 0.
1;
52 const float gravity
= 1;
53 float jumpSpeed
= 15.
0;
54 float velX
= 0, velY
= 0;
55
56 float cameraPosition
[2] = {0,
0};
57
58
59
60 al_init_image_addon();
61 if(!al_init_image_addon())
62 {
63 al_show_native_message_box(0,
0,
"Error",
"Failed to initalize image addon",
0,
0);
64 return -1;
65 }
66 al_init_primitives_addon();
67 if(!al_init_primitives_addon())
68 {
69 al_show_native_message_box(0,
0,
"Error",
"Failed to initalize primitives addon",
0,
0);
70 return -1;
71 }
72 al_install_keyboard();
73 if(!al_install_keyboard())
74 {
75 al_show_native_message_box(0,
0,
"Error",
"Failed to initalize keyboard",
0,
0);
76 return -1;
77 }
78 al_init_font_addon();
79 al_init_ttf_addon();
80 al_install_audio();
81 if(!al_install_audio())
82 {
83 al_show_native_message_box(0,
0,
"Error",
"Failed to initalize audio",
0,
0);
84 return -1;
85 }
86 al_init_acodec_addon();
87 if(!al_init_acodec_addon())
88 {
89 al_show_native_message_box(0,
0,
"Error",
"Failed to initalize codec",
0,
0);
90 return -1;
91 }
92
93 initPlayer
(player
);
94 initEnemy
(enemy,
86,
391);
95 initEnemy
(enemy2,
1167,
333);
96 initEnemy
(enemy3,
378,
473);
97 initEnemy
(enemy4,
649,
473);
98 initEnemy
(enemy5,
1608,
60);
99 initEnemy
(enemy6,
1850,
60);
100 initEnemy
(enemy7,
2130,
60);
101 initEnemy
(enemy8,
1762,
60);
102 initEnemy
(enemy9,
2000,
60);
103 initEnemy
(enemy10,
1306,
230);
104 initArrow
(arrow
);
105 initCoin
(coin,
550,
480);
106 initCoin
(coin2,
120,
398);
107 initCoin
(coin3,
1413,
80);
108 initCoin
(coin4,
1736,
68);
109 initCoin
(coin5,
1970,
68);
110 initCoin
(coin6,
431,
229);
111 initCoin
(coin7,
769,
38);
112 initCoin
(coin8,
1051,
341);
113 initCoin
(coin9,
922,
343);
114 initCoin
(coin10,
2377,
192);
115 initCoin
(coin11,
2502,
446);
116 initKey
(key);
117
118
119 al_reserve_samples(5); //Respresents how many audio clips I have in the game
120 al_set_display_icon(display, icon
);
121
122 al_set_sample_instance_playmode(songInstance, ALLEGRO_PLAYMODE_LOOP
);
123 al_attach_sample_instance_to_mixer(songInstance,
al_get_default_mixer());
124 al_set_window_title(display,
"Australian Outback");
125 al_register_event_source(event_queue,
al_get_keyboard_event_source());
126 al_register_event_source(event_queue,
al_get_timer_event_source(timer
));
127 al_register_event_source(event_queue,
al_get_timer_event_source(frameTimer
));
128 al_register_event_source(event_queue,
al_get_timer_event_source(enemyTimer
));
129 al_register_event_source(event_queue,
al_get_display_event_source(display
));
130
131 //al_play_sample_instance(songInstance);
132
133 al_start_timer(timer
);
134 al_start_timer(frameTimer
);
135 al_start_timer(enemyTimer
);
136 while(!done
)
137 {
138 ALLEGRO_EVENT event
;
139 al_wait_for_event(event_queue,
&event
);
140 al_get_keyboard_state(&keystate
);
141
142 if(al_key_down(&keystate, ALLEGRO_KEY_ESCAPE
))
143 {
144 done
= true;
145 }
146 else if(event.type
== ALLEGRO_EVENT_DISPLAY_CLOSE
)
147 {
148 done
= true;
149 }
150
151
152 else if(event.type
== ALLEGRO_EVENT_TIMER
)
153 {
154 if(event.timer.source
== timer
)
155 {
156 active
= true;
157 updateArrow
(arrow, player
);
158
159 if(al_key_down(&keystate, ALLEGRO_KEY_SPACE
))
160 {
161 fireArrow
(arrow, player, bowShot
);
162 }
163 if(al_key_down(&keystate, ALLEGRO_KEY_D
))
164 {
165 velX
= player.speed
;
166 player.dir
= RIGHT
;
167
168 }
169 else if(al_key_down(&keystate, ALLEGRO_KEY_A
))
170 {
171 velX
= -player.speed
;
172 player.dir
= LEFT
;
173 }
174 else
175 {
176 velX
= 0;
177 active
= false;
178 }
179 if(al_key_down(&keystate, ALLEGRO_KEY_W
) && jump
)
180 {
181 velY
= -jumpSpeed
;
182 jump
= false;
183 }
184 }
185 if(active
)
186 {
187 sourceX
+= al_get_bitmap_width(character
) / 3;
188 }
189 else
190 {
191 sourceX
= 32;
192 }
193 if(sourceX
>= al_get_bitmap_width(character
))
194 {
195 sourceX
= 0;
196 }
197 sourceY
= player.dir
;
198
199
200
201 if(!jump
)
202 velY
+= gravity
;
203 else
204 velY
= 0;
205 player.x
+= velX
;
206 player.y
+= velY
;
207
208 jump
= (player.y
>= groundHeight
);
209
210 if(jump
)
211 {
212 player.y
= groundHeight
;
213 } draw
= true;
214
215 updateEnemy
(enemy,
238,
78);
216 updateEnemy
(enemy2,
1236,
1167);
217 updateEnemy
(enemy3,
660,
378);
218 updateEnemy
(enemy4,
660,
378);
219 updateEnemy
(enemy5,
2163,
1599);
220 updateEnemy
(enemy6,
2163,
1599);
221 updateEnemy
(enemy7,
2163,
1599);
222 updateEnemy
(enemy8,
2163,
1599);
223 updateEnemy
(enemy9,
2163,
1599);
224 updateEnemy
(enemy10,
1506,
1306);
225
226
227 cameraUpdate
(cameraPosition, player,
32,
32);
228 al_identity_transform(&camera
);
229 al_translate_transform(&camera,
-cameraPosition
[0],
-cameraPosition
[1]);
230 al_use_transform(&camera
);
231
232 }
233
234 if(collision
(player,
1480,
295,
692,
305,
32,
32))//Mountain collision
235 {
236 player.x
-= player.speed
;
237 }
238 if(collision
(player,
1505,
300,
580,
300,
32,
32))//Mountain collision 2
239 {
240 player.x
= 10;
241 player.y
= 535;
242 --player.lives
;
243 }
244 if(collision
(player,
2135,
535,
530,
50,
32,
32))//Quicksand colllision
245 {
246 player.x
= 10;
247 player.y
= 535;
248 --player.lives
;
249 }
250
251 if(draw
&& al_is_event_queue_empty(event_queue
))
252 {
253 draw
= false;
254
255 al_draw_bitmap(background2,
0,
0,
0);
256 al_draw_bitmap_region(character, sourceX, sourceY
* al_get_bitmap_height(character
) / 2,
32,
32, player.x, player.y,
0);
257 drawKey
(key, keyImg
);
258 drawArrow
(arrow, arrow_r, arrow_l, player
);
259 drawCoin
(coin, coinImg
);
260 drawCoin
(coin2, coinImg
);
261 drawCoin
(coin3, coinImg
);
262 drawCoin
(coin4, coinImg
);
263 drawCoin
(coin5, coinImg
);
264 drawCoin
(coin6, coinImg
);
265 drawCoin
(coin7, coinImg
);
266 drawCoin
(coin8, coinImg
);
267 drawCoin
(coin9, coinImg
);
268 drawCoin
(coin10, coinImg
);
269 drawCoin
(coin11, coinImg
);
270 drawEnemy
(enemy, enemyImg2
);
271 drawEnemy
(enemy2, enemyImg2
);
272 drawEnemy
(enemy3, enemyImg2
);
273 drawEnemy
(enemy4, enemyImg2
);
274 drawEnemy
(enemy5, enemyImg2
);
275 drawEnemy
(enemy6, enemyImg2
);
276 drawEnemy
(enemy7, enemyImg2
);
277 drawEnemy
(enemy8, enemyImg2
);
278 drawEnemy
(enemy9, enemyImg2
);
279 drawEnemy
(enemy10, enemyImg2
);
280 al_identity_transform(&identity
);
281 al_use_transform(&identity
);
282 al_draw_textf(font,
al_map_rgb(252,
209,
22),
10,
10,
0,
"Arrows: %i", arrowCount
);
283 al_draw_textf(font,
al_map_rgb(252,
209,
22),
10,
50,
0,
"Coins: %i", coinCount
);
284 al_draw_textf(font,
al_map_rgb(252,
209,
22),
110,
10,
0,
"Lives: %i", player.lives
);
285 //al_draw_textf(fps, al_map_rgb(252, 209, 22), 110, 50, 0, "FPS: %i", FPS);
286 al_flip_display();
287 al_clear_to_color(al_map_rgb(255,
255,
255));
288
289 }
290 }
291}
292void initPlayer
(Player
&player
)
293{
294 player.dir
= LEFT
;
295 player.x
= 1316;
296 player.y
= 0;
297 player.lives
= 3;
298 player.speed
= 5;
299 player.score
= 0;
300 player.dir
= RIGHT
;
301}
302
303void initEnemy
(Enemy
&enemy,
int x,
int y
)
304{
305 enemy.live
= true;
306 enemy.speedR
= 2;
307 enemy.speedL
= -2;
308 enemy.speed
= 2;
309 enemy.x
= x
;
310 enemy.y
= y
;
311 enemy.dir
= eLEFT
;
312 enemy.eSourceX
= 32;
313 enemy.eSourceY
= 0;
314 enemy.acitve
= false;
315 enemy.width
= 29;
316 enemy.height
= 29;
317}
318void drawEnemy
(Enemy
&enemy,
ALLEGRO_BITMAP *image
)
319{
320 if(enemy.live
)
321 {
322 enemy.acitve
= true;
323 if(enemy.acitve
)
324 {
325 enemy.eSourceX
+= al_get_bitmap_width(image
) / 3;
326 }
327 else
328 {
329 enemy.eSourceX
= 0;
330 }
331 if(enemy.eSourceX
>= al_get_bitmap_width(image
))
332 {
333 enemy.eSourceX
= 0;
334 }
335 enemy.eSourceY
= enemy.dir
;
336
337 al_draw_bitmap_region(image, enemy.eSourceX, enemy.eSourceY
* al_get_bitmap_height(image
) / 2,
32,
32, enemy.x, enemy.y,
0);
338
339 }
340}
341void updateEnemy
(Enemy
&enemy,
int posX,
int posX2
)
342{
343 if(enemy.live
)
344 {
345 enemy.x
+= enemy.speed
;
346 if(enemy.x
>= posX
)
347 {
348 enemy.dir
= eLEFT
;
349 enemy.x
= posX
;
350 enemy.speed
= enemy.speedL
;
351 }
352 if(enemy.x
<= posX2
)
353 {
354 enemy.dir
= eRIGHT
;
355 enemy.x
= posX2
;
356 enemy.speed
= enemy.speedR
;
357 }
358 }
359}