#include "hs_state.h" #include #include "gamestate.h" #include "titlestate.h" #include "util.h" DisplayLocalHighscoreListState::DisplayLocalHighscoreListState(Game& game) { pointer_ = loadImage(game.renderer.get(), "resources/pointer.bmp"); std::unique_ptr lhl = HighscoreList::GetLocalHighscores(); surface_ptr list_s = lhl->render(); SDL_Color fontColor = {0, 0, 0, 0}; font_ptr font = loadFont(40); surface_ptr title = surface_ptr( TTF_RenderText_Blended(font.get(), "Highscore List", fontColor)); SDL_Rect tSpace = {240 - (title->w / 2), 0, title->w, title->h}; SDL_BlitSurface(title.get(), NULL, list_s.get(), &tSpace); surface_ptr options_s = surface_ptr(SDL_LoadBMP("resources/hlo_rtm.bmp")); SDL_Rect oSpace = {0, 440, options_s->w, options_s->h}; SDL_BlitSurface(options_s.get(), NULL, list_s.get(), &oSpace); list_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), list_s.get())); } std::unique_ptr DisplayLocalHighscoreListState::operator()(Game& game) { SDL_Event e; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 255, 255); SDL_RenderClear(game.renderer.get()); SDL_RenderCopy(game.renderer.get(), list_.get(), NULL, NULL); applyTexture(game.renderer.get(), pointer_.get(), 137, 449); SDL_RenderPresent(game.renderer.get()); while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { game.should_quit = true; break; } else if (e.type == SDL_KEYDOWN) { if (e.key.keysym.sym == SDLK_RETURN) { return std::make_unique(game); } } } return nullptr; } DisplayAndReturnLocalHighscoreListState:: DisplayAndReturnLocalHighscoreListState(Game& game) { pointer_ = loadImage(game.renderer.get(), "resources/pointer.bmp"); std::unique_ptr lhl = HighscoreList::GetLocalHighscores(); surface_ptr list_s = lhl->render(); SDL_Color fontColor = {0, 0, 0, 0}; font_ptr font = loadFont(40); surface_ptr title = surface_ptr( TTF_RenderText_Blended(font.get(), "Highscore List", fontColor)); SDL_Rect tSpace = {240 - (title->w / 2), 0, title->w, title->h}; SDL_BlitSurface(title.get(), NULL, list_s.get(), &tSpace); surface_ptr options_s = surface_ptr(SDL_LoadBMP("resources/hlo_paartm.bmp")); SDL_Rect oSpace = {0, 440, options_s->w, options_s->h}; SDL_BlitSurface(options_s.get(), NULL, list_s.get(), &oSpace); list_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), list_s.get())); } std::unique_ptr DisplayAndReturnLocalHighscoreListState::operator()( Game& game) { SDL_Event e; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 255, 255); SDL_RenderClear(game.renderer.get()); SDL_RenderCopy(game.renderer.get(), list_.get(), NULL, NULL); applyTexture(game.renderer.get(), pointer_.get(), selection_ == 0 ? 52 : 225, 447); SDL_RenderPresent(game.renderer.get()); while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { game.should_quit = true; break; } else if (e.type == SDL_KEYDOWN) { if ((e.key.keysym.sym == SDLK_LEFT) && (selection_ != 0)) { selection_--; } else if ((e.key.keysym.sym == SDLK_RIGHT) && (selection_ != 1)) { selection_++; } else if (e.key.keysym.sym == SDLK_RETURN) { switch (selection_) { case 0: return std::make_unique(); case 1: return std::make_unique(game); } } } } return nullptr; } EnterHighscoreState::EnterHighscoreState(Game& game, int level) : level_(level) { pointer_ = loadImage(game.renderer.get(), "resources/pointer.bmp"); // Render highscore list std::unique_ptr lhl = HighscoreList::GetLocalHighscores(); newpos_ = lhl->addHighscore(Highscore("", level_)); surface_ptr list_s = lhl->render(); SDL_Color fontColor = {0, 0, 0, 0}; font_ptr bigfont = loadFont(40); surface_ptr title = surface_ptr( TTF_RenderText_Blended(bigfont.get(), "New Highscore!", fontColor)); SDL_Rect tSpace = {240 - (title->w / 2), 0, title->w, title->h}; SDL_BlitSurface(title.get(), NULL, list_s.get(), &tSpace); font_ptr font = loadFont(25); surface_ptr text = surface_ptr( TTF_RenderText_Blended(font.get(), "Enter Your Name", fontColor)); SDL_Rect oSpace = {240 - (text->w / 2), 440, text->w, text->h}; SDL_BlitSurface(text.get(), NULL, list_s.get(), &oSpace); list_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), list_s.get())); int posw, posh; std::ostringstream posstr; posstr << newpos_ << ":"; std::string pos = posstr.str(); surface_ptr newName_s = surface_ptr(TTF_RenderText_Blended(font.get(), " ", fontColor)); TTF_SizeText(bigfont.get(), pos.c_str(), &posw, &posh); rntSpace_.x = posw; rntSpace_.y = newpos_ * 40 + ((posh / 2) - (newName_s->h / 2)); rntSpace_.w = newName_s->w; rntSpace_.h = newName_s->h; newName_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), newName_s.get())); } std::unique_ptr EnterHighscoreState::operator()(Game& game) { SDL_Event e; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 255, 255); SDL_RenderClear(game.renderer.get()); SDL_Rect eSpace = {0, newpos_ * 40, 480, 40}; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 0, 255); SDL_RenderFillRect(game.renderer.get(), &eSpace); SDL_RenderCopy(game.renderer.get(), list_.get(), NULL, NULL); SDL_RenderCopy(game.renderer.get(), newName_.get(), NULL, &rntSpace_); SDL_RenderPresent(game.renderer.get()); while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { game.should_quit = true; break; } else if (e.type == SDL_KEYDOWN) { if ((e.key.keysym.sym == SDLK_BACKSPACE) && (lp_ > 0)) { --lp_; hsname_.pop_back(); SDL_Color fontColor = {0, 0, 0, 0}; std::ostringstream name; name << " " << hsname_; font_ptr font = loadFont(25); surface_ptr newName_s = surface_ptr( TTF_RenderText_Blended(font.get(), name.str().c_str(), fontColor)); rntSpace_.w = newName_s->w; rntSpace_.h = newName_s->h; newName_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), newName_s.get())); } else if ((e.key.keysym.sym == SDLK_RETURN) && !hsname_.empty()) { std::unique_ptr lhl = HighscoreList::GetLocalHighscores(); Highscore h2(hsname_, level_); lhl->addHighscore(h2); lhl->writeToFile(); return std::make_unique(game, h2); } } else if (e.type == SDL_TEXTINPUT) { if (((*e.text.text & 0xFF80) == 0) && (*e.text.text >= 32 && *e.text.text < 127) && (lp_ < 25)) { lp_++; hsname_.push_back(*e.text.text & 0x7f); SDL_Color fontColor = {0, 0, 0, 0}; std::ostringstream name; name << " " << hsname_; font_ptr font = loadFont(25); surface_ptr newName_s = surface_ptr( TTF_RenderText_Blended(font.get(), name.str().c_str(), fontColor)); rntSpace_.w = newName_s->w; rntSpace_.h = newName_s->h; newName_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), newName_s.get())); } } } return nullptr; } NewHighscoreState::NewHighscoreState(Game& game, Highscore h) : h_(h) { pointer_ = loadImage(game.renderer.get(), "resources/pointer.bmp"); // Render highscore list std::unique_ptr lhl = HighscoreList::GetLocalHighscores(); surface_ptr list_s = lhl->render(); SDL_Color fontColor = {0, 0, 0, 0}; font_ptr bigfont = loadFont(40); surface_ptr title = surface_ptr( TTF_RenderText_Blended(bigfont.get(), "New Highscore!", fontColor)); SDL_Rect tSpace = {240 - (title->w / 2), 0, title->w, title->h}; SDL_BlitSurface(title.get(), NULL, list_s.get(), &tSpace); surface_ptr options_s = surface_ptr(SDL_LoadBMP("resources/hlo_paartm.bmp")); SDL_Rect oSpace = {0, 440, options_s->w, options_s->h}; SDL_BlitSurface(options_s.get(), NULL, list_s.get(), &oSpace); list_ = texture_ptr( SDL_CreateTextureFromSurface(game.renderer.get(), list_s.get())); } std::unique_ptr NewHighscoreState::operator()(Game& game) { SDL_Event e; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 255, 255); SDL_RenderClear(game.renderer.get()); SDL_Rect eSpace = {0, h_.getRank() * 40, 480, 40}; SDL_SetRenderDrawColor(game.renderer.get(), 255, 255, 0, 255); SDL_RenderFillRect(game.renderer.get(), &eSpace); SDL_RenderCopy(game.renderer.get(), list_.get(), NULL, NULL); applyTexture(game.renderer.get(), pointer_.get(), selection_ == 0 ? 52 : 225, 447); SDL_RenderPresent(game.renderer.get()); while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { game.should_quit = true; break; } else if (e.type == SDL_KEYDOWN) { if ((e.key.keysym.sym == SDLK_LEFT) && (selection_ != 0)) { selection_--; } else if ((e.key.keysym.sym == SDLK_RIGHT) && (selection_ != 1)) { selection_++; } else if (e.key.keysym.sym == SDLK_RETURN) { switch (selection_) { case 0: return std::make_unique(); case 1: return std::make_unique(game); } } } } return nullptr; }