I moved the GameType struct (and the Mode enum) to a separate file, as I will need
to use it in the check_server and check_client functions as well. I also added the
signum function (which was previously in sign.hpp) to this file, since it was the only
function in sign.hpp. Finally, I added a check, that will only display the GUI, if the
user didn't provide any command-line arguments.
floatpaddle_mid_y=(paddle.getRect().y+paddle.getRect().GetHeight())/2.0;/* Middle y value of rectangle */
floatpaddle_mid_y=(paddle.getRect().y+paddle.getRect().GetHeight())/2.0;/* Middle y value of rectangle */
@ -223,93 +216,96 @@ int main(int argc, char** argv) {
boolgame_started=false;
boolgame_started=false;
srand(std::time(NULL));
srand(std::time(NULL));
/* If there were no command-line arguments, the user is prompted in the GUI */
if(argc==1){
/* Display a drop-down menu, to allow user to pick between Single player, server and client. This section of the code uses the raygui library, and is written in C. */
GuiLoadStyleDark();// Load the dark theme style
/* Modify the default style, by changing font size and spacing */
intfont_size=25;
intfont_spacing=2;
GuiSetStyle(DEFAULT,TEXT_SIZE,font_size);
GuiSetStyle(DEFAULT,TEXT_SPACING,font_spacing);
/* Set variables to position objects on screen */
intselected_item=0;// variable to hold the index of the selected item
constchar*text_to_display="Select Game Mode";// Text to display
/* Size of the label, drop down box and button */
Vector2label_size=MeasureTextEx(GetFontDefault(),text_to_display,font_size,font_spacing);// Set the size based on the width of the string to print, the font size and the text spacing. I added 1 to font_size and font_spacing, to account for any possible rounding errors, since the function expects floats.
Vector2box_size=Vector2{label_size.x,HEIGHT/20};
boolis_being_edited=false;// Indicates whether the drop-down menu is being 'edited' i.e. whether an option is being selected
boolbutton_pressed=false;// Indicates whether the submit button has been pressed
/* Display a drop-down menu, to allow user to pick between Single player, server and client. This section of the code uses the raygui library, and is written in C. */
GuiLoadStyleDark();// Load the dark theme style
/* Modify the default style, by changing font size and spacing */
intfont_size=25;
intfont_spacing=2;
GuiSetStyle(DEFAULT,TEXT_SIZE,font_size);
GuiSetStyle(DEFAULT,TEXT_SPACING,font_spacing);
/* Set variables to position objects on screen */
intselected_item=0;// variable to hold the index of the selected item
constchar*text_to_display="Select Game Mode";// Text to display
/* Size of the label, drop down box and button */
Vector2label_size=MeasureTextEx(GetFontDefault(),text_to_display,font_size,font_spacing);// Set the size based on the width of the string to print, the font size and the text spacing. I added 1 to font_size and font_spacing, to account for any possible rounding errors, since the function expects floats.
Vector2box_size=Vector2{label_size.x,HEIGHT/20};
boolis_being_edited=false;// Indicates whether the drop-down menu is being 'edited' i.e. whether an option is being selected
boolbutton_pressed=false;// Indicates whether the submit button has been pressed
while(button_pressed==false){
BeginDrawing();
ClearBackground(BLACK);
GuiLabel(Rectangle{(WIDTH/2)-(label_size.x/2),(HEIGHT/8),label_size.x,label_size.y},text_to_display);// Label to display text on top
if(is_being_edited){
GuiLock();// If the drop-down menu is being 'edited', we need to prevent the user from modifying any other aspect of the UI
/* Drop-down menu, that allows user to select game mode */
if(GuiDropdownBox(Rectangle{(WIDTH/2)-(box_size.x/2),(HEIGHT/2)-(HEIGHT/8),box_size.x,box_size.y},"SINGLE;CLIENT;SERVER",&selected_item,is_being_edited)){// This function returns != 0 if there was a mouse click inside the dropdown area
is_being_edited=!is_being_edited;// If the dropdown menu was selected, then it is being edited (or not being edited, if it previously was).
}
GuiUnlock();
EndDrawing();
}
/* Single player mode */
if(selected_item==M_SINGLE){
GuiSetStyle(DEFAULT,TEXT_WRAP_MODE,TEXT_WRAP_WORD);// Enable text wrapping so that the long text, displayed below, will be wrapped
BeginDrawing();
ClearBackground(BLACK);
GuiLabel(Rectangle{(WIDTH/2)-(WIDTH/8),(HEIGHT/2)-(HEIGHT/8),WIDTH/4,HEIGHT/4},"W and S control left paddle, Up and Down arrow keys control right paddle. Good luck!");
EndDrawing();
Timertimer=timer_init(5);
while(!timer_done(timer));
}
/* Server mode, ask user to input IP address and port */
if(selected_item==M_SERVER){
button_pressed=false;// Whether submit button is pressed
char*ip_text=(char*)calloc(100,sizeof(char));// Holds input of IP text box
char*port_text=(char*)calloc(20,sizeof(char));// Holds input of port text box
constchar*ip_label="Local IP address";
constchar*port_label="Port number (1024 - 65535)";
intport_label_x_size=MeasureTextEx(GetFontDefault(),port_label,font_size,font_spacing).x;// Custom size for port label, because it's long
boolediting_ip=false;// Indicates whether the IP address text box is being edited
boolediting_port=false;// Indicates whether the port text box is being edited
while(button_pressed==false){
while(button_pressed==false){
BeginDrawing();
BeginDrawing();
ClearBackground(BLACK);
ClearBackground(BLACK);
/* Label and text box for IP address */
GuiLabel(Rectangle{(WIDTH/2)-(label_size.x/2),(HEIGHT/8),label_size.x,label_size.y},text_to_display);// Label to display text on top
GuiLabel(Rectangle{(WIDTH/2)-(label_size.x/2),(HEIGHT/2)-(HEIGHT/6)-label_size.y-10,label_size.x,label_size.y},ip_label);// Label to display text on top
/* The reason this if statement exists, is largely the same as the reasoning for the drop-down menu. We want to make the text box editable
/* Drop-down menu, that allows user to select game mode */
if(GuiDropdownBox(Rectangle{(WIDTH/2)-(box_size.x/2),(HEIGHT/2)-(HEIGHT/8),box_size.x,box_size.y},"SINGLE;CLIENT;SERVER",&selected_item,is_being_edited)){// This function returns != 0 if there was a mouse click inside the dropdown area
is_being_edited=!is_being_edited;// If the dropdown menu was selected, then it is being edited (or not being edited, if it previously was).
GuiSetStyle(DEFAULT,TEXT_WRAP_MODE,TEXT_WRAP_WORD);// Enable text wrapping so that the long text, displayed below, will be wrapped
BeginDrawing();
ClearBackground(BLACK);
GuiLabel(Rectangle{(WIDTH/2)-(WIDTH/8),(HEIGHT/2)-(HEIGHT/8),WIDTH/4,HEIGHT/4},"W and S control left paddle, Up and Down arrow keys control right paddle. Good luck!");
EndDrawing();
EndDrawing();
Timertimer=timer_init(5);
while(!timer_done(timer));
}
}
GameTypetype=check_server(ip_text,port_text);
/* Server mode, ask user to input IP address and port */
if(selected_item==M_SERVER){
button_pressed=false;// Whether submit button is pressed
char*ip_text=(char*)calloc(100,sizeof(char));// Holds input of IP text box
char*port_text=(char*)calloc(20,sizeof(char));// Holds input of port text box
constchar*ip_label="Local IP address";
constchar*port_label="Port number (1024 - 65535)";
intport_label_x_size=MeasureTextEx(GetFontDefault(),port_label,font_size,font_spacing).x;// Custom size for port label, because it's long
boolediting_ip=false;// Indicates whether the IP address text box is being edited
boolediting_port=false;// Indicates whether the port text box is being edited
while(button_pressed==false){
BeginDrawing();
ClearBackground(BLACK);
/* Label and text box for IP address */
GuiLabel(Rectangle{(WIDTH/2)-(label_size.x/2),(HEIGHT/2)-(HEIGHT/6)-label_size.y-10,label_size.x,label_size.y},ip_label);// Label to display text on top
/* The reason this if statement exists, is largely the same as the reasoning for the drop-down menu. We want to make the text box editable