Multiple buttons in a menu with SDL
Hey
I have been learning some SDL and have created a very basic app which has a single button which once clicked exit's the program.
But i don't know how to scale it to have multiple buttons and check which button is pressed. So i need some guidance on how i can alter my attempt to handle multiple buttons simplistically.
My current method is as follows [i cut out most of the code to just show the relevant stuff:
[source lang="cpp"]
bool handle_mouse_leftClick(int x, int y, SDL_Surface *button) {
if( ( ( mouseX > x ) && ( mouseX < x + button->w ) ) && ( ( mouseY > y ) && ( mouseY < y + button->h ) ) ) {
return true;
} else {
return false;
}
}
// beyond this line is inside my main function
//menu button
SDL_Surface *button;
button = IMG_Load("button.png");
while(!quit){
//handle events
while( SDL_PollEvent( &event ) ){
switch(event.type){
case SDL_QUIT: quit = true; break;
case SDL_MOUSEMOTION: handle_mouse_position(); break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT) {
if(handle_mouse_leftClick(btnx,btny,button)){
quit = true;
}
}
break;
}
}
[/source]
The problem is im not following how i can make it work to cater for any button i make for the game menu ? Unless some kind of very long if:else statements?
I have been learning some SDL and have created a very basic app which has a single button which once clicked exit's the program.
But i don't know how to scale it to have multiple buttons and check which button is pressed. So i need some guidance on how i can alter my attempt to handle multiple buttons simplistically.
My current method is as follows [i cut out most of the code to just show the relevant stuff:
[source lang="cpp"]
bool handle_mouse_leftClick(int x, int y, SDL_Surface *button) {
if( ( ( mouseX > x ) && ( mouseX < x + button->w ) ) && ( ( mouseY > y ) && ( mouseY < y + button->h ) ) ) {
return true;
} else {
return false;
}
}
// beyond this line is inside my main function
//menu button
SDL_Surface *button;
button = IMG_Load("button.png");
while(!quit){
//handle events
while( SDL_PollEvent( &event ) ){
switch(event.type){
case SDL_QUIT: quit = true; break;
case SDL_MOUSEMOTION: handle_mouse_position(); break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT) {
if(handle_mouse_leftClick(btnx,btny,button)){
quit = true;
}
}
break;
}
}
[/source]
The problem is im not following how i can make it work to cater for any button i make for the game menu ? Unless some kind of very long if:else statements?
How about making a class for buttons, rectangles, and points? In the button class, you can have a rectangle object that defines the area the button occupies, and the rectangle class can have functions that checks if they contain a point. So your button object can have a function that checks if it is clicked.
I'm not sure how to do that in C++ in terms of syntax. Do i put it in the same cpp file or in a header file?
thefollower, it seems like you don't have a firm grasp of the language and it's systems yet. I recommend reading some articles (Read this article and this one).
Once you have a firm understanding of classes, try making a button class. For the files question:
The Class Definition goes in the .cpp file. (Source File)
The Class Declaration goes in the .h file. (Header File)
Here is the basic class syntax:
Once you have a firm understanding of classes, try making a button class. For the files question:
The Class Definition goes in the .cpp file. (Source File)
The Class Declaration goes in the .h file. (Header File)
Here is the basic class syntax:
class Button
{
public:
void DrawButton();
void CheckForButtonClick();
void CheckForButtonHover();
private:
Window * WindowUsedToDrawButton;
Image ButtonImage;
Sprite ButtonSprite;
Rectangle ButtonCollision;
}
FYI, you probably don't need a separate Rectangle definition in your Button class. The SDl Surface (or whatever you are using to define your image) should have the x, y position as well as the height and width. So, you can just use those when checking if the mouse has clicked within the image's boundaries.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement