• Advertisement
Sign in to follow this  

Creating a Game Menu in Allegro(help)

This topic is 1961 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

[CODE]#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()
{
}
[/CODE] Edited by Jdfskitz

Share this post


Link to post
Share on other sites
Advertisement
Part of the problem is that you have the following section of code inside your switch statement in the commented out section:


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

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:


[CODE]
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;

[/CODE]

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


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

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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement