diff options
author | Clyne Sullivan <tullivan99@gmail.com> | 2016-04-12 18:48:49 -0400 |
---|---|---|
committer | Clyne Sullivan <tullivan99@gmail.com> | 2016-04-12 18:48:49 -0400 |
commit | 03130c5bcec3c885a1be005c24e192dfb57f3fe5 (patch) | |
tree | 22de0bcd5f45e91cc6fbaa3dcdd308a86ae516a5 /src/ui.cpp | |
parent | 5c48f10a46e470493328978d6ccee8722c743f31 (diff) |
moved menu stuff to own file
Diffstat (limited to 'src/ui.cpp')
-rw-r--r-- | src/ui.cpp | 425 |
1 files changed, 72 insertions, 353 deletions
@@ -1,12 +1,8 @@ #include <ui.hpp> -/* - * Create a macro to easily access SDL keypresses -*/ - -#define SDL_KEY e.key.keysym.sym - extern std::vector<menuItem> optionsMenu; +extern Menu *currentMenu; +extern Menu pauseMenu; extern SDL_Window *window; @@ -69,14 +65,6 @@ static std::vector<vec3> merchArrowLoc ( 2, vec3 { 0, 0, 0 } ); static bool typeOutDone = true; static bool typeOutSustain = false; -/* - * Menu-related objects - */ - -extern Menu* currentMenu; -extern Menu pauseMenu; - - static Mix_Chunk *dialogClick; extern void mainLoop(void); @@ -98,19 +86,6 @@ Mix_Chunk *sanic; static GLuint pageTex = 0; static bool pageTexReady = false; -void Menu::gotoParent(){ - if(parent == NULL){ - currentMenu = NULL; - config::update(); - }else{ - currentMenu = parent; - } -} - -void Menu::gotoChild(){ - currentMenu = child; -} - void loadFontSize( unsigned int size, std::vector<GLuint> &tex, std::vector<FT_Info> &dat ) { FT_Set_Pixel_Sizes(ftf,0,size); @@ -173,7 +148,7 @@ namespace ui { */ vec2 mouse; - static vec2 premouse={0,0}; + vec2 premouse={0,0}; /* * Variety of keydown bools @@ -211,6 +186,8 @@ namespace ui { unsigned int fontSize; + void takeScreenshot(GLubyte* pixels); + /* * Initialises the Freetype library, and sets a font size. */ @@ -876,331 +853,6 @@ namespace ui { config::save(); } - menuItem createButton(vec2 l, dim2 d, Color c, const char* t, menuFunc f){ - menuItem temp; - temp.member = 0; - - temp.button.loc = l; - temp.button.dim = d; - temp.button.color = c; - - temp.button.text = t; - - temp.button.func = f; - - return temp; - } - - menuItem createChildButton(vec2 l, dim2 d, Color c, const char* t){ - menuItem temp; - temp.member = -1; - - temp.button.loc = l; - temp.button.dim = d; - temp.button.color = c; - - temp.button.text = t; - - temp.button.func = NULL; - - return temp; - } - - menuItem createParentButton(vec2 l, dim2 d, Color c, const char* t){ - menuItem temp; - temp.member = -2; - - temp.button.loc = l; - temp.button.dim = d; - temp.button.color = c; - - temp.button.text = t; - - temp.button.func = NULL; - - return temp; - } - - menuItem createSlider(vec2 l, dim2 d, Color c, float min, float max, const char* t, float* v){ - menuItem temp; - temp.member = 1; - - temp.slider.loc = l; - temp.slider.dim = d; - temp.slider.color = c; - temp.slider.minValue = min; - temp.slider.maxValue = max; - - temp.slider.text = t; - - temp.slider.var = v; - - temp.slider.sliderLoc = *v; - - return temp; - } - - /* - * Draws the menu - */ - - void drawMenu(Menu *menu){ - setFontSize(24); - config::update(); - SDL_Event e; - - mouse.x=premouse.x+offset.x-(SCREEN_WIDTH/2); - mouse.y=(offset.y+SCREEN_HEIGHT/2)-premouse.y; - - //custom event polling for menu's so all other events are disregarded - while(SDL_PollEvent(&e)){ - switch(e.type){ - case SDL_QUIT: - gameRunning = false; - return; - break; - case SDL_MOUSEMOTION: - premouse.x=e.motion.x; - premouse.y=e.motion.y; - break; - case SDL_KEYUP: - if(SDL_KEY == SDLK_ESCAPE){ - menu->gotoParent(); - return; - } - break; - default:break; - } - } - - //draw the dark transparent background - glColor4f(0.0f, 0.0f, 0.0f, .8f); - glRectf(offset.x-SCREEN_WIDTH/2,0,offset.x+SCREEN_WIDTH/2,SCREEN_HEIGHT); - - //loop through all elements of the menu - for(auto &m : menu->items){ - //if the menu is any type of button - if(m.member == 0 || m.member == -1 || m.member == -2){ - - //draw the button background - glColor3f(m.button.color.red,m.button.color.green,m.button.color.blue); - glRectf(offset.x+m.button.loc.x, - offset.y+m.button.loc.y, - offset.x+m.button.loc.x + m.button.dim.x, - offset.y+m.button.loc.y + m.button.dim.y); - //draw the button text - putStringCentered(offset.x + m.button.loc.x + (m.button.dim.x/2), - (offset.y + m.button.loc.y + (m.button.dim.y/2)) - ui::fontSize/2, - m.button.text); - - //tests if the mouse is over the button - if(mouse.x >= offset.x+m.button.loc.x && mouse.x <= offset.x+m.button.loc.x + m.button.dim.x){ - if(mouse.y >= offset.y+m.button.loc.y && mouse.y <= offset.y+m.button.loc.y + m.button.dim.y){ - - //if the mouse if over the button, it draws this white outline - glColor3f(1.0f,1.0f,1.0f); - glBegin(GL_LINE_STRIP); - glVertex2f(offset.x+m.button.loc.x, offset.y+m.button.loc.y); - glVertex2f(offset.x+m.button.loc.x+m.button.dim.x, offset.y+m.button.loc.y); - glVertex2f(offset.x+m.button.loc.x+m.button.dim.x, offset.y+m.button.loc.y+m.button.dim.y); - glVertex2f(offset.x+m.button.loc.x, offset.y+m.button.loc.y+m.button.dim.y); - glVertex2f(offset.x+m.button.loc.x, offset.y+m.button.loc.y); - glEnd(); - - //if the mouse is over the button and clicks - if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_LEFT)){ - switch(m.member){ - case 0: //normal button - m.button.func(); - break; - case -1: - menu->gotoChild(); //goto child menu - break; - case -2: - menu->gotoParent(); //goto parent menu - default:break; - } - } - } - } - - //if element is a slider - }else if(m.member == 1){ - //combining slider text with variable amount - char outSV[32]; - sprintf(outSV, "%s: %.1f",m.slider.text, *m.slider.var); - - float sliderW, sliderH; - - if(m.slider.dim.y > m.slider.dim.x){ - //width of the slider handle - sliderW = m.slider.dim.x; - sliderH = m.slider.dim.y * .05; - //location of the slider handle - m.slider.sliderLoc = m.slider.minValue + (*m.slider.var/m.slider.maxValue)*(m.slider.dim.y-sliderW); - }else{ - //width of the slider handle - sliderW = m.slider.dim.x * .05; - sliderH = m.slider.dim.y; - //location of the slider handle - m.slider.sliderLoc = m.slider.minValue + (*m.slider.var/m.slider.maxValue)*(m.slider.dim.x-sliderW); - } - //draw the background of the slider - glColor4f(m.slider.color.red,m.slider.color.green,m.slider.color.blue, .5f); - glRectf(offset.x+m.slider.loc.x, - offset.y+m.slider.loc.y, - offset.x+m.slider.loc.x + m.slider.dim.x, - offset.y+m.slider.loc.y + m.slider.dim.y); - - //draw the slider handle - glColor4f(m.slider.color.red,m.slider.color.green,m.slider.color.blue, 1.0f); - if(m.slider.dim.y > m.slider.dim.x){ - glRectf(offset.x+m.slider.loc.x, - offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05), - offset.x+m.slider.loc.x + sliderW, - offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05) + sliderH); - - //draw the now combined slider text - putStringCentered(offset.x + m.slider.loc.x + (m.slider.dim.x/2), (offset.y + m.slider.loc.y + (m.slider.dim.y*1.05)) - ui::fontSize/2, outSV); - }else{ - glRectf(offset.x+m.slider.loc.x+m.slider.sliderLoc, - offset.y+m.slider.loc.y, - offset.x+m.slider.loc.x + m.slider.sliderLoc + sliderW, - offset.y+m.slider.loc.y + sliderH); - - //draw the now combined slider text - putStringCentered(offset.x + m.slider.loc.x + (m.slider.dim.x/2), (offset.y + m.slider.loc.y + (m.slider.dim.y/2)) - ui::fontSize/2, outSV); - } - //test if mouse is inside of the slider's borders - if(mouse.x >= offset.x+m.slider.loc.x && mouse.x <= offset.x+m.slider.loc.x + m.slider.dim.x){ - if(mouse.y >= offset.y+m.slider.loc.y && mouse.y <= offset.y+m.slider.loc.y + m.slider.dim.y){ - - //if it is we draw a white border around it - glColor3f(1.0f,1.0f,1.0f); - glBegin(GL_LINE_STRIP); - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y); - glVertex2f(offset.x+m.slider.loc.x+m.slider.dim.x, offset.y+m.slider.loc.y); - glVertex2f(offset.x+m.slider.loc.x+m.slider.dim.x, offset.y+m.slider.loc.y+m.slider.dim.y); - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y+m.slider.dim.y); - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y); - - if(m.slider.dim.y > m.slider.dim.x){ - //and a border around the slider handle - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05)); - glVertex2f(offset.x+m.slider.loc.x + sliderW, offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05)); - glVertex2f(offset.x+m.slider.loc.x + sliderW, offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05) + sliderH); - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05) + sliderH); - glVertex2f(offset.x+m.slider.loc.x, offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05)); - }else{ - //and a border around the slider handle - glVertex2f(offset.x+m.slider.loc.x + m.slider.sliderLoc, offset.y+m.slider.loc.y); - glVertex2f(offset.x+m.slider.loc.x + (m.slider.sliderLoc + sliderW), offset.y+m.slider.loc.y); - glVertex2f(offset.x+m.slider.loc.x + (m.slider.sliderLoc + sliderW), offset.y+m.slider.loc.y+m.slider.dim.y); - glVertex2f(offset.x+m.slider.loc.x + m.slider.sliderLoc, offset.y+m.slider.loc.y+m.slider.dim.y); - glVertex2f(offset.x+m.slider.loc.x + m.slider.sliderLoc, offset.y+m.slider.loc.y); - } - - glEnd(); - - //if we are inside the slider and click it will set the slider to that point - if(SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(SDL_BUTTON_LEFT)){ - //change handle location - if(m.slider.dim.y > m.slider.dim.x){ - *m.slider.var = (((mouse.y-offset.y) - m.slider.loc.y)/m.slider.dim.y)*100; - //draw a white box over the handle - glColor3f(1.0f,1.0f,1.0f); - glRectf(offset.x+m.slider.loc.x, - offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05), - offset.x+m.slider.loc.x + sliderW, - offset.y+m.slider.loc.y + (m.slider.sliderLoc * 1.05) + sliderH); - - }else{ - *m.slider.var = (((mouse.x-offset.x) - m.slider.loc.x)/m.slider.dim.x)*100; - //draw a white box over the handle - glColor3f(1.0f,1.0f,1.0f); - glRectf(offset.x+m.slider.loc.x + m.slider.sliderLoc, - offset.y+m.slider.loc.y, - offset.x+m.slider.loc.x + (m.slider.sliderLoc + sliderW), - offset.y+m.slider.loc.y + m.slider.dim.y); - } - } - - //makes sure handle can't go below or above min and max values - if(*m.slider.var >= m.slider.maxValue)*m.slider.var = m.slider.maxValue; - else if(*m.slider.var <= m.slider.minValue)*m.slider.var = m.slider.minValue; - } - } - } - } - setFontSize(16); - } - - void takeScreenshot(GLubyte* pixels){ - std::vector<GLubyte> bgr (SCREEN_WIDTH * SCREEN_HEIGHT * 3, 0); - - for(uint x = 0; x < SCREEN_WIDTH*SCREEN_HEIGHT*3; x+=3){ - bgr[x] = pixels[x+2]; - bgr[x+1] = pixels[x+1]; - bgr[x+2] = pixels[x]; - } - - time_t epoch = time(NULL); - struct tm* timen = localtime(&epoch); - - std::string name = "screenshots/"; - name += std::to_string(1900 + timen->tm_year) += "-"; - name += std::to_string(timen->tm_mon + 1) += "-"; - name += std::to_string(timen->tm_mday) += "_"; - name += std::to_string(timen->tm_hour) += "-"; - name += std::to_string(timen->tm_min) += "-"; - name += std::to_string(timen->tm_sec); - name += ".bmp"; - FILE* bmp = fopen(name.c_str(), "w+"); - - // unsigned long header_size = sizeof(BITMAPFILEHEADER) + - // sizeof(BITMAPINFOHEADER); - - BITMAPFILEHEADER bmfh; - BITMAPINFOHEADER bmih; - - memset(&bmfh, 0, sizeof(BITMAPFILEHEADER)); - memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); - - bmfh.bfType = 0x4d42; - - bmfh.bfOffBits = 54; - bmfh.bfSize = sizeof(BITMAPFILEHEADER) + - sizeof(BITMAPINFOHEADER); - bmfh.bfReserved1 = 0; - bmfh.bfReserved2 = 0; - - - bmih.biSize = sizeof(BITMAPINFOHEADER); - bmih.biBitCount = 24; - - bmih.biClrImportant = 0; - bmih.biClrUsed = 0; - - bmih.biCompression = 0; - - bmih.biWidth = SCREEN_WIDTH; - bmih.biHeight = SCREEN_HEIGHT; - - bmih.biPlanes = 1; - bmih.biSizeImage = 0; - - bmih.biXPelsPerMeter = 0x0ec4; - bmih.biYPelsPerMeter = 0x0ec4; - - fwrite(&bmfh, 1,sizeof(BITMAPFILEHEADER),bmp); - fwrite(&bmih, 1,sizeof(BITMAPINFOHEADER),bmp); - fwrite(&bgr, 1,3*SCREEN_WIDTH*SCREEN_HEIGHT,bmp); - - delete[] pixels; - - fclose(bmp); - } - void closeBox(){ dialogBoxExists = false; dialogMerchant = false; @@ -1294,6 +946,7 @@ EXIT: if ( ig ) { ig->vel.x = (fr.x - mouse.x) / 50.0f; ig->vel.y = (fr.y - mouse.y) / 50.0f; + //ig->forcedMove = true; // kills vel.x too quickly ig = NULL; } break; @@ -1574,4 +1227,70 @@ EXIT: Mix_PlayChannel( 1, battleStart, 0 ); } + + void takeScreenshot(GLubyte* pixels){ + std::vector<GLubyte> bgr (SCREEN_WIDTH * SCREEN_HEIGHT * 3, 0); + + for(uint x = 0; x < SCREEN_WIDTH*SCREEN_HEIGHT*3; x+=3){ + bgr[x] = pixels[x+2]; + bgr[x+1] = pixels[x+1]; + bgr[x+2] = pixels[x]; + } + + time_t epoch = time(NULL); + struct tm* timen = localtime(&epoch); + + std::string name = "screenshots/"; + name += std::to_string(1900 + timen->tm_year) += "-"; + name += std::to_string(timen->tm_mon + 1) += "-"; + name += std::to_string(timen->tm_mday) += "_"; + name += std::to_string(timen->tm_hour) += "-"; + name += std::to_string(timen->tm_min) += "-"; + name += std::to_string(timen->tm_sec); + name += ".bmp"; + FILE* bmp = fopen(name.c_str(), "w+"); + + // unsigned long header_size = sizeof(BITMAPFILEHEADER) + + // sizeof(BITMAPINFOHEADER); + + BITMAPFILEHEADER bmfh; + BITMAPINFOHEADER bmih; + + memset(&bmfh, 0, sizeof(BITMAPFILEHEADER)); + memset(&bmih, 0, sizeof(BITMAPINFOHEADER)); + + bmfh.bfType = 0x4d42; + + bmfh.bfOffBits = 54; + bmfh.bfSize = sizeof(BITMAPFILEHEADER) + + sizeof(BITMAPINFOHEADER); + bmfh.bfReserved1 = 0; + bmfh.bfReserved2 = 0; + + + bmih.biSize = sizeof(BITMAPINFOHEADER); + bmih.biBitCount = 24; + + bmih.biClrImportant = 0; + bmih.biClrUsed = 0; + + bmih.biCompression = 0; + + bmih.biWidth = SCREEN_WIDTH; + bmih.biHeight = SCREEN_HEIGHT; + + bmih.biPlanes = 1; + bmih.biSizeImage = 0; + + bmih.biXPelsPerMeter = 0x0ec4; + bmih.biYPelsPerMeter = 0x0ec4; + + fwrite(&bmfh, 1,sizeof(BITMAPFILEHEADER),bmp); + fwrite(&bmih, 1,sizeof(BITMAPINFOHEADER),bmp); + fwrite(&bgr, 1,3*SCREEN_WIDTH*SCREEN_HEIGHT,bmp); + + delete[] pixels; + + fclose(bmp); + } } |