Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Old-School-Game/menu.cpp
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
584 lines (483 sloc)
11.8 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <ncurses.h> | |
#include <string> | |
#include <vector> | |
#include "menu.h" | |
using namespace std; | |
bool muted = false; | |
/* | |
function for detecting key presses thanks to: | |
https://stackoverflow.com/questions/4025891/create-a-function-to-check-for-key-press-in-unix-using-ncurses | |
*/ | |
int kbhit() { | |
int ch = getch(); | |
if (ch != ERR) { | |
ungetch(ch); | |
return 1; | |
} else { | |
return 0; | |
} | |
} | |
bool isMuted(){ | |
return muted; | |
} | |
void toggleMute() { | |
muted = !muted; | |
} | |
int showMainMenu() { | |
//get screen size | |
int yMax, xMax; | |
getmaxyx(stdscr, yMax, xMax); | |
bool ScreenTooSmall = xMax < 120; | |
mvprintw(yMax-1, 0,"Created by: Mazin, Luke, Ben, Paula, Kelvin, Tudor, Adrian, Konrad"); | |
//preparing colours that'll be used | |
init_pair(1, COLOR_WHITE, COLOR_WHITE); | |
init_pair(2, COLOR_BLACK, COLOR_BLACK); | |
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA); | |
/* | |
********************************************** | |
Logo window | |
********************************************** | |
*/ | |
drawLogo(xMax); | |
/* | |
********************************************** | |
Choices | |
Based on tutorial by Casual Coder: | |
https://www.youtube.com/watch?v=3YiPdibiQHA&index=8&list=PL2U2TQ__OrQ8jTf0_noNKtHMuYlyxQl4v | |
********************************************** | |
*/ | |
//create window for choices | |
WINDOW * choicesWin = newwin(10, 10, 35, (xMax-10)/2); | |
refresh(); | |
wrefresh(choicesWin); | |
//can use arrow keys | |
keypad(choicesWin, true); | |
string choices[3] = {"Start", "Options", "Leave"}; | |
int choice, highlight = 0, | |
mid = (((xMax-96)/2-1)-19)/2+1, mid2 = xMax-mid-19, //mid and mid2 = middle position | |
counter = 0, counter2 = yMax - 17, time = 0; //for moving cocktails | |
WINDOW * pic = newwin(16, 19, 0, mid); // cocktail 1 window | |
WINDOW * pic2 = newwin(16, 19, yMax-17, mid2); //cocktail 2 window | |
//Skip coctails if screen too small | |
if(!ScreenTooSmall){ | |
drawCocktails(xMax, yMax, mid, mid2, pic, pic2); | |
} | |
/* | |
********************************************** | |
Handling input and moving coctails | |
********************************************** | |
*/ | |
move(0,0); | |
while(1) | |
{ | |
/* | |
********************************************* | |
Part based, again, on Casual Coder's tutorial | |
*/ | |
//Printing list of choices, already highlighted | |
for(int i=0; i < 3; i++) | |
{ | |
if(i == highlight) | |
{ | |
wattron(choicesWin, A_REVERSE); | |
} | |
mvwprintw(choicesWin, i+1, (10 - choices[i].length())/2+1, choices[i].c_str()); | |
wattroff(choicesWin, A_REVERSE); | |
//******************************************* | |
} | |
wrefresh(choicesWin); | |
if(ScreenTooSmall== false) | |
{ | |
//moving coctails | |
while(!kbhit()) | |
{ | |
if(counter == yMax-17) | |
{ | |
//hide last left-coctail on screen | |
WINDOW * hide = newwin(16, 19, yMax-17, mid); | |
wbkgd(hide, COLOR_PAIR(2)); | |
wrefresh(hide); | |
//hide last right-coctail on screen | |
WINDOW * hide2 = newwin(16, 19, 0, mid2); | |
wbkgd(hide2, COLOR_PAIR(2)); | |
wrefresh(hide2); | |
counter = 0; | |
counter2 = yMax-17; | |
} | |
if(time > 40000) | |
{ | |
time = 0; | |
counter++; | |
counter2--; | |
mvwin(pic2, counter2, mid2); | |
wrefresh(pic2); | |
mvwin(pic, counter, mid); | |
wrefresh(pic); | |
} | |
time++; | |
} | |
} | |
//if key pressed, record it and save to choice | |
if(kbhit()){ | |
choice = int(wgetch(choicesWin)); | |
} | |
/* | |
********************************************* | |
Part based, again, on Casual Coder's tutorial | |
*/ | |
//65 key_up, 66 key_down | |
switch(choice) | |
{ | |
case 65: | |
highlight--; | |
if(highlight == -1) | |
highlight = 0; | |
break; | |
case 66: | |
highlight++; | |
if(highlight == 3) | |
highlight = 2; | |
break; | |
default: | |
break; | |
} | |
//when 'enter' pressed | |
if(choice==10) | |
{ | |
//exit | |
if(highlight==2) | |
{ | |
clear(); | |
refresh(); | |
endwin(); | |
exit(0); | |
return 0; | |
} | |
//options | |
if(highlight == 1) | |
{ | |
clear(); | |
refresh(); | |
showOptionsScreen(yMax, xMax, false); | |
} | |
if(highlight == 2){ | |
endwin(); | |
return 0; | |
} | |
} | |
} | |
//if 'Exit' chosen | |
if(highlight == 2) | |
{ | |
endwin(); | |
return 0; | |
} | |
printw("Your choice was: %s", choices[highlight].c_str()); | |
//********************************************* | |
} | |
int showOptionsScreen(int yMax, int xMax, bool isPauseMenu){ | |
//create window for choices | |
WINDOW * optionsWin = newwin(16, 16, (yMax-4)/2, (xMax-16)/2); | |
refresh(); | |
wrefresh(optionsWin); | |
vector<string> choices; | |
int highlightIndex = 0, mute = isPauseMenu ? 2 : 0; //inline boolean | |
if(isPauseMenu){ | |
choices.push_back("Return to Game"); | |
choices.push_back("Save"); | |
choices.push_back("Music: ON"); | |
choices.push_back("Quit to Menu"); | |
//choices = {"Return to Game", "Save", "Music: ON", "Quit to Menu"}; | |
}else{ | |
choices.push_back("Music: ON"); | |
choices.push_back("Back"); | |
//choices = {"Music: ON", "Back"}; | |
} | |
while(1) | |
{ | |
wclear(optionsWin); | |
if(isMuted()){ | |
choices[mute] = "Music: OFF"; | |
}else{ | |
choices[mute] = "Music: ON"; | |
} | |
for(int i=0; i < choices.size(); i++) | |
{ | |
if(i == highlightIndex) | |
{ | |
wattron(optionsWin, A_REVERSE); | |
} | |
mvwprintw(optionsWin, i+1, (16 - choices[i].length())/2+1, choices[i].c_str()); | |
wattroff(optionsWin, A_REVERSE); | |
} | |
wrefresh(optionsWin); | |
int buttonHit = int(wgetch(optionsWin)); | |
switch(buttonHit) | |
{ | |
case UP_KEY: | |
highlightIndex--; | |
if(highlightIndex == -1){ | |
highlightIndex = 0; | |
} | |
break; | |
case DOWN_KEY: | |
highlightIndex++; | |
if(highlightIndex == choices.size()){ | |
highlightIndex--; | |
} | |
break; | |
case ENTER_KEY: | |
if(highlightIndex == choices.size()-1) | |
{ | |
clear(); | |
refresh(); | |
endwin(); | |
showMainMenu(); | |
return 0; | |
} | |
else if(highlightIndex == mute) | |
{ | |
toggleMute(); | |
} | |
else if(choices.size() == 4 && highlightIndex == 0) // return to game | |
{ | |
printw("%s", choices[highlightIndex].c_str()); | |
move(0,0); | |
refresh(); | |
} | |
else if(choices.size() == 4 && highlightIndex == 1) // save | |
{ | |
printw("%s", choices[highlightIndex].c_str()); | |
move(0,0); | |
refresh(); | |
} | |
break; | |
default: | |
break; | |
} | |
} | |
return 0; | |
} | |
void drawCocktails(int xMax, int yMax, int mid, int mid2, WINDOW* pic, WINDOW* pic2) { | |
/* | |
********************************************** | |
Creating left-cocktail | |
********************************************** | |
*/ | |
//turn getch() into a non-blocking call | |
nodelay(stdscr, true); | |
scrollok(stdscr, true); | |
refresh(); | |
init_pair(3, COLOR_WHITE, COLOR_WHITE); | |
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA); | |
wattron(pic, COLOR_PAIR(4)); | |
mvwprintw(pic, 1, 14, " "); | |
mvwprintw(pic, 2, 13, " "); | |
wattroff(pic, COLOR_PAIR(4)); | |
wattron(pic, COLOR_PAIR(3)); | |
mvwprintw(pic, 3, 14, " "); | |
mvwprintw(pic, 4, 13, " "); | |
mvwprintw(pic, 5, 0, " "); | |
mvwprintw(pic, 6, 2, " "); | |
mvwprintw(pic, 7, 4, " "); | |
mvwprintw(pic, 8, 6, " "); | |
mvwprintw(pic, 9, 8, " "); | |
mvwprintw(pic, 10, 9, " "); | |
mvwprintw(pic, 11, 9, " "); | |
mvwprintw(pic, 12, 9, " "); | |
mvwprintw(pic, 13, 9, " "); | |
mvwprintw(pic, 14, 6, " "); | |
wattroff(pic, COLOR_PAIR(3)); | |
wrefresh(pic); | |
/* | |
********************************************** | |
Creating right-cocktail | |
********************************************** | |
*/ | |
//create window for glass pic | |
//box(pic2, 0, 0); | |
refresh(); | |
init_pair(3, COLOR_WHITE, COLOR_WHITE); | |
init_pair(4, COLOR_MAGENTA, COLOR_MAGENTA); | |
wattron(pic2, COLOR_PAIR(4)); | |
mvwprintw(pic2, 1, 14, " "); | |
mvwprintw(pic2, 2, 13, " "); | |
wattroff(pic2, COLOR_PAIR(4)); | |
wattron(pic2, COLOR_PAIR(3)); | |
mvwprintw(pic2, 3, 14, " "); | |
mvwprintw(pic2, 4, 13, " "); | |
mvwprintw(pic2, 5, 0, " "); | |
mvwprintw(pic2, 6, 2, " "); | |
mvwprintw(pic2, 7, 4, " "); | |
mvwprintw(pic2, 8, 6, " "); | |
mvwprintw(pic2, 9, 8, " "); | |
mvwprintw(pic2, 10, 9, " "); | |
mvwprintw(pic2, 11, 9, " "); | |
mvwprintw(pic2, 12, 9, " "); | |
mvwprintw(pic2, 13, 9, " "); | |
mvwprintw(pic2, 14, 6, " "); | |
wattroff(pic2, COLOR_PAIR(3)); | |
wrefresh(pic2); | |
} | |
void drawLogo(int xMax) { | |
//create window for logo | |
WINDOW * logo = newwin(32, 96, 2, (xMax-96)/2-1); | |
//box(logo, 0, 0); | |
refresh(); | |
//set windows's background to white | |
wbkgd(logo, COLOR_PAIR(4)); | |
wattron(logo, COLOR_PAIR(2)); | |
//S | |
mvwprintw(logo, 3, 6, " "); | |
mvwprintw(logo, 4, 6, " "); | |
mvwprintw(logo, 5, 6, " "); | |
mvwprintw(logo, 9, 0, " "); | |
mvwprintw(logo, 10, 0, " "); | |
mvwprintw(logo, 11, 0, " "); | |
//space | |
for(int i=0;i<15;i++) | |
{ | |
mvwprintw(logo, i, 12, " "); | |
} | |
//H | |
mvwprintw(logo, 0, 20, " "); | |
mvwprintw(logo, 1, 20, " "); | |
mvwprintw(logo, 2, 20, " "); | |
mvwprintw(logo, 3, 20, " "); | |
mvwprintw(logo, 4, 20, " "); | |
mvwprintw(logo, 5, 20, " "); | |
mvwprintw(logo, 9, 20, " "); | |
mvwprintw(logo, 10, 20, " "); | |
mvwprintw(logo, 11, 20, " "); | |
mvwprintw(logo, 12, 20, " "); | |
mvwprintw(logo, 13, 20, " "); | |
mvwprintw(logo, 14, 20, " "); | |
//space | |
for(int i=0;i<15;i++) | |
{ | |
mvwprintw(logo, i, 32, " "); | |
} | |
//A | |
mvwprintw(logo, 3, 40, " "); | |
mvwprintw(logo, 4, 40, " "); | |
mvwprintw(logo, 5, 40, " "); | |
mvwprintw(logo, 9, 40, " "); | |
mvwprintw(logo, 10, 40, " "); | |
mvwprintw(logo, 11, 40, " "); | |
mvwprintw(logo, 12, 40, " "); | |
mvwprintw(logo, 13, 40, " "); | |
mvwprintw(logo, 14, 40, " "); | |
//space | |
for(int i=0;i<15;i++) | |
{ | |
mvwprintw(logo, i, 52, " "); | |
} | |
//K | |
mvwprintw(logo, 0, 60, " "); | |
mvwprintw(logo, 1, 60, " "); | |
mvwprintw(logo, 2, 60, " "); | |
mvwprintw(logo, 3, 60, " "); | |
mvwprintw(logo, 4, 60, " "); | |
mvwprintw(logo, 5, 60, " "); | |
mvwprintw(logo, 9, 60, " "); | |
mvwprintw(logo, 10, 60, " "); | |
mvwprintw(logo, 11, 60, " "); | |
mvwprintw(logo, 12, 60, " "); | |
mvwprintw(logo, 13, 60, " "); | |
mvwprintw(logo, 14, 60, " "); | |
mvwprintw(logo, 6, 69, " "); | |
mvwprintw(logo, 7, 69, " "); | |
mvwprintw(logo, 8, 69, " "); | |
//space | |
for(int i=0;i<15;i++) | |
{ | |
mvwprintw(logo, i, 72, " "); | |
} | |
//E | |
mvwprintw(logo, 3, 80, " "); | |
mvwprintw(logo, 4, 80, " "); | |
mvwprintw(logo, 5, 80, " "); | |
mvwprintw(logo, 9, 80, " "); | |
mvwprintw(logo, 10, 80, " "); | |
mvwprintw(logo, 11, 80, " "); | |
//space | |
for(int i=0;i<86;i++) | |
{ | |
mvwprintw(logo, 15, i, " "); | |
mvwprintw(logo, 16, i, " "); | |
} | |
//I | |
for(int i=17;i<32;i++) | |
{ | |
mvwprintw(logo, i, 0, " "); | |
mvwprintw(logo, i, 13, " "); | |
} | |
//T | |
for(int i=20;i<32;i++) | |
{ | |
mvwprintw(logo, i, 15, " "); | |
mvwprintw(logo, i, 27, " "); | |
} | |
//space | |
for(int i=17;i<32;i++) | |
{ | |
mvwprintw(logo, i, 33, " "); | |
} | |
//U | |
for(int i=17;i<29;i++) | |
{ | |
mvwprintw(logo, i, 49, " "); | |
} | |
//space | |
for(int i=17;i<32;i++) | |
{ | |
mvwprintw(logo, i, 61, " "); | |
} | |
//P | |
mvwprintw(logo, 20, 69, " "); | |
mvwprintw(logo, 21, 69, " "); | |
mvwprintw(logo, 22, 69, " "); | |
mvwprintw(logo, 26, 69, " "); | |
mvwprintw(logo, 27, 69, " "); | |
mvwprintw(logo, 28, 69, " "); | |
mvwprintw(logo, 29, 69, " "); | |
mvwprintw(logo, 30, 69, " "); | |
mvwprintw(logo, 31, 69, " "); | |
//space | |
for(int i=17;i<32;i++) | |
{ | |
mvwprintw(logo, i, 81, " "); | |
} | |
//big space | |
for(int i=0;i<32;i++) | |
{ | |
mvwprintw(logo, i, 86, " "); | |
} | |
//! | |
mvwprintw(logo, 28, 90, " "); | |
mvwprintw(logo, 27, 90, " "); | |
wattroff(logo, COLOR_PAIR(2)); | |
wrefresh(logo); | |
} | |
int main() | |
{ | |
//ncurses start | |
initscr(); | |
//do not show user input | |
noecho(); | |
//enables ctrl+c | |
cbreak(); | |
//enables colors | |
start_color(); | |
curs_set(0); //disable cursor | |
//check if colors are supported | |
if(!has_colors()) | |
{ | |
printw("Terminal does not support colors"); | |
getch(); | |
return -1; | |
} | |
showMainMenu(); | |
endwin(); | |
return 0; | |
} |