void Menu::draw(DrawingContext& context) { if (!items[active_item]->help.empty()) { int text_width = (int) Resources::normal_font->get_text_width(items[active_item]->help); int text_height = (int) Resources::normal_font->get_text_height(items[active_item]->help); Rectf text_rect(pos.x - text_width/2 - 8, SCREEN_HEIGHT - 48 - text_height/2 - 4, pos.x + text_width/2 + 8, SCREEN_HEIGHT - 48 + text_height/2 + 4); context.draw_filled_rect(Rectf(text_rect.p1 - Vector(4,4), text_rect.p2 + Vector(4,4)), Color(0.2f, 0.3f, 0.4f, 0.8f), 16.0f, LAYER_GUI-10); context.draw_filled_rect(text_rect, Color(0.6f, 0.7f, 0.8f, 0.5f), 16.0f, LAYER_GUI-10); context.draw_text(Resources::normal_font, items[active_item]->help, Vector(pos.x, SCREEN_HEIGHT - 48 - text_height/2), ALIGN_CENTER, LAYER_GUI); } for(unsigned int i = 0; i < items.size(); ++i) { draw_item(context, i); } }
void EditorLayersGui::draw(DrawingContext& context) { if (object_tip) { object_tip->draw_up(context, get_layer_coords(hovered_layer)); } context.draw_filled_rect(Rectf(Vector(0, Ypos), Vector(Width, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-10); switch (hovered_item) { case HI_SPAWNPOINTS: context.draw_filled_rect(Rectf(Vector(0, Ypos), Vector(Xpos, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); break; case HI_SECTOR: context.draw_filled_rect(Rectf(Vector(Xpos, Ypos), Vector(sector_text_width + Xpos, SCREEN_HEIGHT)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); break; case HI_LAYERS: { Vector coords = get_layer_coords(hovered_layer); context.draw_filled_rect(Rectf(coords, coords + Vector(32, 32)), Color(0.9f, 0.9f, 1.0f, 0.6f), 0.0f, LAYER_GUI-5); } break; default: break; } if (!Editor::current()->levelloaded) { return; } context.draw_text(Resources::normal_font, sector_text, Vector(35, Ypos+5), ALIGN_LEFT, LAYER_GUI, ColorScheme::Menu::default_color); int pos = 0; for(auto it = layers.begin(); it != layers.end(); ++it) { LayerIcon* layer_icon = (*it).get(); if (layer_icon->is_valid()) { layer_icon->draw(context, get_layer_coords(pos)); } else { auto it2 = it; it++; layers.erase(it2); it--; } pos++; } }
void ItemBack::draw(DrawingContext& context, Vector pos, int menu_width, bool active) { float text_width = Resources::normal_font->get_text_width(text); context.draw_text(Resources::normal_font, text, Vector( pos.x + menu_width/2 , pos.y - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, active ? ColorScheme::Menu::active_color : get_color()); context.draw_surface(Resources::back, Vector(pos.x + menu_width/2 + text_width/2 + 16, pos.y - 8), LAYER_GUI); }
void ItemStringSelect::draw(DrawingContext& context, const Vector& pos, int menu_width, bool active) { float roff = Resources::arrow_left->get_width(); float sel_width = Resources::normal_font->get_text_width(list[*selected]); // Draw left side context.draw_text(Resources::normal_font, text, Vector(pos.x + 16, pos.y - int(Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, active ? ColorScheme::Menu::active_color : get_color()); // Draw right side context.draw_surface(Resources::arrow_left, Vector(pos.x + menu_width - sel_width - 2*roff - 8, pos.y - 8), LAYER_GUI); context.draw_surface(Resources::arrow_right, Vector(pos.x + menu_width - roff - 8, pos.y - 8), LAYER_GUI); context.draw_text(Resources::normal_font, list[*selected], Vector(pos.x + menu_width - roff - 8, pos.y - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, active ? ColorScheme::Menu::active_color : get_color()); }
void TitleScreen::draw(DrawingContext& context) { Sector* sector = titlesession->get_current_sector(); sector->draw(context); // FIXME: Add something to scale the frame to the resolution of the screen //context.draw_surface(frame, Vector(0,0),LAYER_FOREGROUND1); context.draw_text(Resources::small_font, "SuperTux " PACKAGE_VERSION "\n", Vector(5, SCREEN_HEIGHT - 50), ALIGN_LEFT, LAYER_FOREGROUND1); context.draw_text(Resources::small_font, _( "Copyright (c) 2003-2010 SuperTux Devel Team\n" "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to\n" "redistribute it under certain conditions; see the file COPYING for details.\n" ), Vector(5, SCREEN_HEIGHT - 50 + Resources::small_font->get_height() + 5), ALIGN_LEFT, LAYER_FOREGROUND1); }
void ItemScriptLine::draw(DrawingContext& context, Vector pos, int menu_width, bool active) { std::string r_input = *input; auto font = Console::current()->get_font(); bool fl = active && (int(real_time*2)%2); if ( fl ) { r_input += "_"; } context.draw_text(font, r_input, Vector(pos.x + 16, pos.y - int(font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, ColorScheme::Menu::field_color); }
void Statistics::draw_message_info(DrawingContext& context, std::string title) { // skip draw if level was never played // TODO: do we need this? if (coins == nv_coins) return; // skip draw if stats were declared invalid if (!valid) return; const float width = white_small_text->get_text_width("Max coins collected: 1111 / 1111"); const float left = (SCREEN_WIDTH - width) / 2; const float right = (SCREEN_WIDTH + width) / 2; context.draw_text(gold_text, title, Vector(SCREEN_WIDTH/2, 410), CENTER_ALLIGN, LAYER_GUI); char stat_buf[128]; int py = 450 + 18; snprintf(stat_buf, sizeof(stat_buf), "%d/%d", coins, total_coins); context.draw_text(white_small_text, _("Max coins collected:"), Vector(left, py), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_small_text, "%d / %d", Vector(right, py), RIGHT_ALLIGN, LAYER_GUI); py+=18; snprintf(stat_buf, sizeof(stat_buf), "%d/%d", badguys, total_badguys); context.draw_text(white_small_text, _("Max fragging:"), Vector(left, py), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_small_text, "%d / %d", Vector(right, py), RIGHT_ALLIGN, LAYER_GUI); py+=18; int csecs = (int)(time * 100); int mins = (int)(csecs / 6000); int secs = (csecs % 6000) / 100; snprintf(stat_buf, sizeof(stat_buf), "%02d:%02d", mins,secs); context.draw_text(white_small_text, _("Min time needed:"), Vector(left, py), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_small_text, "%02d:%02d", Vector(right, py), RIGHT_ALLIGN, LAYER_GUI); py+=18; snprintf(stat_buf, sizeof(stat_buf), "%d/%d", secrets, total_secrets); context.draw_text(white_small_text, _("Max secrets found:"), Vector(left, py), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_small_text, "%d / %d", Vector(right, py), RIGHT_ALLIGN, LAYER_GUI); py+=18; }
void LayerIcon::draw(DrawingContext& context, Vector pos) { if (!is_valid()) return; ObjectIcon::draw(context,pos); int l = get_zpos(); if (l != std::numeric_limits<int>::min()) { context.draw_text(Resources::small_font, std::to_string(l), pos + Vector(16,16), ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::default_color); if (is_tilemap) if (((TileMap*)layer)->editor_active) { context.draw_surface(selection, pos, LAYER_GUI - 1); } } }
void ItemToggle::draw(DrawingContext& context, const Vector& pos, int menu_width, bool active) { context.draw_text(Resources::normal_font, text, Vector(pos.x + 16, pos.y - (Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, active ? ColorScheme::Menu::active_color : get_color()); if(*toggled) { context.draw_surface(Resources::checkbox_checked, Vector(pos.x + menu_width-16 - Resources::checkbox->get_width(), pos.y - 8), LAYER_GUI + 1); } else { context.draw_surface(Resources::checkbox, Vector(pos.x + menu_width-16 - Resources::checkbox->get_width(), pos.y - 8), LAYER_GUI + 1); } }
void ScreenManager::draw_player_pos(DrawingContext& context) { if (auto session = GameSession::current()) { auto sector = session->get_current_sector(); if (sector == NULL) return; auto pos = sector->get_players()[0]->get_pos(); auto pos_text = "X:" + std::to_string(int(pos.x)) + " Y:" + std::to_string(int(pos.y)); context.draw_text(Resources::small_font, pos_text, Vector(SCREEN_WIDTH - Resources::small_font->get_text_width("99999x99999") - BORDER_X, BORDER_Y + 40), ALIGN_LEFT, LAYER_HUD); } }
void FloatingText::draw(DrawingContext& context) { // make an alpha animation when disappearing int alpha; if(timer.get_timeleft() < FADING_TIME) alpha = int(timer.get_timeleft() * 255 / FADING_TIME); else alpha = 255; context.push_transform(); context.set_alpha(alpha); context.draw_text(Resources::normal_font, text, position, ALIGN_LEFT, LAYER_OBJECTS+1, FloatingText::text_color); context.pop_transform(); }
void PlayerStatus::draw(DrawingContext& context) { int player_id = 0; if ((displayed_coins == DISPLAYED_COINS_UNSET) || (std::abs(displayed_coins - coins) > 100)) { displayed_coins = coins; displayed_coins_frame = 0; } if (++displayed_coins_frame > 2) { displayed_coins_frame = 0; if (displayed_coins < coins) displayed_coins++; if (displayed_coins > coins) displayed_coins--; } displayed_coins = std::min(std::max(displayed_coins, 0), MAX_COINS); std::stringstream ss; ss << displayed_coins; std::string coins_text = ss.str(); context.push_transform(); context.set_translation(Vector(0, 0)); if (coin_surface) { context.draw_surface(coin_surface, Vector(SCREEN_WIDTH - BORDER_X - coin_surface->get_width() - Resources::fixed_font->get_text_width(coins_text), BORDER_Y + 1 + (Resources::fixed_font->get_text_height(coins_text) + 5) * player_id), LAYER_HUD); } context.draw_text(Resources::fixed_font, coins_text, Vector(SCREEN_WIDTH - BORDER_X - Resources::fixed_font->get_text_width(coins_text), BORDER_Y + (Resources::fixed_font->get_text_height(coins_text) + 5) * player_id), ALIGN_LEFT, LAYER_HUD, PlayerStatus::text_color); context.pop_transform(); }
void TileSet::draw_tile(DrawingContext& context, uint32_t id, const Vector& pos, int z_pos, Color color) const { if (id == 0) return; Tile* tile; if (id >= m_tiles.size()) { tile = NULL; } else { tile = m_tiles[id].get(); } if (tile) { tile->load_images(); tile->draw(context, pos, z_pos, color); } else if (Editor::is_active()) { // Draw a notile sign context.draw_surface(notile_surface, pos, 0, color, Blend(), z_pos); context.draw_text(Resources::small_font, std::to_string(id), pos + Vector(16, 16), ALIGN_CENTER, z_pos, color); } }
void LevelTime::draw(DrawingContext& context) { context.push_transform(); context.set_translation(Vector(0, 0)); if ((time_left > TIME_WARNING) || (int(game_time * 2.5) % 2)) { std::stringstream ss; ss << int(time_left); std::string time_text = ss.str(); if (time_surface) { float all_width = time_surface->get_width() + Resources::normal_font->get_text_width(time_text); context.draw_surface(time_surface, Vector((SCREEN_WIDTH - all_width)/2, BORDER_Y + 1), LAYER_FOREGROUND1); context.draw_text(Resources::normal_font, time_text, Vector((SCREEN_WIDTH - all_width)/2 + time_surface->get_width(), BORDER_Y), ALIGN_LEFT, LAYER_FOREGROUND1, LevelTime::text_color); } } context.pop_transform(); }
void Dialog::draw(DrawingContext& ctx) { Rectf bg_rect(Vector(SCREEN_WIDTH/2 - m_text_size.width/2, SCREEN_HEIGHT/2 - m_text_size.height/2), Sizef(m_text_size.width, m_text_size.height + 44)); // draw background rect ctx.draw_filled_rect(bg_rect.grown(12.0f), Color(0.2f, 0.3f, 0.4f, 0.8f), 16.0f, LAYER_GUI-10); ctx.draw_filled_rect(bg_rect.grown(8.0f), Color(0.6f, 0.7f, 0.8f, 0.5f), 16.0f, LAYER_GUI-10); // draw text ctx.draw_text(Resources::normal_font, m_text, Vector(bg_rect.p1.x + bg_rect.get_width()/2.0f, bg_rect.p1.y), ALIGN_CENTER, LAYER_GUI); // draw HL line ctx.draw_filled_rect(Vector(bg_rect.p1.x, bg_rect.p2.y - 35), Vector(bg_rect.get_width(), 4), Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); ctx.draw_filled_rect(Vector(bg_rect.p1.x, bg_rect.p2.y - 35), Vector(bg_rect.get_width(), 2), Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); // draw buttons for(int i = 0; i < static_cast<int>(m_buttons.size()); ++i) { float segment_width = bg_rect.get_width() / m_buttons.size(); float button_width = segment_width; float button_height = 24.0f; Vector pos(bg_rect.p1.x + segment_width/2.0f + i * segment_width, bg_rect.p2.y - 12); if (i == m_selected_button) { float blink = (sinf(real_time * M_PI * 1.0f)/2.0f + 0.5f) * 0.5f + 0.25f; ctx.draw_filled_rect(Rectf(Vector(pos.x - button_width/2, pos.y - button_height/2), Vector(pos.x + button_width/2, pos.y + button_height/2)).grown(2.0f), Color(1.0f, 1.0f, 1.0f, blink), 14.0f, LAYER_GUI-10); ctx.draw_filled_rect(Rectf(Vector(pos.x - button_width/2, pos.y - button_height/2), Vector(pos.x + button_width/2, pos.y + button_height/2)), Color(1.0f, 1.0f, 1.0f, 0.5f), 12.0f, LAYER_GUI-10); } ctx.draw_text(Resources::normal_font, m_buttons[i].text, Vector(pos.x, pos.y - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, i == m_selected_button ? ColorScheme::Menu::active_color : ColorScheme::Menu::default_color); } }
void Statistics::draw_endseq_panel(DrawingContext& context, Statistics* best_stats, SurfacePtr backdrop) { // skip draw if stats were declared invalid if (!valid) return; // abort if we have no backdrop if (!backdrop) return; // no sense drawing stats if there are none if (total_coins + total_badguys + total_secrets == 0) return; int box_w = 220+110+110; int box_h = 30+20+20+20; int box_x = (int)((SCREEN_WIDTH - box_w) / 2); int box_y = (int)(SCREEN_HEIGHT / 2) - box_h; int bd_w = (int)backdrop->get_width(); int bd_h = (int)backdrop->get_height(); int bd_x = (int)((SCREEN_WIDTH - bd_w) / 2); int bd_y = box_y + (box_h / 2) - (bd_h / 2); int col1_x = box_x; int col2_x = col1_x+200; int col3_x = col2_x+130; int row1_y = box_y; int row2_y = row1_y+30; int row3_y = row2_y+20; int row4_y = row3_y+20; int row5_y = row4_y+20; context.push_transform(); context.set_alpha(0.5); context.draw_surface(backdrop, Vector(bd_x, bd_y), LAYER_HUD); context.pop_transform(); context.draw_text(Resources::normal_font, _("You"), Vector(col2_x, row1_y), ALIGN_LEFT, LAYER_HUD, Statistics::header_color); if (best_stats) context.draw_text(Resources::normal_font, _("Best"), Vector(col3_x, row1_y), ALIGN_LEFT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::normal_font, _("Coins"), Vector(col2_x-16, row3_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::normal_font, coins_to_string(coins, total_coins), Vector(col2_x, row3_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); if (best_stats) { int coins_best = (best_stats->coins > coins) ? best_stats->coins : coins; int total_coins_best = (best_stats->total_coins > total_coins) ? best_stats->total_coins : total_coins; context.draw_text(Resources::normal_font, coins_to_string(coins_best, total_coins_best), Vector(col3_x, row3_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); } context.draw_text(Resources::normal_font, _("Badguys"), Vector(col2_x-16, row4_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::normal_font, frags_to_string(badguys, total_badguys), Vector(col2_x, row4_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); if (best_stats) { int badguys_best = (best_stats->badguys > badguys) ? best_stats->badguys : badguys; int total_badguys_best = (best_stats->total_badguys > total_badguys) ? best_stats->total_badguys : total_badguys; context.draw_text(Resources::normal_font, frags_to_string(badguys_best, total_badguys_best), Vector(col3_x, row4_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); } context.draw_text(Resources::normal_font, _("Secrets"), Vector(col2_x-16, row5_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::normal_font, secrets_to_string(secrets, total_secrets), Vector(col2_x, row5_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); if (best_stats) { int secrets_best = (best_stats->secrets > secrets) ? best_stats->secrets : secrets; int total_secrets_best = (best_stats->total_secrets > total_secrets) ? best_stats->total_secrets : total_secrets; context.draw_text(Resources::normal_font, secrets_to_string(secrets_best, total_secrets_best), Vector(col3_x, row5_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); } context.draw_text(Resources::normal_font, _("Time"), Vector(col2_x-16, row2_y), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::normal_font, time_to_string(time), Vector(col2_x, row2_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); if (best_stats) { float time_best = (best_stats->time < time) ? best_stats->time : time; context.draw_text(Resources::normal_font, time_to_string(time_best), Vector(col3_x, row2_y), ALIGN_LEFT, LAYER_HUD, Statistics::text_color); } }
void ItemLabel::draw(DrawingContext& context, const Vector& pos, int menu_width, bool active) { context.draw_text(Resources::big_font, text, Vector( pos.x + menu_width/2 , pos.y - int(Resources::big_font->get_height())/2 ), ALIGN_CENTER, LAYER_GUI, get_color()); }
void Statistics::draw_worldmap_info(DrawingContext& context, float target_time) { // skip draw if level was never played if (coins == nv_coins) return; // skip draw if stats were declared invalid if (!valid) return; // no sense drawing stats if there are none if (total_coins + total_badguys + total_secrets == 0) return; // check to see if screen size has been changed if (!(WMAP_INFO_TOP_Y1 == SCREEN_HEIGHT - 100)) { WMAP_INFO_LEFT_X = SCREEN_WIDTH - 32 - 256; WMAP_INFO_RIGHT_X = WMAP_INFO_LEFT_X + 256; WMAP_INFO_TOP_Y1 = SCREEN_HEIGHT - 100; WMAP_INFO_TOP_Y2 = WMAP_INFO_TOP_Y1 + 16; } context.draw_text(Resources::small_font, std::string("- ") + _("Best Level Statistics") + " -", Vector((WMAP_INFO_LEFT_X + WMAP_INFO_RIGHT_X) / 2, WMAP_INFO_TOP_Y1), ALIGN_CENTER, LAYER_HUD,Statistics::header_color); std::string caption_buf; std::string stat_buf; float posy = WMAP_INFO_TOP_Y2; for (int stat_no = 0; stat_no < 5; stat_no++) { switch (stat_no) { case 0: caption_buf = _("Max coins collected:"); stat_buf = coins_to_string(coins, total_coins); break; case 1: caption_buf = _("Max fragging:"); stat_buf = frags_to_string(badguys, total_badguys); break; case 2: caption_buf = _("Max secrets found:"); stat_buf = secrets_to_string(secrets, total_secrets); break; case 3: caption_buf = _("Best time completed:"); stat_buf = time_to_string(time); break; case 4: if(target_time){ // display target time only if defined for level caption_buf = _("Level target time:"); stat_buf = time_to_string(target_time); } else { caption_buf = ""; stat_buf = ""; } break; default: log_debug << "Invalid stat requested to be drawn" << std::endl; break; } context.draw_text(Resources::small_font, caption_buf, Vector(WMAP_INFO_LEFT_X, posy), ALIGN_LEFT, LAYER_HUD, Statistics::header_color); context.draw_text(Resources::small_font, stat_buf, Vector(WMAP_INFO_RIGHT_X, posy), ALIGN_RIGHT, LAYER_HUD, Statistics::header_color); posy += Resources::small_font->get_height() + 2; } }
void Statistics::draw_endseq_panel(DrawingContext& context, Statistics* best_stats, Surface* backdrop) { // skip draw if level was never played // TODO: do we need this? if (coins == nv_coins) return; // skip draw if stats were declared invalid if (!valid) return; // abort if we have no backdrop if (!backdrop) return; int box_w = 220+110+110; int box_h = 30+20+20+20; int box_x = (int)((SCREEN_WIDTH - box_w) / 2); int box_y = (int)(SCREEN_HEIGHT / 2) - box_h; int bd_w = (int)backdrop->get_width(); int bd_h = (int)backdrop->get_height(); int bd_x = (int)((SCREEN_WIDTH - bd_w) / 2); int bd_y = box_y + (box_h / 2) - (bd_h / 2); int col1_x = box_x; int col2_x = col1_x+200; int col3_x = col2_x+130; int row1_y = box_y; int row2_y = row1_y+30; int row3_y = row2_y+20; int row4_y = row3_y+20; context.push_transform(); context.set_alpha(0.5); context.draw_surface(backdrop, Vector(bd_x, bd_y), LAYER_GUI); context.pop_transform(); char buf[129]; context.draw_text(white_text, _("You"), Vector(col2_x, row1_y), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_text, _("Best"), Vector(col3_x, row1_y), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_text, _("Coins"), Vector(col2_x-16, row2_y), RIGHT_ALLIGN, LAYER_GUI); snprintf(buf, sizeof(buf), "%d/%d", std::min(coins, 999), std::min(total_coins, 999)); context.draw_text(gold_text, buf, Vector(col2_x, row2_y), LEFT_ALLIGN, LAYER_GUI); if (best_stats && (best_stats->coins > coins)) { snprintf(buf, sizeof(buf), "%d/%d", std::min(best_stats->coins, 999), std::min(best_stats->total_coins, 999)); } context.draw_text(gold_text, buf, Vector(col3_x, row2_y), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_text, _("Secrets"), Vector(col2_x-16, row4_y), RIGHT_ALLIGN, LAYER_GUI); snprintf(buf, sizeof(buf), "%d/%d", secrets, total_secrets); context.draw_text(gold_text, buf, Vector(col2_x, row4_y), LEFT_ALLIGN, LAYER_GUI); if (best_stats && (best_stats->secrets > secrets)) { snprintf(buf, sizeof(buf), "%d/%d", best_stats->secrets, best_stats->total_secrets); } context.draw_text(gold_text, buf, Vector(col3_x, row4_y), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_text, _("Time"), Vector(col2_x-16, row3_y), RIGHT_ALLIGN, LAYER_GUI); int csecs = (int)(time * 100); int mins = (int)(csecs / 6000); int secs = (csecs % 6000) / 100; snprintf(buf, sizeof(buf), "%02d:%02d", mins,secs); context.draw_text(gold_text, buf, Vector(col2_x, row3_y), LEFT_ALLIGN, LAYER_GUI); if (best_stats && (best_stats->time < time)) { int csecs = (int)(best_stats->time * 100); int mins = (int)(csecs / 6000); int secs = (csecs % 6000) / 100; snprintf(buf, sizeof(buf), "%02d:%02d", mins,secs); } context.draw_text(gold_text, buf, Vector(col3_x, row3_y), LEFT_ALLIGN, LAYER_GUI); }
void Statistics::draw_worldmap_info(DrawingContext& context) { // skip draw if level was never played if (coins == nv_coins) return; // skip draw if stats were declared invalid if (!valid) return; context.draw_text(white_small_text, std::string("- ") + _("Best Level Statistics") + " -", Vector((WMAP_INFO_LEFT_X + WMAP_INFO_RIGHT_X) / 2, WMAP_INFO_TOP_Y1), CENTER_ALLIGN, LAYER_GUI); float alpha; if(timer.get_timegone() < FADING_TIME) alpha = (timer.get_timegone() * 1.0f / FADING_TIME); else if(timer.get_timeleft() < FADING_TIME) alpha = (timer.get_timeleft() * 1.0f / FADING_TIME); else alpha = 1.0f; context.push_transform(); context.set_alpha(alpha); char caption_buf[128]; char stat_buf[128]; switch (display_stat) { case 0: snprintf(caption_buf, sizeof(caption_buf), _("Max coins collected:")); snprintf(stat_buf, sizeof(stat_buf), "%d/%d", coins, total_coins); break; case 1: snprintf(caption_buf, sizeof(caption_buf), _("Max fragging:")); snprintf(stat_buf, sizeof(stat_buf), "%d/%d", badguys, total_badguys); break; case 2: snprintf(caption_buf, sizeof(caption_buf), _("Min time needed:")); { int csecs = (int)(time * 100); int mins = (int)(csecs / 6000); int secs = (csecs % 6000) / 100; snprintf(stat_buf, sizeof(stat_buf), "%02d:%02d", mins,secs); } break; case 3: snprintf(caption_buf, sizeof(caption_buf), _("Max secrets found:")); snprintf(stat_buf, sizeof(stat_buf), "%d/%d", secrets, total_secrets); break; default: log_debug << "Invalid stat requested to be drawn" << std::endl; break; } if (!timer.started()) { timer.start(TOTAL_DISPLAY_TIME); display_stat++; if (display_stat > 3) display_stat = 0; } context.draw_text(white_small_text, caption_buf, Vector(WMAP_INFO_LEFT_X, WMAP_INFO_TOP_Y2), LEFT_ALLIGN, LAYER_GUI); context.draw_text(white_small_text, stat_buf, Vector(WMAP_INFO_RIGHT_X, WMAP_INFO_TOP_Y2), RIGHT_ALLIGN, LAYER_GUI); context.pop_transform(); }
void Menu::draw_item(DrawingContext& context, int index) { float menu_height = get_height(); float menu_width = get_width(); MenuItem& pitem = *(items[index]); Color text_color = ColorScheme::Menu::default_color; float x_pos = pos.x; float y_pos = pos.y + 24*index - menu_height/2 + 12; int text_width = int(Resources::normal_font->get_text_width(pitem.text)); int input_width = int(Resources::normal_font->get_text_width(pitem.input) + 10); int list_width = 0; float left = pos.x - menu_width/2 + 16; float right = pos.x + menu_width/2 - 16; if(pitem.list.size() > 0) { list_width = (int) Resources::normal_font->get_text_width(pitem.list[pitem.selected]); } if (arrange_left) x_pos += 24 - menu_width/2 + (text_width + input_width + list_width)/2; if(index == active_item) { text_color = ColorScheme::Menu::active_color; } if(active_item == index) { float blink = (sinf(real_time * M_PI * 1.0f)/2.0f + 0.5f) * 0.5f + 0.25f; context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10 - 2, y_pos - 12 - 2), Vector(pos.x + menu_width/2 - 10 + 2, y_pos + 12 + 2)), Color(1.0f, 1.0f, 1.0f, blink), 14.0f, LAYER_GUI-10); context.draw_filled_rect(Rectf(Vector(pos.x - menu_width/2 + 10, y_pos - 12), Vector(pos.x + menu_width/2 - 10, y_pos + 12)), Color(1.0f, 1.0f, 1.0f, 0.5f), 12.0f, LAYER_GUI-10); } switch (pitem.kind) { case MN_INACTIVE: { context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::inactive_color); break; } case MN_HL: { // TODO float x = pos.x - menu_width/2; float y = y_pos - 12; /* Draw a horizontal line with a little 3d effect */ context.draw_filled_rect(Vector(x, y + 6), Vector(menu_width, 4), Color(0.6f, 0.7f, 1.0f, 1.0f), LAYER_GUI); context.draw_filled_rect(Vector(x, y + 6), Vector(menu_width, 2), Color(1.0f, 1.0f, 1.0f, 1.0f), LAYER_GUI); break; } case MN_LABEL: { context.draw_text(Resources::big_font, pitem.text, Vector(pos.x, y_pos - int(Resources::big_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, ColorScheme::Menu::label_color); break; } case MN_TEXTFIELD: case MN_NUMFIELD: case MN_CONTROLFIELD: { if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD) { if(active_item == index) context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(true), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); else context.draw_text(Resources::normal_font, pitem.get_input_with_symbol(false), Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); } else context.draw_text(Resources::normal_font, pitem.input, Vector(right, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, ColorScheme::Menu::field_color); context.draw_text(Resources::normal_font, pitem.text, Vector(left, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); break; } case MN_STRINGSELECT: { float roff = Resources::arrow_left->get_width(); // Draw left side context.draw_text(Resources::normal_font, pitem.text, Vector(left, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); // Draw right side context.draw_surface(Resources::arrow_left, Vector(right - list_width - roff - roff, y_pos - 8), LAYER_GUI); context.draw_surface(Resources::arrow_right, Vector(right - roff, y_pos - 8), LAYER_GUI); context.draw_text(Resources::normal_font, pitem.list[pitem.selected], Vector(right - roff, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_RIGHT, LAYER_GUI, text_color); break; } case MN_BACK: { context.draw_text(Resources::Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); context.draw_surface(Resources::back, Vector(x_pos + text_width/2 + 16, y_pos - 8), LAYER_GUI); break; } case MN_TOGGLE: { context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x - menu_width/2 + 16, y_pos - (Resources::normal_font->get_height()/2)), ALIGN_LEFT, LAYER_GUI, text_color); if(pitem.toggled) context.draw_surface(Resources::checkbox_checked, Vector(x_pos + (menu_width/2-16) - Resources::checkbox->get_width(), y_pos - 8), LAYER_GUI + 1); else context.draw_surface(Resources::checkbox, Vector(x_pos + (menu_width/2-16) - Resources::checkbox->get_width(), y_pos - 8), LAYER_GUI + 1); break; } case MN_ACTION: context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); break; case MN_GOTO: context.draw_text(Resources::normal_font, pitem.text, Vector(pos.x, y_pos - int(Resources::normal_font->get_height()/2)), ALIGN_CENTER, LAYER_GUI, text_color); break; } }
void MenuItem::draw(DrawingContext& context, Vector pos, int menu_width, bool active) { context.draw_text(Resources::normal_font, text, Vector( pos.x + menu_width/2 , pos.y - int(Resources::normal_font->get_height())/2 ), ALIGN_CENTER, LAYER_GUI, active ? ColorScheme::Menu::active_color : get_color()); }