From: "C.Gugler" Newsgroups: comp.os.msdos.djgpp Subject: Allegro: Background Date: Wed, 25 Feb 1998 13:59:12 -0600 Organization: AT&T WorldNet Services Lines: 168 Message-ID: <6d1t60$pc4@bgtnsc02.worldnet.att.net> NNTP-Posting-Host: 12.67.16.240 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk I'm having trouble blitting a background to a simple Pong Game I'm making with DJGPP and Allegro. Before I put the code in to put a background bmp file in, it ran fine, at just the right speed. After It started going slower and the Ball moves 'choppy'. Is there anyway I can only have the bitmap drawn once without it have to redraw the whole thing every frame? Right Now i'm using double buffering, I was thinking of trying Dirty Rectangles if that would go quicker. Anyways, here's the code, If you have any suggestions, I'd be greatful.. Thanks in Advance.. Oh yeah, also if you have any info on how I could make it run as slow/fast on all machines(A pentium 300 won't go too much(or any) faster than a 486, or low-end pentium.) This is just the bottom portion of the C source file.. void pong_game(void) { /* Set the first random direction for the ball */ direction=random_direction(); delay(200); /*Play the game while the ESC key is not pressed*/ while(!key[KEY_ESC]) { /* Used to change music... */ if(changem>9) changem=0; if(changem>0) changem++; /* put background in, Too slow! */ blit(backdrop,buffer,0,0,10,30,620,455); move_ball(); key_respond(); // respond to input and display paddle's /* Score's and Misc Info around the play area */ textout(buffer,pong_datafile[pfont].dat,"Player 1 Score:",150,0,21); textout(buffer,pong_datafile[pfont].dat,itoa(score_p1,NULL,10),text_length(pong_datafile[pfont].dat,"Player 1 Score:")+150,0,21); textout(buffer,pong_datafile[pfont].dat,"Player 2 Score:",350,0,21); textout(buffer,pong_datafile[pfont].dat,itoa(score_p2,NULL,10),text_length(pong_datafile[pfont].dat,"Player 2 Score:")+350,0,21); textout(buffer,pong_datafile[pfont].dat,"A/Z",0,0,14); textout(buffer,pong_datafile[pfont].dat,"Current Music Selection:",230,20,14); textout(buffer,pong_datafile[pfont].dat,itoa(cpong_midi,NULL,10),text_length(pong_datafile[pfont].dat,"Current Music Selection:")+230,20,14); textout(buffer,pong_datafile[pfont].dat,"Up/Down",618-text_length(pong_datafile[pfont].dat,"Up/Down"),0,14); textout(buffer,pong_datafile[pfont].dat,"Press 'M' to change Music",210,426,14); textout(buffer,pong_datafile[pfont].dat,"Press 'Esc' to Exit",210,4380,14); textout(buffer,pong_datafile[pfont].dat,"Special Thanks to, DJ Delorie(DJGPP), Shawn Hargreaves(Allegro), ",0,455,14); textout(buffer,pong_datafile[pfont].dat,"and anyone else who helped with Allegro or DJGPP.",0,465,14); /* Draw a line to set the boundries */ line(buffer,0,30,640,30,252); line(buffer,0,425,640,425,252); /* Put the buffer screen on the screen */ vsync(); blit(buffer,screen,0,0,0,0,640,480); /*Clear the buffer*/ clear_to_color(buffer, 83); } return; } int main(void) { allegro_init(); install_timer(); install_keyboard(); initialise_joystick(); install_mouse(); if((pong_datafile=load_datafile("Cpong.dat"))==NULL) { /*Shutdown Allegro*/ allegro_exit(); /*Print error message*/ printf("Error loading \"Cpong.dat\"\n%s\n\n", allegro_error); exit(1); } printf("Setting up the Sound...\n"); if(install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,NULL) != 0) { allegro_exit(); /*Print error message*/ printf("Error setting up Sound System\n%s\n\n", allegro_error); exit(1); } printf("Setting up graphics mode 640x480...\n"); if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) { allegro_exit(); /* Print error message */ printf("Error setting graphics mode 640 x 480\n%s\n\n", allegro_error); exit(1); } /* Set the pallete for the bitmap */ set_pallete(pong_datafile[pal2].dat); backdrop=create_bitmap(620,455); blit(pong_datafile[titleb].dat, backdrop, 0, 0, 0, 0, 620, 455); buffer=create_bitmap(640,480); clear_to_color(buffer, 83); /*Set the Ball position*/ ball_x=SCREEN_W/2; ball_y=35; play_midi(pong_datafile[xcircus].dat, TRUE); while(!keypressed()) { draw_rle_sprite(buffer,pong_datafile[title].dat,0,0); textout(buffer,pong_datafile[pfont].dat,"Welcome...",3,468,5); blit(buffer,screen,0,0,0,0,640,480); } /* Set the Pallete for the Sprites */ set_pallete(pong_datafile[pal].dat); /*Play the Game*/ clear_to_color(buffer, 83); pong_game(); stop_midi(); allegro_exit(); if(score_p1>score_p2) printf("Player 1 wins! \n"); if(score_p2>score_p1) printf("Player 2 wins! \n"); if(score_p1==score_p2) printf("Player 1 and Player 2 Tied! \n"); return; }