Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » Allegro 5.0.10 strange behaviour

This thread is locked; no one can reply to it. rss feed Print
Allegro 5.0.10 strange behaviour
Fredrik Beckman
Member #15,374
November 2013

[edit] made a mistake with code formatting, tried to fix

hi,
the problem: it seems like my program starts without waiting for my keypress. After loading bitmaps, fonts and stuff I added a wait loop for pressing space, but if I start the program, wait for about 5 sec and then press space, I can see that the game started without me, kind of.

I can't figure out how, its like a separate program is running invisible and spoils everything.

Allegro 5.0.10
VCC 2008 Express

Could it be some unload/detach or something I've missed?

Is there a kind soul out there to take a peek and give a hint of what it could be? Code and bitmaps attached, adding most of code below too (can't add all - post too long):

main.cpp:

#SelectExpand
1 2#include <stdio.h> 3#include <math.h> 4#include <windows.h> 5#pragma comment(lib,"ws2_32.lib") 6 7#include "allegro5/allegro.h" 8#include "allegro5/allegro_image.h" 9#include "allegro5/allegro_native_dialog.h" 10#include <allegro5/allegro_font.h> 11#include <allegro5/allegro_ttf.h> 12 13#include "Main_loc.h" 14 15const float 16 FPS = 60, 17 pi = 3.14159265; 18 19const int 20 SCREEN_W = 800, 21 SCREEN_H = 600, 22 GAME_AREA_W = 600, 23 GAME_AREA_H = 500, 24 GAME_AREA_OFFSX = 45, 25 GAME_AREA_OFFSY = 45, 26 GAME_AREA_BORDER_W = 10, 27 GAME_AREA_BORDER_H = 10, 28 TANK_SIZE = 26, 29 TANK_OFFS_X = 12, 30 TANK_OFFS_Y = 12, 31 BULLET_OFFS_X = 2, 32 BULLET_OFFS_Y = 2, 33 TANK_SPEED = 1, 34 BULLET_SPEED = 3, 35 BULLET_COUNT = 60, 36 INFO_TEXT_X = 670, 37 PLAYER_TEXT_Y = 60, 38 ENEMY_TEXT_Y = 150, 39 ENEMY_DIST_OFFSET = 25, 40 ENEMY_FIRE_OFFSET = 200; 41 42bool CollDetectWalls(objectData_st *object_p); 43 44bool CollDetectTanks(float object1_x, float object1_y, objectData_st *object2_p); 45 46bool CollDetectShot(objectData_st *shot_p, objectData_st *tank_p); 47 48bool MoveTank(objectData_st *tank1_p, objectData_st *tank2_p, bool *key_p); 49 50bool SetEnemyDirectionRight(objectData_st *tank1_p, objectData_st *tank2_p); 51 52bool SetEnemyDirectionLeft(objectData_st *tank1_p, objectData_st *tank2_p); 53 54bool SetEnemyDirectionFwd(objectData_st *tank1_p, objectData_st *tank2_p); 55 56bool SetEnemyFire(objectData_st *tank1_p, objectData_st *tank2_p); 57 58int 59 main(int argc, char **argv) 60 { 61 ALLEGRO_BITMAP 62 *backGround = NULL; 63 64 ALLEGRO_FONT 65 *font; 66 67 ALLEGRO_DISPLAY 68 *display = NULL; 69 70 ALLEGRO_EVENT_QUEUE 71 *event_queue = NULL; 72 73 ALLEGRO_EVENT 74 ev; 75 76 ALLEGRO_KEYBOARD_STATE 77 kbdstate; 78 79 ALLEGRO_TIMER 80 *timer = NULL; 81 82 bool 83 redraw = true, 84 key[5] = { false, false, false, false, false }, 85 enKey[5] = { false, false, false, false, false }, 86 doexit = false; 87 88 char 89 tmpText[255]; 90 91 int 92 counter1 = 0, 93 counter2 = 0; 94 95 objectData_st 96 playerShot = 97 { 98 NULL, /* ALLEGRO_BITMAP *bitmap */ 99 0.0, /* float x */ 100 0.0, /* float y */ 101 0.0, /* float angle */ 102 0.0, /* float angle */ 103 3.0, /* float speed */ 104 0, /* int cnt */ 105 0, /* int fireCnt */ 106 0, /* int points */ 107 10, /* type */ 108 false, /* bool active */ 109 false /* bool hit */ 110 }, 111 112 playerTank = 113 { 114 NULL, /* ALLEGRO_BITMAP *bitmap */ 115 (SCREEN_W / 2.0 - TANK_SIZE / 2.0), /* float x */ 116 (4.0 * (SCREEN_H / 5.0) - TANK_SIZE / 2.0), /* float y */ 117 0.0, /* float angle */ 118 0.0, /* float angle */ 119 1.0, /* float speed */ 120 0, /* int cnt */ 121 0, /* int fireCnt */ 122 0, /* int points */ 123 0, /* type */ 124 true, /* bool active */ 125 false /* bool hit */ 126 }, 127 128 enemyShot = 129 { 130 NULL, /* ALLEGRO_BITMAP *bitmap */ 131 0.0, /* float x */ 132 0.0, /* float y */ 133 0.0, /* float angle */ 134 0.0, /* float angle */ 135 3.0, /* float speed */ 136 0, /* int cnt */ 137 0, /* int cnt */ 138 0, /* int points */ 139 11, /* type */ 140 false, /* bool active */ 141 false /* bool hit */ 142 }, 143 enemyTank = 144 { 145 NULL, /* ALLEGRO_BITMAP *bitmap */ 146 (SCREEN_W / 2.0 - TANK_SIZE / 2.0), /* float x */ 147 (1.0 * (SCREEN_H / 5.0) - TANK_SIZE / 2.0), /* float y */ 148 pi, /* float angle */ 149 pi, /* float angle */ 150 1.0, /* float speed */ 151 0, /* int cnt */ 152 0, /* int cnt */ 153 0, /* int points */ 154 1, /* type */ 155 true, /* bool active */ 156 false /* bool hit */ 157 }; 158 159 fprintf(stderr, "Starting!\n"); 160 161 /*******************************************/ 162 /* Init Allegro */ 163 if(!al_init()) 164 { 165 fprintf(stderr, "Failed to initialize allegro!\n"); 166 } 167 168 /*******************************************/ 169 /* Create timer */ 170 timer = al_create_timer(1.0 / FPS); 171 if(!timer) 172 { 173 al_show_native_message_box(display, "Error", "Error", "Failed to create timer!", 174 NULL, ALLEGRO_MESSAGEBOX_ERROR); 175 176 al_destroy_timer(timer); 177 return 0; 178 179 } 180 181 /*******************************************/ 182 /* Init image addon */ 183 if(!al_init_image_addon()) { 184 al_show_native_message_box(display, "Error", "Error", "Failed to initialize al_init_image_addon!", 185 NULL, ALLEGRO_MESSAGEBOX_ERROR); 186 187 al_destroy_timer(timer); 188 return 0; 189 } 190 191 /*******************************************/ 192 /* Start keyboard detection */ 193 if(!al_install_keyboard()) { 194 al_show_native_message_box(display, "Error", "Error", "Failed to initialize the keyboard!", 195 NULL, ALLEGRO_MESSAGEBOX_ERROR); 196 197 al_destroy_timer(timer); 198 return 0; 199 } 200 201 /*******************************************/ 202 /* Create display */ 203 display = al_create_display(SCREEN_W, SCREEN_H); 204 if(!display) 205 { 206 al_show_native_message_box(display, "Error", "Error", "Failed to create display!", 207 NULL, ALLEGRO_MESSAGEBOX_ERROR); 208 209 al_destroy_display(display); 210 al_destroy_timer(timer); 211 return 0; 212 } 213 214 /*******************************************/ 215 /* Text */ 216 /* Create the info text */ 217 218 /* initialize the font addon (really? ttf below...) */ 219 al_init_font_addon(); 220 221 /* initialize the ttf (True Type Font) addon */ 222 al_init_ttf_addon(); 223 224 font = al_load_ttf_font(".\\data\\pixlkrud.ttf", 18, 0 ); 225 226 if (!font){ 227 al_show_native_message_box(display, "Error", "Error", "Failed to load 'pixlkrud.ttf!", 228 NULL, ALLEGRO_MESSAGEBOX_ERROR); 229 230 al_destroy_font(font); 231 al_destroy_display(display); 232 al_destroy_timer(timer); 233 return 0; 234 } 235 236 /*******************************************/ 237 /* Background bitmap */ 238 /* Create bitmap picture background */ 239 backGround = al_load_bitmap(".\\data\\backGround.bmp"); 240 if(!backGround) { 241 al_show_native_message_box(display, "Error", "Error", "Failed to load image background!", 242 NULL, ALLEGRO_MESSAGEBOX_ERROR); 243 244 al_destroy_bitmap(backGround); 245 al_destroy_font(font); 246 al_destroy_display(display); 247 al_destroy_timer(timer); 248 return 0; 249 } 250 251 /* Mask "Magic pink" */ 252 al_set_target_bitmap(backGround); 253 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 254 al_convert_mask_to_alpha(backGround, al_map_rgba_f(1, 0, 1, 1)); 255 256 /*******************************************/ 257 /* Player bitmaps */ 258 /* Create bitmap picture player playerShot */ 259 playerShot.bitmap = al_load_bitmap(".\\data\\Bullet.bmp"); 260 if(!playerShot.bitmap) { 261 al_show_native_message_box(display, "Error", "Error", "Failed to load image playerShot.bitmap!", 262 NULL, ALLEGRO_MESSAGEBOX_ERROR); 263 264 al_destroy_bitmap(playerShot.bitmap); 265 al_destroy_bitmap(backGround); 266 al_destroy_font(font); 267 al_destroy_display(display); 268 al_destroy_timer(timer); 269 return 0; 270 } 271 272 /* Mask "Magic pink" */ 273 al_set_target_bitmap(playerShot.bitmap); 274 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 275 al_convert_mask_to_alpha(playerShot.bitmap, al_map_rgba_f(1, 0, 1, 1)); 276 277 /* Create bitmap picture player tank */ 278 playerTank.bitmap = al_load_bitmap(".\\data\\TankBlack.bmp"); 279 if(!playerTank.bitmap) { 280 al_show_native_message_box(display, "Error", "Error", "Failed to load image playerTank.bitmap!", 281 NULL, ALLEGRO_MESSAGEBOX_ERROR); 282 283 al_destroy_bitmap(playerTank.bitmap); 284 al_destroy_bitmap(playerShot.bitmap); 285 al_destroy_bitmap(backGround); 286 al_destroy_font(font); 287 al_destroy_display(display); 288 al_destroy_timer(timer); 289 return 0; 290 } 291 292 /* Mask "Magic pink" */ 293 al_set_target_bitmap(playerTank.bitmap); 294 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 295 al_convert_mask_to_alpha(playerTank.bitmap, al_map_rgba_f(1, 0, 1, 1)); 296 297 /*******************************************/ 298 /* Enemy bitmaps */ 299 /* Create bitmap picture enemy playerShot */ 300 enemyShot.bitmap = al_load_bitmap(".\\data\\Bullet.bmp"); 301 if(!enemyShot.bitmap) { 302 al_show_native_message_box(display, "Error", "Error", "Failed to load image enemyShot.bitmap!", 303 NULL, ALLEGRO_MESSAGEBOX_ERROR); 304 305 al_destroy_bitmap(enemyShot.bitmap); 306 al_destroy_bitmap(playerTank.bitmap); 307 al_destroy_bitmap(playerShot.bitmap); 308 al_destroy_bitmap(backGround); 309 al_destroy_font(font); 310 al_destroy_display(display); 311 al_destroy_timer(timer); 312 return 0; 313 } 314 315 /* Mask "Magic pink" */ 316 al_set_target_bitmap(enemyShot.bitmap); 317 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 318 al_convert_mask_to_alpha(enemyShot.bitmap, al_map_rgba_f(1, 0, 1, 1)); 319 320 /* Create bitmap picture enemy tank */ 321 enemyTank.bitmap = al_load_bitmap(".\\data\\TankRed.bmp"); 322 if(!enemyTank.bitmap) { 323 al_show_native_message_box(display, "Error", "Error", "Failed to load image enemyTank.bitmap!", 324 NULL, ALLEGRO_MESSAGEBOX_ERROR); 325 326 al_destroy_bitmap(enemyTank.bitmap); 327 al_destroy_bitmap(enemyShot.bitmap); 328 al_destroy_bitmap(playerTank.bitmap); 329 al_destroy_bitmap(playerShot.bitmap); 330 al_destroy_bitmap(backGround); 331 al_destroy_font(font); 332 al_destroy_display(display); 333 al_destroy_timer(timer); 334 return 0; 335 } 336 337 /* Mask "Magic pink" */ 338 al_set_target_bitmap(enemyTank.bitmap); 339 al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); 340 al_convert_mask_to_alpha(enemyTank.bitmap, al_map_rgba_f(1, 0, 1, 1)); 341 342 /* Create event queue */ 343 event_queue = al_create_event_queue(); 344 if(!event_queue) 345 { 346 al_destroy_event_queue(event_queue); 347 al_destroy_bitmap(enemyTank.bitmap); 348 al_destroy_bitmap(enemyShot.bitmap); 349 al_destroy_bitmap(playerTank.bitmap); 350 al_destroy_bitmap(playerShot.bitmap); 351 al_destroy_bitmap(backGround); 352 al_destroy_font(font); 353 al_destroy_display(display); 354 al_destroy_timer(timer); 355 return 0; 356 } 357 358 /* Display event */ 359 al_register_event_source(event_queue, al_get_display_event_source(display)); 360 361 /* Timer event */ 362 al_register_event_source(event_queue, al_get_timer_event_source(timer)); 363 364 /* Key event */ 365 //al_register_event_source(event_queue, al_get_keyboard_event_source()); 366 367 /* Clear screen to white */ 368 al_set_target_bitmap(al_get_backbuffer(display)); 369 al_clear_to_color(al_map_rgb(255, 255, 255)); 370 al_flip_display(); 371 372 /* Start timer */ 373 al_start_timer(timer); 374 375 /* Draw window area */ 376 al_set_target_backbuffer(display); 377 al_clear_to_color(al_map_rgb(255, 255, 255)); 378 379 /* Draw text */ 380 al_draw_text(font, al_map_rgb(200, 0, 0), (SCREEN_W / 2), (SCREEN_H / 2), ALLEGRO_ALIGN_CENTRE, "Press fire when ready"); 381 382 al_flip_display(); 383 384 /* SPACE pressed */ 385 do 386 { 387 al_get_keyboard_state(&kbdstate); 388 } while (al_key_down(&kbdstate, ALLEGRO_KEY_SPACE) != true); 389 390 /* SPACE released */ 391 do 392 { 393 al_get_keyboard_state(&kbdstate); 394 } while (al_key_down(&kbdstate, ALLEGRO_KEY_SPACE) == true); 395 396 397 /*************/ 398 /* MAIN LOOP */ 399 400 fprintf(stderr, "Starting main loop\n"); 401 while(doexit == false) 402 { 403 al_wait_for_event(event_queue, &ev); 404 if(ev.type == ALLEGRO_EVENT_TIMER) 405 { 406 /* Enemy tank - checked if turn left */ 407 if (SetEnemyDirectionLeft(&enemyTank, &playerTank)) 408 { 409 enKey[KEY_LEFT] = true; 410 enKey[KEY_RIGHT] = false; 411 } 412 /* Enemy tank - checked if turn right */ 413 else if (enKey[KEY_RIGHT] = SetEnemyDirectionRight(&enemyTank, &playerTank)) 414 { 415 enKey[KEY_RIGHT] = true; 416 enKey[KEY_LEFT] = false; 417 } 418 419 enKey[KEY_UP] = SetEnemyDirectionFwd(&enemyTank, &playerTank); 420 enKey[KEY_SPACE] = SetEnemyFire(&enemyTank, &playerTank); 421 422 /* TODO: Use keyb event! */ 423 al_get_keyboard_state(&kbdstate); 424 key[KEY_UP] = al_key_down(&kbdstate, ALLEGRO_KEY_UP); 425 key[KEY_DOWN] = al_key_down(&kbdstate, ALLEGRO_KEY_DOWN); 426 key[KEY_LEFT] = al_key_down(&kbdstate, ALLEGRO_KEY_LEFT); 427 key[KEY_RIGHT] = al_key_down(&kbdstate, ALLEGRO_KEY_RIGHT); 428 key[KEY_SPACE] = al_key_down(&kbdstate, ALLEGRO_KEY_SPACE); 429 430 if (al_key_down(&kbdstate, ALLEGRO_KEY_ESCAPE)) 431 { 432 /* Quit */ 433 break; 434 } 435 436 enemyTank.active = MoveTank(&playerTank, &enemyTank, &key[0]); 437 playerTank.active = MoveTank(&enemyTank, &playerTank, &enKey[0]); 438 439 /* Check if player FIRE */ 440 if (key[KEY_SPACE] && !playerShot.active && playerTank.active) 441 { 442 /* Shoot! */ 443 playerShot.x = playerTank.x; 444 playerShot.y = playerTank.y; 445 playerShot.movAngle = playerTank.movAngle; 446 playerShot.rotAngle = playerShot.movAngle; 447 playerShot.active = true; 448 playerShot.cnt = 0; 449 fprintf(stderr, "Player shoot! playerShot.cnt = %d\n", playerShot.cnt); 450 } 451 452 if (playerShot.active && playerShot.cnt < BULLET_COUNT) 453 { 454 /* Bullet's moving */ 455 playerShot.y -= playerShot.speed * cos(playerShot.movAngle); 456 playerShot.x += playerShot.speed * sin(playerShot.movAngle); 457 playerShot.cnt += 1; 458 } 459 else if(playerShot.active) 460 { 461 /* Bullet reached end */ 462 playerShot.cnt = 0; 463 playerShot.active = false; 464 } 465 466 /* Collision detection player bullet / enemy tank */ 467 if (CollDetectShot(&playerShot, &enemyTank) && playerShot.active) 468 { 469 /* Collision */ 470 fprintf(stderr, "Collision (player shot - enemy tank)!\n\n"); 471 playerShot.active = false; 472 playerTank.active = false; 473 playerTank.points += 1; 474 475 enemyTank.hit = true; 476 enemyTank.active = false; 477 enemyTank.movAngle = playerShot.movAngle; 478 enemyTank.speed = BULLET_SPEED; 479 } 480 481 482 483 /* Check if enemy FIRE */ 484 if (enKey[KEY_SPACE] && !enemyShot.active && enemyTank.active) 485 { 486 /* Shoot! */ 487 enemyShot.x = enemyTank.x; 488 enemyShot.y = enemyTank.y; 489 enemyShot.movAngle = enemyTank.movAngle; 490 enemyShot.rotAngle = enemyTank.movAngle; 491 enemyShot.active = true; 492 enemyShot.cnt = 0; 493 fprintf(stderr, "Enemy shoot! playerShot.cnt = %d\n", enemyShot.cnt); 494 } 495 496 if (enemyShot.active && enemyShot.cnt < BULLET_COUNT) 497 { 498 /* Bullet's moving */ 499 enemyShot.y -= enemyShot.speed * cos(enemyShot.movAngle); 500 enemyShot.x += enemyShot.speed * sin(enemyShot.movAngle); 501 enemyShot.cnt += 1; 502 } 503 else if(enemyShot.active) 504 { 505 /* Bullet reached end */ 506 enemyShot.cnt = 0; 507 enemyShot.active = false; 508 } 509 510 /* Collision detection player bullet / enemy tank */ 511 if (CollDetectShot(&enemyShot, &playerTank) && enemyShot.active) 512 { 513 /* Collision */ 514 fprintf(stderr, "Collision (enemy shot - player tank)!\n\n"); 515 enemyShot.active = false; 516 enemyTank.active = false; 517 enemyTank.points += 1; 518 519 playerTank.hit = true; 520 playerTank.active = false; 521 playerTank.movAngle = enemyShot.movAngle; 522 playerTank.speed = BULLET_SPEED; 523 } 524 525 /* Collision detection outer walls (Y) */ 526 (void) CollDetectWalls(&playerTank); 527 528 /* Collision detection outer walls */ 529 (void) CollDetectWalls(&enemyTank); 530 531 redraw = true; 532 } 533 else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) 534 { 535 break; 536 } 537 538 if(redraw && al_is_event_queue_empty(event_queue)) 539 { 540 redraw = false; 541 542 /* Draw window area */ 543 al_set_target_backbuffer(display); 544 al_clear_to_color(al_map_rgb(255, 255, 255)); 545 546 /* Draw text */ 547 al_draw_text(font, al_map_rgb(200, 0, 0), (SCREEN_W / 2), (GAME_AREA_OFFSY / 2), ALLEGRO_ALIGN_CENTRE, "T.A.N.K.S"); 548 549 al_draw_text(font, al_map_rgb(200, 0, 0), INFO_TEXT_X, PLAYER_TEXT_Y, ALLEGRO_ALIGN_LEFT, "PLAYER"); 550 sprintf(tmpText, "%d", playerTank.points); 551 al_draw_text(font, al_map_rgb(200, 0, 0), INFO_TEXT_X, PLAYER_TEXT_Y + al_get_font_line_height(font), ALLEGRO_ALIGN_LEFT, tmpText); 552 553 al_draw_text(font, al_map_rgb(200, 0, 0), INFO_TEXT_X, ENEMY_TEXT_Y, ALLEGRO_ALIGN_LEFT, "ENEMY"); 554 sprintf(tmpText, "%d", enemyTank.points); 555 al_draw_text(font, al_map_rgb(200, 0, 0), INFO_TEXT_X, ENEMY_TEXT_Y + al_get_font_line_height(font), ALLEGRO_ALIGN_LEFT, tmpText); 556 557 /* Draw background */ 558 al_draw_bitmap(backGround, GAME_AREA_OFFSX, GAME_AREA_OFFSY, 0); 559 560 /* Draw player */ 561 al_draw_rotated_bitmap(playerTank.bitmap, TANK_OFFS_X, TANK_OFFS_Y, playerTank.x, playerTank.y, playerTank.rotAngle, 0); 562 if (playerShot.active) 563 { 564 al_draw_rotated_bitmap(playerShot.bitmap, BULLET_OFFS_X, BULLET_OFFS_Y, playerShot.x, playerShot.y, playerShot.rotAngle, 0); 565 } 566 567 /* Draw enemy */ 568 al_draw_rotated_bitmap(enemyTank.bitmap, TANK_OFFS_X, TANK_OFFS_Y, enemyTank.x, enemyTank.y, enemyTank.rotAngle, 0); 569 if (enemyShot.active) 570 { 571 al_draw_rotated_bitmap(enemyShot.bitmap, BULLET_OFFS_X, BULLET_OFFS_Y, enemyShot.x, enemyShot.y, enemyShot.rotAngle, 0); 572 } 573 574 al_flip_display(); 575 } 576 } 577 578 al_destroy_event_queue(event_queue); 579 al_destroy_bitmap(enemyTank.bitmap); 580 al_destroy_bitmap(enemyShot.bitmap); 581 al_destroy_bitmap(playerTank.bitmap); 582 al_destroy_bitmap(playerShot.bitmap); 583 al_destroy_bitmap(backGround); 584 al_destroy_font(font); 585 al_destroy_display(display); 586 al_destroy_timer(timer); 587 588 al_uninstall_system(); 589 590 return 0; 591 }

Arthur Kalliokoski
Second in Command
February 2005
avatar

the problem: it seems like my program starts without waiting for my keypress. After loading bitmaps, fonts and stuff I added a wait loop for pressing space, but if I start the program, wait for about 5 sec and then press space, I can see that the game started without me, kind of.

That's way too much unformatted code to wade through, but at a guess I'd say it does wait for the keypress, but then it "catches up" all at once before settling back down to the correct timer rate. Is there something you increment each loop then decrement every display flip? Set that to zero when the keypress finally comes.

They all watch too much MSNBC... they get ideas.

Fredrik Beckman
Member #15,374
November 2013

No increments, just a timer event.

Should I wait to start the timer until I press the key, maybe?

[EDIT]
Right on spot! Thanks Arthur. Solved - no timer event start until key press....

;D

l j
Member #10,584
January 2009
avatar

Don't use a busy loop like that.

Anyway, to fix your problem, start the timer after you've waited for the keypresses. I think your event queue is filled with unhandled timer events before starting your program.

Arthur Kalliokoski
Second in Command
February 2005
avatar

I just threw this little demo together real quick. It has the

#define NUM_BLITS 100000

to bog down the video card to simulate a slow card, at 100000 redraws of the ball per frame it slows down to 6.8 fps on my computer, but the ball still moves at the correct speed overall. Adjust to suit, or set to 1 to see how fast the ball will move unloaded.

Change

char font_string[] = "DejaVuSans.ttf";

to whatever ttf font you have handy.

Source code

I have to shower up and go to work now.

[EDIT]

I forgot to add stuff so it doesn't use 100% cpu, I'll update it tomorrow.

[EDIT2]

It doesn't hog cpu with NUMBLITS 1

They all watch too much MSNBC... they get ideas.

Fredrik Beckman
Member #15,374
November 2013

taron said:

Don't use a busy loop like that.

If you mean:

#SelectExpand
1 /* SPACE pressed */ 2 do 3 { 4 al_get_keyboard_state(&kbdstate); 5 } while (al_key_down(&kbdstate, ALLEGRO_KEY_SPACE) != true); 6 7 /* SPACE released */ 8 do 9 { 10 al_get_keyboard_state(&kbdstate); 11 } while (al_key_down(&kbdstate, ALLEGRO_KEY_SPACE) == true);

then I couldn't agree more, that's ugly, but added before I saw the problem. Will fix that soon along with a lot of other stuff... and yes - you saw the problem too. Timer event started too soon.

I just threw this little demo together real quick

Too kind :) It looked interesting, will check it a bit deeper tomorrow if I get a chance. Close to Christmas though, so maybe I don't get get more time until later in the week.

thanks for the comments and merry christmas!

Go to: