The game has two different menus, the start menu and in-game menu, the differences are the available options and what will happen when we choose them as seen here:
Start Menu:
- NEW > Goto player creation
- LOAD > Goto load game, Start game (Disabled)
- EXIT > Quit game
- CONTINUE > Return to game
- SAVE > Goto Save Game, Return Game (Disabled)
- EXIT > Quit Game
Ball selector:
Menu Item:
I have used Gimp again to draw them, to draw the ball i just made a new, square shaped image, filled it with color FF,00FF (Pink) so i can apply later the colorkey, then i selected a circle and used the blend tool with orange and yellow colors.
Drawing the button was quite easy: Gimp > File > Create > Button > Simple beveled button, the only thing I made was to left the text empty so I can use the same button for all the menu items.
The logic for the menu is simple:
- Define an "Option" variable, it will be which menu option is chosen.
- Check the keyboard, and if we have pressed the following keys:
- Key up > decrease option
- Key down > increase option
- Enter > execute action associated to the button (Change game state)
- Fill with a color (grey)
- Draw menu tittle
- Draw menu buttons
- Draw the text into the menu buttons
- Draw the ball selector
<"Game.cpp", Code for MenuStart:>
void Game::MenuStart() //Start menu
{
//MenuTittle ="START MENU";
SDL_Surface* Button; //The menu buttons
SDL_Surface* Ball; //The ball selector
Button = IMG_Load("images/button.png");
Ball = IMG_Load("images/ball.png");
//The ball uses colorkey to display correctly
SDL_SetColorKey(Ball,SDL_SRCCOLORKEY |SDL_RLEACCEL,SDL_MapRGB(Ball-> format, 255, 0, 255));
SDL_Rect ButtonPosition ,BallPosition;
int i; //An iterator for the loop
int Option=1;//To select items
//startx, starty Used to display images
int startx = ((myengine.ScreenX / 2) - (Button->w/2) );
int starty = (myengine.ScreenY / 2) ;
bool done = false;
while (!done) // will loop infinite times until we set done = true
{
SDL_Event event;
while (SDL_PollEvent(&event))//Check new events
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
// check for keypresses
case SDL_KEYDOWN:
// Down key
if (event.key.keysym.sym == SDLK_DOWN)
{
Option++; //Move down ball selector
if(Option>3)Option=1;
break;
}
//Up key
if (event.key.keysym.sym == SDLK_UP)
{
Option--;//Move up ball selector
if(Option<1)Option=3;
break;
}
//Return pressed
if (event.key.keysym.sym == SDLK_RETURN)
{
switch (Option)
{
case 1://NEW
myGameState=CREATEPLAYER;
break;
case 2://LOAD
myGameState=LOAD;
break;
case 3://EXIT
myGameState=OUTRO;
break;
}//switch option
done = true;
break;
}//if
//Exit game
if (event.key.keysym.sym == SDLK_ESCAPE)
{
done = true;
break;
}
}//switch
}//while
myengine.FillColour(100,100,100);//Fill with grey
myengine.SetTextColor( 0, 0, 255 );//Blue color
myengine.TextOut(startx -50 ,100,"START MENU",3);//Menu tittle
for (i=1;i<4;i++) // draw 3 buttons
{
ButtonPosition.x = startx; // X
ButtonPosition.y = starty + (i*40); // Y
ButtonPosition.w = Button->w;
ButtonPosition.h = Button->h;
SDL_BlitSurface(Button, NULL, myengine.screen, &ButtonPosition);//Draw button
}//for
BallPosition.x=startx -Ball->w;
BallPosition.y=starty + (Option*40);
BallPosition.w=Ball->w;
BallPosition.h=Ball->h;
SDL_BlitSurface(Ball, NULL, myengine.screen, &BallPosition);//Draw ball selector
//Draw text for the options
myengine.TextOut(startx + 10,starty + 50,"NEW",1);
myengine.TextOut(startx + 10,starty + 90,"LOAD",1);
myengine.TextOut(startx + 10,starty + 130,"EXIT",1);
myengine.Flip();
myengine.Wait(1);
}//End while done loop
//Free surfaces Before finishing
SDL_FreeSurface(Button);
SDL_FreeSurface(Ball);
}
<"Game.cpp", Code for MenuGame:>
void Game::MenuGame() //In-Game menu
{
SDL_Surface* Button; //The menu buttons
SDL_Surface* Ball; //The ball selector
Button = IMG_Load("images/button.png");
Ball = IMG_Load("images/ball.png");
//The ball uses colorkey to display correctly
SDL_SetColorKey(Ball,SDL_SRCCOLORKEY |SDL_RLEACCEL,SDL_MapRGB(Ball-> format, 255, 0, 255));
SDL_Rect ButtonPosition ,BallPosition;
int i; //An iterator for the loop
int Option=1;//To select items
//startx, starty Used to display images
int startx = ((myengine.ScreenX / 2) - (Button->w/2) );
int starty = (myengine.ScreenY / 2) ;
bool done = false;
while (!done) // will loop infinite times until we set done = true
{
SDL_Event event;
while (SDL_PollEvent(&event))//Check new events
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
// check for keypresses
case SDL_KEYDOWN:
// Down key
if (event.key.keysym.sym == SDLK_DOWN)
{
Option++; //Move down ball selector
if(Option>3)Option=1;
break;
}
//Up key
if (event.key.keysym.sym == SDLK_UP)
{
Option--;//Move up ball selector
if(Option<1)Option=3;
break;
}
//Return pressed
if (event.key.keysym.sym == SDLK_RETURN)
{
switch (Option)
{
case 1://CONTINUE
myGameState=MAINLOOP;
break;
case 2://SAVE
myGameState=SAVE;
break;
case 3://EXIT
myGameState=OUTRO;
break;
}//switch option
done = true;
break;
}//if
//Exit game
if (event.key.keysym.sym == SDLK_ESCAPE)
{
done = true;
break;
}
}//switch
}//while
myengine.FillColour(100,100,100);//Fill with grey
myengine.SetTextColor( 0, 0, 255 );//Blue color
myengine.TextOut(startx -50 ,100,"GAME MENU",3);//Menu tittle
for (i=1;i<4;i++) // draw 3 buttons
{
ButtonPosition.x = startx; // X
ButtonPosition.y = starty + (i*40); // Y
ButtonPosition.w = Button->w;
ButtonPosition.h = Button->h;
SDL_BlitSurface(Button, NULL, myengine.screen, &ButtonPosition);//Draw button
}//for
BallPosition.x=startx -Ball->w;
BallPosition.y=starty + (Option*40);
BallPosition.w=Ball->w;
BallPosition.h=Ball->h;
SDL_BlitSurface(Ball, NULL, myengine.screen, &BallPosition);//Draw ball selector
//Draw text for the options
myengine.TextOut(startx + 10,starty + 50,"CONTINUE",1);
myengine.TextOut(startx + 10,starty + 90,"SAVE",1);
myengine.TextOut(startx + 10,starty + 130,"EXIT",1);
myengine.Flip();
myengine.Wait(1);
}//End while done loop
//Free surfaces Before finishing
SDL_FreeSurface(Button);
SDL_FreeSurface(Ball);
}
<Now the game is starting to have what we would expect to find in a game, intros, menus.. in the next post the main game loop>









