home *** CD-ROM | disk | FTP | other *** search
- /////////////////////////////////////////////////////////////////////////
- // Game Programming All In One, Third Edition
- // Tank War Final - main.c
- /////////////////////////////////////////////////////////////////////////
-
- #include "tankwar.h"
-
-
- //sprites used in the game
- sprite *tanks[2];
- sprite *bullets[2];
- sprite *explosions[2][2];
- sprite *sideviews[2];
-
- //declare some variables
- int gamestate = STATE_TITLE;
- double scrollx[2], scrolly[2];
- int startx[2], starty[2];
- int tilex, tiley, n;
- int radarx, radary;
- int health[2];
-
- //double buffer
- BITMAP *buffer;
-
- //screen background
- sprite *back;
- sprite *title;
- sprite *victory1;
- sprite *victory2;
-
- //define the datafile object
- DATAFILE *datafile;
-
- //sounds and music
- SAMPLE *sounds[NUM_SOUNDS];
- MIDI *music_title;
- MIDI *music_battle;
- MIDI *music_victory;
-
- //some variables used to slow down keyboard input
- int key_count[2];
- int key_delay[2];
-
- //timer variables
- volatile int ticks;
- volatile int framerate;
-
-
- //calculate X movement value based on direction angle
- double calcAngleMoveX(int angle) {
- return (double) cos(angle * PI / 180);
- }
-
- //calculate Y movement value based on direction angle
- double calcAngleMoveY(int angle) {
- return (double) sin(angle * PI / 180);
- }
-
- //perform basic collision detection
- int inside(int x,int y,int left,int top,int right,int bottom)
- {
- if (x > left && x < right && y > top && y < bottom)
- return 1;
- else
- return 0;
- }
-
- void updateradar()
- {
- /* rectfill(buffer,radarx+1,radary+1,radarx+99,radary+88,BLACK);
- rect(buffer,radarx,radary,radarx+100,radary+89,WHITE);
-
- //draw mini tanks on radar
- for (n=0; n<2; n++)
- stretch_sprite(buffer, tank_bmp[n][tanks[n]->curframe][tanks[n]->dir],
- radarx + scrollx[n]/10 + (SCROLLW/10)/2-4,
- radary + scrolly[n]/12 + (SCROLLH/12)/2-4,
- 8, 8);
-
- //draw player viewport on radar
- for (n=0; n<2; n++)
- rect(buffer,radarx+scrollx[n]/10, radary+scrolly[n]/12,
- radarx+scrollx[n]/10+SCROLLW/10,
- radary+scrolly[n]/12+SCROLLH/12, GRAY);
- */
-
- }
-
-
- void updateplayerstats()
- {
- int n;
-
- //create bar for health
- BITMAP *bar = create_bitmap(2,80);
- rectfill(bar, 0,0,1,79, makecol(0,200,0));
-
- //draw bars for player 1's health
- for (n=0; n < health[1]; n++)
- draw_sprite(buffer, bar, 10+n*2, 5);
-
- //draw player 1's tank sideview
- sideviews[0]->draw(buffer);
-
- //draw bars for player 2's health
- for (n=0; n < health[0]; n++)
- draw_sprite(buffer, bar, 629-n*2, 5);
-
-
- //draw player 2's tank sideview
- sideviews[1]->draw(buffer);
-
- }
-
-
- void shutdown()
- {
- //free tank sprites
- delete tanks[0];
- delete tanks[1];
-
- //remove the sound driver
- stop_midi();
- destroy_midi(music_title);
- destroy_midi(music_battle);
- destroy_midi(music_victory);
- remove_sound();
-
- //remove the joystick driver
- remove_joystick();
-
- //free the MappyAL memory
- MapFreeMem();
-
- //destroy bitmaps
- destroy_bitmap(buffer);
-
- //unload datafile
- unload_datafile(datafile);
-
- allegro_exit();
-
- exit(0);
- }
-
- void fatalerror(char *msg)
- {
- // set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
- allegro_message(msg);
- shutdown();
- exit(1);
- }
-
-
- //calculate framerate every second
- void timer1(void)
- {
- framerate = ticks;
- ticks=0;
- }
- END_OF_FUNCTION(timer1)
-
- //do something while resting
- void rest1(void)
- {
- //don't do anything time intensive here!
- }
-
- //main function
- int main(void)
- {
- //initialize the game
- allegro_init();
- install_keyboard();
- install_timer();
- srand(time(NULL));
- loaddatafile();
- setupscreen();
- loadgraphics();
- loadsounds();
-
- //install the joystick handler
- install_joystick(JOY_TYPE_AUTODETECT);
- poll_joystick();
-
- //setup input delays
- key_count[0] = 0;
- key_delay[0] = 2;
- key_count[1] = 0;
- key_delay[1] = 2;
-
- //lock interrupt variables
- LOCK_VARIABLE(framerate);
- LOCK_VARIABLE(ticks);
- LOCK_FUNCTION(timer1);
- LOCK_FUNCTION(rest1);
- install_int(timer1, 999);
-
- //game loop
- while(1)
- {
- switch(gamestate) {
- case STATE_TITLE:
- //display game title screen
- blit(title->image,buffer,0,0,0,0,639,479);
-
- //wait for keypress
- if (keypressed()) {
- if (key[KEY_ESC])
- shutdown();
- else {
- gamestate = STATE_NORMAL;
- health[0] = 95;
- health[1] = 95;
-
- //reset tanks
- scrollx[0] = 300;
- scrolly[0] = 100;
- scrollx[1] = 300; // mapwidth*mapblockwidth - 400;
- scrolly[1] = 200; // mapheight*mapblockheight - 500;
- tanks[0]->velx = 0.0f;
- tanks[0]->vely = 0.0f;
- tanks[1]->velx = 0.0f;
- tanks[1]->vely = 0.0f;
-
- play_midi(music_battle, 1);
- rest(200);
- clear_keybuf();
- }
- }
- break;
-
- case STATE_VICTORY:
- //display victory screen for the winner
- if (health[0] > health[1])
- blit(victory1->image,buffer,0,0,0,0,639,479);
- else
- blit(victory2->image,buffer,0,0,0,0,639,479);
-
- //pause before restarting
- if (keypressed()) {
- if (key[KEY_ESC])
- shutdown();
- else {
- gamestate = STATE_TITLE;
- play_midi(music_title, 1);
- rest(200);
- clear_keybuf();
- }
- }
-
- break;
-
- case STATE_NORMAL:
- //draw background bitmap
- blit(back->image, buffer, 0, 0, 0, 0, back->width, back->height);
-
- //draw scrolling windows (now using Mappy)
- for (n=0; n<2; n++)
- MapDrawBG(buffer, scrollx[n], scrolly[n],
- startx[n], starty[n], SCROLLW, SCROLLH);
-
- //move the tanks and bullets
- movetanks();
- animatetanks();
- movebullets();
-
- //draw the sprites
- drawbullets();
- drawtanks();
-
- //draw explosions over tanks
- for (int window=0; window<2; window++)
- for (n=0; n<2; n++)
- updateexplosion(window,n);
-
- //update the radar
- updateradar();
-
- //draw player health bars
- updateplayerstats();
-
- //check for keypresses
- if (keypressed())
- getinput();
-
- readjoysticks();
-
- break;
-
- }
-
- //update ticks
- ticks++;
-
- //slow the game down
- rest_callback(15, rest1);
-
- textprintf_ex(buffer,font,0,470,makecol(255,189,73),-1,"FPS %d", framerate);
-
- //refresh the screen
- acquire_screen();
- blit(buffer, screen, 0, 0, 0, 0, WIDTH-1, HEIGHT-1);
- release_screen();
- }
-
- shutdown();
- return 0;
- }
- END_OF_MAIN()
-
-
-