Advertisement

Creating a Game Menu in Allegro(help)

Started by September 03, 2012 07:54 PM
2 comments, last by LennyLen 12 years, 2 months ago
I can't figure it out, but I think at the end of the switch statement for the Menu it's not registering the fact that I declare gamemode as anything. I know it exits the switch statement because when I place the exit(1); command the program closes after hitting enter on the quit image.


I haven't been able to improve my C++ very much lately and resulted to trying to learn allegro, and eventually when I am capable of it switching to SDL & OpenGL

#include <allegro.h>
void mainMenu();
void playGame();
int gamemode;

int main()
{
allegro_init();
install_keyboard();
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
clear_to_color(screen, makecol(100, 224, 100));
set_color_depth(32);
gamemode = 1;
do{
switch(gamemode)
{
case 0:
playGame();
textout_ex(screen,
font,
"hello world",
20,
30,
makecol(255,0,0),
-1);
break;
case 1:
mainMenu();
break;
}
}while(gamemode != 2);
}
END_OF_MAIN();

void mainMenu()
{
BITMAP *newgame, *quit;
newgame = load_bitmap("newgame.bmp", NULL);
quit = load_bitmap("quit.bmp", NULL);
blit(newgame, screen, 0, 0, 0, 0, 230, 60);
blit(quit, screen, 0, 0, 0, 60, 230, 60);
int choice;
choice = 0;
int choicechosen;
/* while(!key[KEY_ESC])
{
do{
if(key[KEY_S])choice++;
else if(key[KEY_W])choice--;
while(choice >= 3)
{
choice--;
}
while(choice <= 0)
{
choice++;
}

switch(choice)
{
case 1:
newgame = load_bitmap("newgamec.bmp", NULL);
quit = load_bitmap("quit.bmp", NULL);
blit(newgame, screen, 0, 0, 0, 0, 230, 60);
blit(quit, screen, 0, 0, 0, 60, 230, 60);
break;
case 2:
quit = load_bitmap("quitc.bmp", NULL);
newgame = load_bitmap("newgame.bmp", NULL);
blit(newgame, screen, 0, 0, 0, 0, 230, 60);
blit(quit, screen, 0, 0, 0, 60, 230, 60);
break;

if(key[KEY_ENTER])
{
choicechosen = choice;
destroy_bitmap(newgame);
destroy_bitmap(quit);
}
if(choicechosen == 1)
{
gamemode = 0;
}
rest(5);
}while(choicechosen != 2);
gamemode == choicechosen;
if(choicechosen == 2)
{
exit(1);
}
}
} */
void playGame()
{
}
the position where I think the issue is happening is now commented out.
Advertisement
still not solved :\
Part of the problem is that you have the following section of code inside your switch statement in the commented out section:



if(key[KEY_ENTER])
{
choicechosen = choice;
destroy_bitmap(newgame);
destroy_bitmap(quit);
}
if(choicechosen == 1)
{
gamemode = 0;
}
rest(5);


Also, in the section I just listed, you set gamemode to 0 if choicechosen equals 1. Then immediately after that section of code, you try to say that gamemode equals choicechosen. I say try to because instead of gamemode = choicechosen, you have gamemode == choicechosen, which does nothing,

By the way, your code has a HUGE memory leak. You reload bitmaps every time a key is pressed, but only delete two of them when enter is pressed. Plus, you initially load two as well. You also never check the return values of your load_bitmap() calls to make sure that the bitmaps load correctly.

What I would suggest you do is have six BITMAP pointers, four of which will hold the four images you load, and two which will be used to point to which two of the four images you currently want to display.

So, something like this:



BITMAP *newgame, *quit, *ng_img, *ng_imgc, *q_img, *q_imgc;
ng_img = load_bitmap("newgame.bmp", NULL);
if (!ng_img) {
// there was an error, so do something
}
q_img = load_bitmap("quit.bmp", NULL);
if (!q_img) {
// there was an error, so do something
}
ng_imgc = load_bitmap("newgamec.bmp", NULL);
if (!ng_imgc) {
// there was an error, so do something
}
q_imgc = load_bitmap("quitc.bmp", NULL);
if (!q_imgc) {
// there was an error, so do something
}
newgame = ng_img;
quit = q_img;



Now, when you have keys pressed, just switch which images are being used:



switch(choice)
{
case 1:
newgame = ng_imgc;
quit = q_img;
break;
case 2:
quit = q_imgc;
newgame = ng_img;
break;
}


You'll notice I took the blitting operations out of there. This is because it's a bad idea to mix your logic and drawing together. Do all your logic first, then draw the results. You also shouldn't draw directly to the screen in the way that you are, as this will cause flickering. Instead, create a bitmap the size of the screen, and do all your drawing to it. Then, when you've finished drawing a frame, blit this bitmap to the screen. This technique is known as double buffering.

This topic is closed to new replies.

Advertisement