/* * SnakeMenu.cpp * * Created on: Apr 13, 2019 * Author: dennisgunia */ #include "SnakeMenu.h" #include "global.h" #include #include SnakeMenu::SnakeMenu(SDL_Renderer *render) { // TODO Auto-generated constructor stub this->render = render; this->font_title = AssetLoader::AL_LoadFont(assetPath,"Seven Oh Ess 8x8 Monospaced.ttf",60); this->font_subtitle = AssetLoader::AL_LoadFont(assetPath,"Seven Oh Ess 8x8 Monospaced.ttf",29); this->font_text = AssetLoader::AL_LoadFont(assetPath,"Seven Oh Ess 8x8 Monospaced.ttf",20); this->music = AssetLoader::AL_LoadMusic(assetPath,"music/Title.wav"); this->snd_enter = AssetLoader::AL_LoadChunk(assetPath,"music/UI03.wav"); this->snd_select = AssetLoader::AL_LoadChunk(assetPath,"music/UI04.wav"); this->stars = AssetLoader::AL_LoadTexture(assetPath,"stars.png",this->render); this->moon = AssetLoader::AL_LoadTexture(assetPath,"moon_surface.png",this->render); this->earth = AssetLoader::AL_LoadTexture(assetPath,"earth.png",this->render); this->splash = AssetLoader::AL_LoadTexture(assetPath,"splash.png",this->render); this->currentFrame = frame_splash; this->selectedItem = 0; this->splashTimeout = 50; this->splashFade = 25; this->name = "dennisgunia"; this->curs_char = ' '; this->earthPhase = 0.75; Mix_PlayMusic(music,-1); this->readScores(); SDL_StopTextInput(); } SnakeMenu::~SnakeMenu() { // TODO Auto-generated destructor stub } void SnakeMenu::pressKey(Menukey key){ if (this->currentFrame == frame_title){ switch (key){ case menukey_up: this->selectedItem --; Mix_PlayChannel(-1, this->snd_select, 0); break; case menukey_down: this->selectedItem ++; Mix_PlayChannel(-1, this->snd_select, 0); break; case menukey_enter: switch(this->selectedItem){ case btn_exit: this->currentFrame = frame_title_fadeout_exit; Mix_PlayChannel(-1, this->snd_enter, 0); Mix_FadeOutMusic(1000); break; case btn_start: this->currentFrame = frame_nameinput; SDL_StartTextInput(); Mix_PlayChannel(-1, this->snd_enter, 0); //Mix_FadeOutMusic(1000); break; case btn_score: this->currentFrame = frame_scoreboard; Mix_PlayChannel(-1, this->snd_enter, 0); break; default: break; } break; default: break; } if (this->selectedItem < 0){ this->selectedItem += 3; } if (this->selectedItem > 2){ this->selectedItem -= 3; } }else if (this->currentFrame == frame_scoreboard){ switch (key){ case menukey_enter: this->currentFrame = frame_title; Mix_PlayChannel(-1, this->snd_enter, 0); break; default: break; } }else if (this->currentFrame == frame_nameinput){ switch (key){ case menukey_up: this->selectedItem --; Mix_PlayChannel(-1, this->snd_select, 0); break; case menukey_down: this->selectedItem ++; Mix_PlayChannel(-1, this->snd_select, 0); break; case menukey_back: if((this->name.length() > 0) && (this->currentFrame == frame_nameinput)){ this->name.pop_back(); } break; case menukey_enter: switch(this->selectedItem){ case 2: this->currentFrame = frame_title; Mix_PlayChannel(-1, this->snd_enter, 0); break; case 1: this->currentFrame = frame_title_fadeout_start; Mix_PlayChannel(-1, this->snd_enter, 0); Mix_FadeOutMusic(1000); break; default: break; } break; default: break; } if (this->selectedItem < 0){ this->selectedItem += 3; } if (this->selectedItem > 2){ this->selectedItem -= 3; } if(this->selectedItem == 0){ SDL_StartTextInput(); }else{ SDL_StopTextInput(); this->curs_char = ' '; } } } int SnakeMenu::renderFrame(){ SDL_RenderClear(this->render); SDL_Rect cell; SDL_GetRendererOutputSize(this->render,&cell.w,&cell.h); Uint32 now = SDL_GetTicks(); if (this->lastAnimFrame + 150 < now){ this->skyBoxPos += 1; if(this->skyBoxPos >= cell.w){ this->skyBoxPos = 0; } } if (this->lastCurs + 400 < now && this->selectedItem == 0){ if(this->curs_char == ' '){ this->curs_char = '_'; }else{ this->curs_char = ' '; } this->lastCurs = now; } if (this->lastBlend +30 < now){ this->lastBlend = now; this->earthPhase += 0.0005; if(this->earthPhase >= 2){ this->earthPhase = 0.00; } if (this->splashFade > -1 ){ if(this->splashTimeout > 0 ){ this->splashTimeout --; }else if(this->splashTimeout == 0 ){ this->currentFrame = frame_title; this->splashTimeout --; }else{ if(this->splashFade > 0 ){ this->splashFade --; }else if (this->splashFade == 0 ){ this->splashFade --; } } } } cell.x = + this->skyBoxPos; cell.y = 0; //calculate earth SDL_RenderCopy(this->render, this->stars, NULL, &cell); cell.x -= cell.w; SDL_RenderCopy(this->render, this->stars, NULL, &cell); cell.x = 0; SDL_RenderCopy(this->render, this->moon, NULL, &cell); SDL_Surface *temp_surface = TTF_RenderText_Blended(this->font_title,"SpaceSnake",{255,255,255,255}); SDL_Texture *tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_Rect txt_score_dest; const int amplitude = cell.h * 1.75; SDL_QueryTexture(this->earth, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (cell.w / 2)-(txt_score_dest.w / 2) - (sin(this->earthPhase * PI)*amplitude); txt_score_dest.y = cell.h * 1.8+ (cos(this->earthPhase * PI)*amplitude); SDL_RenderCopy(this->render, this->earth, NULL, &txt_score_dest); SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (cell.w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 50; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); temp_surface = TTF_RenderText_Blended(this->font_subtitle,"(c) 2019 by Dennis Vincent Gunia",{255,255,255,255}); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (cell.w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 130; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); if(this->currentFrame == frame_title){ this->renderMenuButtons(); } if(this->currentFrame == frame_scoreboard){ this->renderMenuScore(); } if(this->currentFrame == frame_nameinput){ this->renderNameInput(); } if(!Mix_PlayingMusic()){ if (this->currentFrame == frame_title_fadeout_exit){ this->currentFrame = frame_can_exit; } if (this->currentFrame == frame_title_fadeout_start){ this->currentFrame = frame_can_start; } } if(this->splashFade >= 0 ){ cell.x = 0; cell.y = 0; SDL_GetRendererOutputSize(this->render,&cell.w,&cell.h); SDL_SetTextureAlphaMod( this->splash,this->splashFade*10 + 5); SDL_RenderCopy(this->render, this->splash, NULL, &cell); } SDL_RenderPresent(this->render); return this->currentFrame; } void SnakeMenu::renderMenuButtons(){ SDL_Color col[3] = {{255,255,255,255},{255,255,255,255},{255,255,255,255}}; col[this->selectedItem] = {0,255,255,255}; int scr_w; SDL_GetRendererOutputSize(this->render,&scr_w,NULL); SDL_Surface *temp_surface = TTF_RenderText_Blended(this->font_subtitle,"play game",col[btn_start]); SDL_Texture *tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_Rect txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 400; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); temp_surface = TTF_RenderText_Blended(this->font_subtitle,"scoreboard",col[btn_score]); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 450; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); temp_surface = TTF_RenderText_Blended(this->font_subtitle,"exit",col[btn_exit]); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 600; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); } void SnakeMenu::renderMenuScore(){ int scores = this->scoreboard.size(); int scr_w; SDL_GetRendererOutputSize(this->render,&scr_w,NULL); // output score for (int i = 0 ; i < 10 ; i ++){ int i_score = this->scoreboard[i].score; std::string i_name = this->scoreboard[i].name; std::stringstream ss; ss << i_score << " - " << i_name; std::string s = ss.str(); char * tab2 = new char [s.length()+1]; strcpy (tab2, s.c_str()); SDL_Surface *temp_surface = TTF_RenderText_Blended(this->font_subtitle,tab2,{255,255,255,255}); SDL_Texture *tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_Rect txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 300 + (i*40); SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); } SDL_Surface *temp_surface = TTF_RenderText_Blended(this->font_subtitle,"back",{0,255,255,255}); SDL_Texture *tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_Rect txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 800; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); } void SnakeMenu::registerScore(int score){ Score temp = {score , this->name}; for (int i = 0 ; i < 10 ; i ++){ if (this->scoreboard[i].score < temp.score){ this->scoreboard.insert(this->scoreboard.begin()+i,temp); break; } } this->writeScores(); // save score } void SnakeMenu::goToTitle(){ this->currentFrame = frame_title; this->selectedItem = 0; Mix_PlayMusic(music,-1); } void SnakeMenu::renderNameInput() { int scr_w; SDL_GetRendererOutputSize(this->render,&scr_w,NULL); SDL_Surface *temp_surface = TTF_RenderText_Blended(this->font_text,"enter playername:",{255,255,255,255}); SDL_Texture *tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_Rect txt_score_dest; SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 400; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); SDL_Color col[3] = {{255,255,255,255},{255,255,255,255},{255,255,255,255}}; col[this->selectedItem] = {0,255,255,255}; std::stringstream ss; ss << this->name << this->curs_char ; std::string s = ss.str(); char * tempname = new char [s.length()+1]; strcpy (tempname, s.c_str()); temp_surface = TTF_RenderText_Blended(this->font_subtitle,tempname,col[0]); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 450; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); temp_surface = TTF_RenderText_Blended(this->font_subtitle,"continue",col[1]); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 600; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); temp_surface = TTF_RenderText_Blended(this->font_subtitle,"back",col[2]); tx_score = SDL_CreateTextureFromSurface(this->render, temp_surface); SDL_QueryTexture(tx_score, NULL, NULL, &txt_score_dest.w, &txt_score_dest.h); txt_score_dest.x = (scr_w / 2)-(txt_score_dest.w / 2); txt_score_dest.y = 650; SDL_RenderCopy(this->render, tx_score, NULL, &txt_score_dest); SDL_DestroyTexture(tx_score); SDL_FreeSurface(temp_surface); } void SnakeMenu::readScores() { std::ifstream openFile; openFile.open(saveFiles); std::string line; if (openFile.is_open()){ std::getline (openFile,line) ; line.pop_back(); this->name = line; while ( std::getline (openFile,line) ) { line.pop_back(); std::size_t found = line.find(","); std::string tmp_name = line.substr(found + 1); int tmp_score_int; std::istringstream iss (line.substr(0,found)); iss >> tmp_score_int; std::cout << tmp_score_int << " - " << tmp_name << '\n'; Score dummyscore = {tmp_score_int,tmp_name}; this->scoreboard.push_back(dummyscore); } openFile.close(); } else{ Score dummyscore = {0,"player"}; for (int i = 0 ; i < 10 ; i ++){ this->scoreboard.push_back(dummyscore); } } } void SnakeMenu::writeScores() { std::ofstream saveFile; saveFile.open(saveFiles, std::ofstream::out | std::ofstream::trunc); saveFile << this->name << ";\n"; for (int i = 0 ; i < 10 ; i ++){ saveFile << this->scoreboard[i].score <<","<< this->scoreboard[i].name << ";\n"; } saveFile.close(); }