![]() |
|
debug crashes when entering a new phase |
Joe Cangelosi
Member #13,932
January 2012
|
Hello, I'm redesigning a simple side shooter game from a templet. I'm trying to introduce different phases. I am able to have the first phase transition into a boss phase. However when it is time to transition into the next phase, the program crashes. Any advice or help would be very appreciated. 1int main(void)
2{
3 //primitive variable*********************************************************************
4 bool done = false;
5 bool redraw = true;
6 const int FPS = 60;
7 int state = -1;
8 int level = -1;
9 int imageRad = 20;
10
11 int imageWidth = 0;
12 int imageHeight = 0;
13
14 //object variables***********************************************************************
15 Background BG;
16 Background MG;
17 Background FG;
18
19 //Allegro variables**********************************************************************
20 ALLEGRO_DISPLAY *display = NULL;
21 ALLEGRO_EVENT_QUEUE *event_queue = NULL;
22 ALLEGRO_TIMER *timer = NULL;
23 ALLEGRO_FONT *font18 = NULL;
24 ALLEGRO_BITMAP *shipImage;
25 ALLEGRO_BITMAP *bulletImage;
26 ALLEGRO_BITMAP *cometImage;
27 ALLEGRO_BITMAP *expImage;
28 ALLEGRO_BITMAP *title = NULL;
29 ALLEGRO_BITMAP *lost = NULL;
30 ALLEGRO_BITMAP *bgImage = NULL;
31 ALLEGRO_BITMAP *mgImage = NULL;
32 ALLEGRO_BITMAP *fgImage = NULL;
33 ALLEGRO_BITMAP *bossImage;
34
35 //Initialization functions*********************************************************************
36 if(!al_init())
37 return -1;
38
39 display = al_create_display(WIDTH, HEIGHT);
40
41 if(!display)
42 return -1;
43
44 al_init_primitives_addon();
45 al_install_keyboard();
46 al_init_font_addon();
47 al_init_ttf_addon();
48 al_init_image_addon();
49 al_install_audio();
50 al_init_acodec_addon();
51
52
53
54 event_queue = al_create_event_queue();
55 timer = al_create_timer(1.0 / FPS);
56
57 shipImage = al_load_bitmap("Ship.png");
58 al_convert_mask_to_alpha(shipImage, al_map_rgb(255, 0, 255));
59
60 bulletImage = al_load_bitmap("Bullet.png");
61
62 cometImage = al_load_bitmap("asteroid-1-96.png");
63
64 expImage = al_load_bitmap("explosion_3_40_128-300x300.png");
65
66 bossImage = al_load_bitmap("Boss.png");
67
68 title = al_load_bitmap("Shooter_Title.png");
69 lost = al_load_bitmap("Shooter_Lose.png");
70
71 bgImage = al_load_bitmap("starBG.png");
72 mgImage = al_load_bitmap("starMG.png");
73 fgImage = al_load_bitmap("starFG.png");
74
75 al_reserve_samples(10);
76
77 shot = al_load_sample("shot.wma");
78 boom = al_load_sample("boom.wma");
79 song = al_load_sample("song.mp3");
80
81 songInstance = al_create_sample_instance(song);
82 al_set_sample_instance_playmode(songInstance, ALLEGRO_PLAYMODE_LOOP);
83
84 al_attach_sample_instance_to_mixer(songInstance, al_get_default_mixer());
85
86
87 srand(time(NULL));
88
89 ChangeState(state, TITLE);
90 ChangeLevel(level, FIRST);
91
92
93 InitShip(ship, shipImage);
94 InitBullet(bullets, NUM_BULLETS, bulletImage);
95 InitComet(comets, NUM_COMETS, cometImage);
96 InitExplosions(explosions, NUM_EXPLOSIONS, expImage);
97 InitBoss(boss, NUM_BOSS, bossImage);
98
99 InitBackground(BG, 0, 0, 1, 0, 800, 400, -1, 1, bgImage);
100 InitBackground(MG, 0, 0, 3, 0, 3200, 400, -1, 1, mgImage);
101 InitBackground(FG, 0, 0, 10, 0, 800, 400, -1, 1, fgImage);
102
103 font18 = al_load_font("ariblk.ttf", 18, 0);
104
105 al_register_event_source(event_queue, al_get_keyboard_event_source());
106 al_register_event_source(event_queue, al_get_timer_event_source(timer));
107 al_register_event_source(event_queue, al_get_display_event_source(display));
108
109 al_start_timer(timer);
110
111
112 while(!done)
113 {
114 ALLEGRO_EVENT ev;
115 al_wait_for_event(event_queue, &ev);
116
117 if(ev.type == ALLEGRO_EVENT_TIMER)
118 {
119 redraw = true;
120 if(keys[UP])
121 MoveShipUp(ship);
122 else if(keys[DOWN])
123 MoveShipDown(ship);
124 else
125 ResetShipAnimation(ship, 1);
126 if(keys[LEFT])
127 MoveShipLeft(ship);
128 else if(keys[RIGHT])
129 MoveShipRight(ship);
130 else ResetShipAnimation(ship, 2);
131
132 if(state == TITLE)
133 {}
134
135 //Entering the playing mode ===================================================================
136 else if(state == PLAYING)
137 {
138 if(ship.lives >= 0)
139 {
140 UpdateBackground(BG);
141 UpdateBackground(MG);
142 UpdateBackground(FG);
143
144 //first phase==========================================================================
145 if(level == FIRST)
146 {
147 UpdateExplosions(explosions, NUM_EXPLOSIONS);
148 UpdateBullet(bullets, NUM_BULLETS);
149 StartComet(comets, NUM_COMETS);
150 UpdateComet(comets, NUM_COMETS);
151 CollideBullet(bullets, NUM_BULLETS, comets, NUM_COMETS, boss, NUM_BOSS, ship,explosions, NUM_EXPLOSIONS);
152 CollideComet(comets, NUM_COMETS, ship, explosions, NUM_EXPLOSIONS);
153
154 if(ship.score == 5)
155 {
156 ChangeLevel(level, ABOSS); //when the score reaches 5, the game goes to the next phase
157 }
158 }
159
160 //first phase (boss)=====================================================================
161 else if(level == ABOSS)
162 {
163 if(boss[1].health >= 1)
164 {
165 UpdateExplosions(explosions, NUM_EXPLOSIONS);
166 UpdateBullet(bullets, NUM_BULLETS);
167 UpdateComet(comets, NUM_COMETS);
168 CollideBullet(bullets, NUM_BULLETS, comets, NUM_COMETS, boss, NUM_BOSS, ship,explosions, NUM_EXPLOSIONS);
169 CollideComet(comets, NUM_COMETS, ship, explosions, NUM_EXPLOSIONS);
170
171 StartBoss(boss, NUM_BOSS);
172 UpdateBoss(boss, NUM_BOSS);
173 }
174 else
175 ChangeLevel(level, SECOND); //once the boss dies, the second phase starts
176 }
177
178 //second phase ==========================================================================
179 else if(level == SECOND)
180 {
181 std::cout << "initial level loaded\n"; // <- This is not showing up in console
182 UpdateExplosions(explosions, NUM_EXPLOSIONS);
183 UpdateBullet(bullets, NUM_BULLETS);
184 StartComet(comets, NUM_COMETS);
185 UpdateComet(comets, NUM_COMETS);
186 CollideBullet(bullets, NUM_BULLETS, comets, NUM_COMETS, boss, NUM_BOSS, ship,explosions, NUM_EXPLOSIONS);
187 CollideComet(comets, NUM_COMETS, ship, explosions, NUM_EXPLOSIONS);
188 }
189 }
190
191 else if(ship.lives <= 0)
192 ChangeState(state, LOST);
193 }
194
195 else if(state == LOST)
196 {}
197
198 }
199 else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
200 {
201 done = true;
202 }
203 else if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
204 {
205 switch(ev.keyboard.keycode)
206 {
207 case ALLEGRO_KEY_ESCAPE:
208 done = true;
209 break;
210 case ALLEGRO_KEY_UP:
211 keys[UP] = true;
212 break;
213 case ALLEGRO_KEY_DOWN:
214 keys[DOWN] = true;
215 break;
216 case ALLEGRO_KEY_LEFT:
217 keys[LEFT] = true;
218 break;
219 case ALLEGRO_KEY_RIGHT:
220 keys[RIGHT] = true;
221 break;
222 case ALLEGRO_KEY_SPACE:
223 keys[SPACE] = true;
224 if(state == TITLE)
225 ChangeState(state, PLAYING);
226 else if(state == PLAYING)
227 FireBullet(bullets, NUM_BULLETS, ship);
228 else if(state == LOST)
229 ChangeState(state, PLAYING);
230 break;
231 }
232 }
233 else if(ev.type == ALLEGRO_EVENT_KEY_UP)
234 {
235 switch(ev.keyboard.keycode)
236 {
237 case ALLEGRO_KEY_UP:
238 keys[UP] = false;
239 break;
240 case ALLEGRO_KEY_DOWN:
241 keys[DOWN] = false;
242 break;
243 case ALLEGRO_KEY_LEFT:
244 keys[LEFT] = false;
245 break;
246 case ALLEGRO_KEY_RIGHT:
247 keys[RIGHT] = false;
248 break;
249 case ALLEGRO_KEY_SPACE:
250 keys[SPACE] = false;
251 break;
252 }
253 }
254
255 if(redraw && al_is_event_queue_empty(event_queue))
256 {
257 redraw = false;
258
259 if(state == TITLE)
260 {
261 al_draw_bitmap(title, 0, 0, 0);
262 }
263 else if(state == PLAYING)
264 {
265 DrawBackground(BG);
266 DrawBackground(MG);
267 DrawBackground(FG);
268
269 DrawShip(ship);
270 DrawBullet(bullets, NUM_BULLETS);
271 DrawComet(comets, NUM_COMETS);
272 DrawExplosions(explosions, NUM_EXPLOSIONS);
273 DrawBoss(boss, NUM_BOSS);
274
275 al_draw_textf(font18, al_map_rgb(255, 0, 255), 5, 5, 0,"%i lives left score: %i", ship.lives, ship.score);
276 al_draw_textf(font18, al_map_rgb(0, 255, 255), 10, 10, 0,"%i lives left", boss[1].health);
277 }
278 else if(state == LOST)
279 {
280 al_draw_bitmap(lost, 0, 0, 0);
281
282 al_draw_textf(font18, al_map_rgb(0, 0, 0), WIDTH - 10, 20, ALLEGRO_ALIGN_RIGHT, "FINAL SCORE: %i", ship.score);
283 }
284
285
286 al_flip_display();
287 al_clear_to_color(al_map_rgb(0,0,0));
288
289 }
290 }
291
292 al_destroy_sample(shot);
293 al_destroy_sample(boom);
294 al_destroy_sample(song);
295 al_destroy_sample_instance(songInstance);
296 al_destroy_bitmap(bgImage);
297 al_destroy_bitmap(mgImage);
298 al_destroy_bitmap(fgImage);
299 al_destroy_bitmap(title);
300 al_destroy_bitmap(lost);
301 al_destroy_bitmap(expImage);
302 al_destroy_bitmap(cometImage);
303 al_destroy_bitmap(shipImage);
304 al_destroy_bitmap(bossImage);
305 al_destroy_event_queue(event_queue);
306 al_destroy_timer(timer);
307 al_destroy_font(font18);
308 al_destroy_display(display);
309
310 return 0;
311}
312
313
314
315
316;
|
Edgar Reynaldo
Major Reynaldo
May 2007
![]() |
You need to run it through a debugger like gdb and obtain a backtrace of when it crashes. If you don't know what those two things are it's time to google them. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
jmasterx
Member #11,410
October 2009
|
You should look up, certainly what Edgar has mentioned, and also Scene Management. Pertaining to the problem at hand though: if(boss[1].health.... Are you sure you intended to check the SECOND element in the array here? remember arrays start at 0 eg: boss[0] would be the first boss. Agui GUI API -> https://github.com/jmasterx/Agui |
Joe Cangelosi
Member #13,932
January 2012
|
thank you both, I'm relatively new to programming, but your advice helped out a lot. I appreciate it |
|