need help fixing up this code in allegro
I'm working on a game and as you can see my codes a mess, ive been trying to break it up into smaller functions but I cant find any good places to break it up. I have one function writen but it doesn't work. As you can see my program also has some problems and any advice on how to fix it would be appriciated. I'm using Msvc++ 6 and allegro 4.00.
Code:
//#define DEBUGMODE //include this if your debugging
#include <stdio.h>
#include <allegro.h>
#include "test.h"
#define left 1
#define right 2
#define up 3
#define down 4
#define UpandLeft 5
#define DownandLeft 6
#define UpandRight 7
#define DownandRight 8
#define space 9
#define ericw 43 // width of eric.bmp
#define erich 61 // hight of eric.bmp
struct bullet{
int bulletx;
int bullety;
int direction;
}bullets[256]; // this stores information on all the bullets in the air
void calculate_shot_movment(int direction, int shot_draw_number);
PALETTE Pal;
BITMAP *ImageBuffer;
BITMAP *Ammobuffer; // stores the the immage of the amunition
int main(void)
{
BITMAP *dblbuffer;
int x=100;
int y=100;
int keyvar=0; //a keyboard buffer
signed short shot_number=-1; //which shot are we dealing with now
int lastkeypressed=0;
signed short shot_draw_number=0;//which shot to draw
int waskeydown=FALSE; //used to tell if a keypressed was aready there
allegro_init();
install_keyboard();
install_timer(); /* needed for `rest' function */
set_color_depth(16);
if (set_gfx_mode(GFX_SAFE, 800, 600, 0, 0) < 0)
{
printf("%s\n", allegro_error);
exit(1);
}
clear(screen);
// Pay attention!!! We HAVE to allocate memory for our memory bitmap
dblbuffer = create_bitmap(SCREEN_W, SCREEN_H);
clear(dblbuffer);
ImageBuffer = load_bmp("Eric.bmp", Pal);
Ammobuffer = load_bmp("rock.bmp", Pal);
while(1)// main loop
{
/////////////////// input
if (key[KEY_LEFT])
{
x--;
lastkeypressed=left;
}
if (key[KEY_RIGHT])
{
x++;
lastkeypressed=right;
}
if (key[KEY_UP])
{
y--;
lastkeypressed=up;
}
if (key[KEY_DOWN])
{
y++;
lastkeypressed=down;
}
if (key[KEY_LEFT] && key[KEY_UP])
{
lastkeypressed=UpandLeft;
}
if (key[KEY_LEFT] && key[KEY_DOWN])
{
lastkeypressed=DownandLeft;
}
if (key[KEY_RIGHT] && key[KEY_UP])
{
lastkeypressed=UpandRight;
}
if (key[KEY_RIGHT] && key[KEY_DOWN])
{
lastkeypressed=DownandRight;
}
/*
if(keypressed())
keyvar=readkey();
else keyvar=0;
*/
if (key[KEY_SPACE] && waskeydown==FALSE)
{
waskeydown=FALSE;// to prevent mutiple shots from one press
shot_number++;
if (shot_number>255)
{shot_number = shot_number-255;} // makes it so shot number has a max value of 255
bullets[shot_number].direction=lastkeypressed;
if(lastkeypressed==up || lastkeypressed==UpandLeft || // if there was an up direction
lastkeypressed==UpandRight)
{
bullets[shot_number].bullety=y-5; // the y position of the bullet is five pixles above the player
}
else if(lastkeypressed==down || lastkeypressed==DownandLeft // if there was a down direction
||lastkeypressed==DownandRight)
{
bullets[shot_number].bullety=y+erich+5; // the y position of the bullet is five pixles below the player
}
else
{
bullets[shot_number].bullety=y+(erich/2); // the y position of the bullet is level with the player}
}
if(lastkeypressed==left || lastkeypressed==UpandLeft // if there was a left direction
|| lastkeypressed==DownandLeft)
{
bullets[shot_number].bulletx=x-5; //// the x position of the bullet is five pixles to the left of
}
else if(lastkeypressed==right || bullets[shot_number].direction==UpandRight // if there was a left direction
|| lastkeypressed==DownandRight)
{
bullets[shot_number].bulletx=x+ericw+5; //// the x position of the bullet is five pixles to the right of the player
}
else
{
bullets[shot_number].bulletx=x+(ericw/2);
}
}
if (keypressed()!=TRUE)
{
waskeydown=FALSE;
}
//////////////////output
if (lastkeypressed==right)
{
rectfill(dblbuffer, x - 1 , y ,x + ericw - 1, y + erich, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==left)
{
rectfill(dblbuffer, x + 1 , y ,x + ericw + 1, y + erich, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==up)
{
rectfill(dblbuffer, x , y + 1,x + ericw , y + erich + 1, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==down)
{
rectfill(dblbuffer, x , y - 1,x + ericw ,y + erich - 1, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==UpandLeft)
{
rectfill(dblbuffer, x + 1 ,y + 1,x + ericw + 1, y + erich + 1, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==DownandLeft)
{
rectfill(dblbuffer, x + 1 ,y - 1,x + ericw + 1, y + erich - 1, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==UpandRight)
{
rectfill(dblbuffer, x - 1 ,y + 1,x + ericw - 1, y + erich + 1, makecol(000,000,000)); /* erase from last place */
}
if (lastkeypressed==DownandRight)
{
rectfill(dblbuffer, x - 1 ,y - 1,x + ericw - 1, y + erich - 1, makecol(000,000,000)); /* erase from last place */
}
// if (lastkeypressed=space)
// {
// draw_sprite(dblbuffer, Ammobuffer, shotx, shoty);
// }
draw_sprite(dblbuffer, ImageBuffer, x, y); //draw bitmap on dblbuffer
while (shot_draw_number < shot_number)
{
if (bullets[shot_draw_number].direction==DownandRight)
{
bullets[shot_draw_number].bulletx++;
bullets[shot_draw_number].bullety++;
}
if (bullets[shot_draw_number].direction==UpandLeft)
{
bullets[shot_draw_number].bulletx--;
bullets[shot_draw_number].bullety--;
}
if (bullets[shot_draw_number].direction==DownandLeft)
{
bullets[shot_draw_number].bulletx--;
bullets[shot_draw_number].bullety++;
}
if (bullets[shot_draw_number].direction==UpandRight)
{
bullets[shot_draw_number].bulletx++;
bullets[shot_draw_number].bullety--;
}
if (bullets[shot_draw_number].direction==down)
{
bullets[shot_draw_number].bullety++;
}
if (bullets[shot_draw_number].direction==up)
{
bullets[shot_draw_number].bullety--;
}
if (bullets[shot_draw_number].direction==left)
{
bullets[shot_draw_number].bulletx--;
}
if (bullets[shot_draw_number].direction==right)
{
bullets[shot_draw_number].bulletx++;
}
//calculate_shot_movment(bullets[shot_draw_number].direction, shot_draw_number);
draw_sprite(dblbuffer, Ammobuffer, bullets[shot_number].bulletx, bullets[shot_draw_number].bullety); //draw the bullet
shot_draw_number++;
}
shot_draw_number=0;
vsync();
blit(dblbuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); // copy from double buffer to screen
if (key[KEY_ESC])//clean up and quit
{
// Now, remember to FREE the memory you previously allocated
destroy_bitmap(dblbuffer);
destroy_bitmap(ImageBuffer);
destroy_bitmap(Ammobuffer);
allegro_exit();
exit(1);
}
}
return 0;
}
END_OF_MAIN();
// a function i'm working on to calculate a shot movement
void calculate_shot_movment(int direction, int shot_draw_number)
{
int* rbulletx = &bullets[shot_draw_number].bulletx; // note to self change to references
int* rbullety = &bullets[shot_draw_number].bullety;
if (direction==DownandRight)
{
*rbulletx++;
*rbullety++;
}
if (direction==UpandLeft)
{
*rbulletx--;
*rbullety--;
}
if (direction==DownandLeft)
{
*rbulletx--;
*rbullety++;
}
if (direction==UpandRight)
{
*rbulletx++;
*rbullety--;
}
if (direction==down)
{
*rbullety++;
}
if (direction==up)
{
*rbullety--;
}
if (direction==left)
{
*rbulletx--;
}
if (direction==right)
{
*rbulletx++;
}
}