made resizing the window in the title screen work properly, ...
...and made basic keyboard shortcuts work in the title scren
This commit is contained in:
parent
eca141e046
commit
111cd8cbfa
13 changed files with 262 additions and 182 deletions
|
@ -213,7 +213,7 @@ This unit illuminates the surrounding area, making lawful units fight better, an
|
||||||
|
|
||||||
Any units adjacent to this unit will fight as if it were dusk when it is night, and as if it were day when it is dusk."
|
Any units adjacent to this unit will fight as if it were dusk when it is night, and as if it were day when it is dusk."
|
||||||
|
|
||||||
skirmisher_description="Skirmishes:
|
skirmisher_description="Skirmisher:
|
||||||
This unit is skilled in moving past enemies quickly, and ignores all Enemy Zones of Control."
|
This unit is skilled in moving past enemies quickly, and ignores all Enemy Zones of Control."
|
||||||
|
|
||||||
no_leader_to_recruit="You don't have a leader to recruit with."
|
no_leader_to_recruit="You don't have a leader to recruit with."
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 8 KiB |
|
@ -278,7 +278,7 @@ int display::hex_width() const
|
||||||
|
|
||||||
double display::zoom(int amount)
|
double display::zoom(int amount)
|
||||||
{
|
{
|
||||||
if(amount == 0) {
|
if(amount == 0 || !team_valid()) {
|
||||||
return double(zoom_)/double(DefaultZoom);
|
return double(zoom_)/double(DefaultZoom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2079,7 +2079,7 @@ void display::add_chat_message(const std::string& speaker, int side, const std::
|
||||||
if(type == MESSAGE_PUBLIC) {
|
if(type == MESSAGE_PUBLIC) {
|
||||||
str << "<" << speaker << ">";
|
str << "<" << speaker << ">";
|
||||||
} else {
|
} else {
|
||||||
str << "*" << speaker << "*";
|
str << font::NULL_MARKUP << "*" << speaker << "*";
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_Color speaker_colour = {255,255,255,255};
|
SDL_Color speaker_colour = {255,255,255,255};
|
||||||
|
|
|
@ -66,7 +66,7 @@ namespace {
|
||||||
double location_distance(const gamemap::location loc1, const gamemap::location loc2) {
|
double location_distance(const gamemap::location loc1, const gamemap::location loc2) {
|
||||||
const double xdiff = loc1.x - loc2.x;
|
const double xdiff = loc1.x - loc2.x;
|
||||||
const double ydiff = loc1.y - loc2.y;
|
const double ydiff = loc1.y - loc2.y;
|
||||||
const double dist = std::sqrt(xdiff * xdiff + ydiff * ydiff);
|
const double dist = sqrt(xdiff * xdiff + ydiff * ydiff);
|
||||||
return dist;
|
return dist;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -631,8 +631,8 @@ void map_editor::perform_selection_move() {
|
||||||
gui_.clear_highlighted_locs();
|
gui_.clear_highlighted_locs();
|
||||||
std::set<gamemap::location> new_selection;
|
std::set<gamemap::location> new_selection;
|
||||||
// Transfer the terrain to the new position.
|
// Transfer the terrain to the new position.
|
||||||
for (std::set<gamemap::location>::const_iterator it = selected_hexes_.begin();
|
std::set<gamemap::location>::const_iterator it;
|
||||||
it != selected_hexes_.end(); it++) {
|
for(it = selected_hexes_.begin(); it != selected_hexes_.end(); it++) {
|
||||||
const gamemap::location hl_loc =
|
const gamemap::location hl_loc =
|
||||||
get_hex_with_offset(*it, x_diff, y_diff);
|
get_hex_with_offset(*it, x_diff, y_diff);
|
||||||
if (map_.on_board(hl_loc)) {
|
if (map_.on_board(hl_loc)) {
|
||||||
|
@ -644,8 +644,7 @@ void map_editor::perform_selection_move() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fill the selection with the selected terrain.
|
// Fill the selection with the selected terrain.
|
||||||
for (std::set<gamemap::location>::const_iterator it = selected_hexes_.begin();
|
for (it = selected_hexes_.begin(); it != selected_hexes_.end(); it++) {
|
||||||
it != selected_hexes_.end(); it++) {
|
|
||||||
if (map_.on_board(*it) && new_selection.find(*it) == new_selection.end()) {
|
if (map_.on_board(*it) && new_selection.find(*it) == new_selection.end()) {
|
||||||
undo_action.add(map_.get_terrain(*it), palette_.selected_terrain(), *it);
|
undo_action.add(map_.get_terrain(*it), palette_.selected_terrain(), *it);
|
||||||
map_.set_terrain(*it, palette_.selected_terrain());
|
map_.set_terrain(*it, palette_.selected_terrain());
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "sound.hpp"
|
#include "sound.hpp"
|
||||||
#include "statistics.hpp"
|
#include "statistics.hpp"
|
||||||
#include "team.hpp"
|
#include "team.hpp"
|
||||||
|
#include "titlescreen.hpp"
|
||||||
#include "util.hpp"
|
#include "util.hpp"
|
||||||
#include "unit_types.hpp"
|
#include "unit_types.hpp"
|
||||||
#include "unit.hpp"
|
#include "unit.hpp"
|
||||||
|
@ -598,7 +599,11 @@ int play_game(int argc, char** argv)
|
||||||
recorder.clear();
|
recorder.clear();
|
||||||
|
|
||||||
std::cerr << "showing title screen...\n";
|
std::cerr << "showing title screen...\n";
|
||||||
gui::TITLE_RESULT res = gui::show_title(disp);
|
gui::TITLE_RESULT res = gui::CONTINUE;
|
||||||
|
|
||||||
|
while(res == gui::CONTINUE) {
|
||||||
|
res = gui::show_title(disp);
|
||||||
|
}
|
||||||
|
|
||||||
std::cerr << "title screen returned result\n";
|
std::cerr << "title screen returned result\n";
|
||||||
|
|
||||||
|
|
|
@ -282,15 +282,12 @@ void mp_connect::lists_init()
|
||||||
config::child_iterator sd;
|
config::child_iterator sd;
|
||||||
for(sd = sides.first; sd != sides.second; ++sd) {
|
for(sd = sides.first; sd != sides.second; ++sd) {
|
||||||
const int team_num = sd - sides.first;
|
const int team_num = sd - sides.first;
|
||||||
const std::string& team_name = (**sd)["team_name"];
|
std::string& team_name = (**sd)["team_name"];
|
||||||
std::stringstream str;
|
if(team_name.empty()) {
|
||||||
str << string_table["team"] << " ";
|
team_name = lexical_cast<std::string>(team_num+1);
|
||||||
|
}
|
||||||
|
|
||||||
if(team_name.empty() == false)
|
player_teams_.push_back(string_table["team"] + " " + team_name);
|
||||||
str << team_name;
|
|
||||||
else
|
|
||||||
str << (team_num+1);
|
|
||||||
player_teams_.push_back(str.str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Colors
|
//Colors
|
||||||
|
|
|
@ -284,18 +284,40 @@ void game::send_data(const config& data, network::connection exclude)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool game::player_on_team(const std::string& team, network::connection player) const
|
||||||
|
{
|
||||||
|
//if the player is the game host, then iterate over all the sides and if any of
|
||||||
|
//the sides controlled by the game host are on this team, then the game host
|
||||||
|
//is on this team
|
||||||
|
if(players_.empty() == false && player == players_.front()) {
|
||||||
|
const config::child_list& sides = level_.get_children("side");
|
||||||
|
for(config::child_list::const_iterator i = sides.begin(); i != sides.end(); ++i) {
|
||||||
|
if((**i)["controller"] == "human" && (**i)["team_name"] == team) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//other hosts than the game host
|
||||||
|
const std::map<network::connection,std::string>::const_iterator side = sides_.find(player);
|
||||||
|
if(side != sides_.end()) {
|
||||||
|
const config* const side_cfg = level_.find_child("side","side",side->second);
|
||||||
|
if(side_cfg != NULL && (*side_cfg)["team_name"] == team) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void game::send_data_team(const config& data, const std::string& team, network::connection exclude)
|
void game::send_data_team(const config& data, const std::string& team, network::connection exclude)
|
||||||
{
|
{
|
||||||
for(std::vector<network::connection>::const_iterator
|
for(std::vector<network::connection>::const_iterator i = players_.begin(); i != players_.end(); ++i) {
|
||||||
i = players_.begin(); i != players_.end(); ++i) {
|
if(*i != exclude && player_on_team(team,*i)) {
|
||||||
if(*i != exclude && sides_.count(*i) == 1) {
|
|
||||||
const config* const side = level_.find_child("side","side",sides_[*i]);
|
|
||||||
if(side != NULL && (*side)["team_name"] == team) {
|
|
||||||
network::send_data(data,*i);
|
network::send_data(data,*i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void game::record_data(const config& data)
|
void game::record_data(const config& data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -70,6 +70,9 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
//function which returns true iff 'player' is on 'team'.
|
||||||
|
bool player_on_team(const std::string& team, network::connection player) const;
|
||||||
|
|
||||||
//function which should be called every time a player ends their turn
|
//function which should be called every time a player ends their turn
|
||||||
//(i.e. [end_turn] received). This will update the 'turn' attribute for
|
//(i.e. [end_turn] received). This will update the 'turn' attribute for
|
||||||
//the game's description when appropriate. Will return true if there has
|
//the game's description when appropriate. Will return true if there has
|
||||||
|
|
|
@ -800,157 +800,4 @@ network::connection network_data_dialog(display& disp, const std::string& msg, c
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void fade_logo(display& screen, int xpos, int ypos)
|
|
||||||
{
|
|
||||||
const scoped_sdl_surface logo(image::get_image(game_config::game_logo,image::UNSCALED));
|
|
||||||
if(logo == NULL) {
|
|
||||||
std::cerr << "Could not find game logo\n";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface* const fb = screen.video().getSurface();
|
|
||||||
|
|
||||||
if(fb == NULL || xpos < 0 || ypos < 0 || xpos + logo->w > fb->w || ypos + logo->h > fb->h) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//only once, when the game is first started, the logo fades in
|
|
||||||
static bool faded_in = false;
|
|
||||||
|
|
||||||
CKey key;
|
|
||||||
bool last_button = key[SDLK_ESCAPE] || key[SDLK_SPACE];
|
|
||||||
|
|
||||||
std::cerr << "fading logo in....\n";
|
|
||||||
|
|
||||||
std::cerr << "logo size: " << logo->w << "," << logo->h << "\n";
|
|
||||||
|
|
||||||
for(int x = 0; x != logo->w; ++x) {
|
|
||||||
SDL_Rect srcrect = {x,0,1,logo->h};
|
|
||||||
SDL_Rect dstrect = {xpos+x,ypos,1,logo->h};
|
|
||||||
|
|
||||||
SDL_BlitSurface(logo,&srcrect,fb,&dstrect);
|
|
||||||
|
|
||||||
update_rect(dstrect);
|
|
||||||
|
|
||||||
if(!faded_in && (x%5) == 0) {
|
|
||||||
|
|
||||||
const bool new_button = key[SDLK_ESCAPE] || key[SDLK_SPACE] || key[SDLK_RETURN];
|
|
||||||
if(new_button && !last_button) {
|
|
||||||
faded_in = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
last_button = new_button;
|
|
||||||
|
|
||||||
screen.update_display();
|
|
||||||
|
|
||||||
SDL_Delay(10);
|
|
||||||
|
|
||||||
events::pump();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "logo faded in\n";
|
|
||||||
|
|
||||||
faded_in = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
TITLE_RESULT show_title(display& screen)
|
|
||||||
{
|
|
||||||
cursor::set(cursor::NORMAL);
|
|
||||||
|
|
||||||
const events::resize_lock prevent_resizing;
|
|
||||||
|
|
||||||
const scoped_sdl_surface title_surface_unscaled(image::get_image(game_config::game_title,image::UNSCALED));
|
|
||||||
const scoped_sdl_surface title_surface(scale_surface(title_surface_unscaled,screen.x(),screen.y()));
|
|
||||||
|
|
||||||
if(title_surface == NULL) {
|
|
||||||
std::cerr << "Could not find title image\n";
|
|
||||||
} else {
|
|
||||||
screen.blit_surface(0,0,title_surface);
|
|
||||||
update_rect(screen.screen_area());
|
|
||||||
|
|
||||||
std::cerr << "displayed title image\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
fade_logo(screen,(game_config::title_logo_x*screen.x())/1024,(game_config::title_logo_y*screen.y())/768);
|
|
||||||
|
|
||||||
std::cerr << "faded logo\n";
|
|
||||||
|
|
||||||
const std::string& version_str = string_table["version"] + " " +
|
|
||||||
game_config::version;
|
|
||||||
|
|
||||||
const SDL_Rect version_area = font::draw_text(NULL,screen.screen_area(),10,
|
|
||||||
font::NORMAL_COLOUR,version_str,0,0);
|
|
||||||
const size_t versiony = screen.y() - version_area.h;
|
|
||||||
|
|
||||||
if(versiony < size_t(screen.y())) {
|
|
||||||
font::draw_text(&screen,screen.screen_area(),
|
|
||||||
10,font::NORMAL_COLOUR,version_str,0,versiony);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "drew version number\n";
|
|
||||||
|
|
||||||
//members of this array must correspond to the enumeration TITLE_RESULT
|
|
||||||
static const std::string button_labels[] = { "tutorial_button", "campaign_button", "multiplayer_button",
|
|
||||||
"load_button", "language_button", "preferences", "about_button", "quit_button" };
|
|
||||||
|
|
||||||
static const size_t nbuttons = sizeof(button_labels)/sizeof(*button_labels);
|
|
||||||
|
|
||||||
const int menu_xbase = (game_config::title_buttons_x*screen.x())/1024;
|
|
||||||
const int menu_xincr = 0;
|
|
||||||
const int menu_ybase = (game_config::title_buttons_y*screen.y())/768;
|
|
||||||
const int menu_yincr = 40;
|
|
||||||
const int padding = game_config::title_buttons_padding;
|
|
||||||
|
|
||||||
std::vector<button> buttons;
|
|
||||||
size_t b, max_width = 0;
|
|
||||||
for(b = 0; b != nbuttons; ++b) {
|
|
||||||
buttons.push_back(button(screen,string_table[button_labels[b]]));
|
|
||||||
buttons.back().set_xy(menu_xbase + b*menu_xincr, menu_ybase + b*menu_yincr);
|
|
||||||
max_width = maximum<size_t>(max_width,buttons.back().width());
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string style = "mainmenu";
|
|
||||||
draw_dialog_frame(menu_xbase-padding,menu_ybase-padding,max_width+padding*2,menu_yincr*(nbuttons-1)+buttons.back().height()+padding*2,screen,&style);
|
|
||||||
|
|
||||||
for(b = 0; b != nbuttons; ++b) {
|
|
||||||
buttons.back().draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "drew buttons dialog\n";
|
|
||||||
|
|
||||||
CKey key;
|
|
||||||
|
|
||||||
bool last_escape = key[SDLK_ESCAPE];
|
|
||||||
|
|
||||||
update_whole_screen();
|
|
||||||
|
|
||||||
std::cerr << "entering interactive loop...\n";
|
|
||||||
|
|
||||||
for(;;) {
|
|
||||||
int mousex, mousey;
|
|
||||||
const int mouse_flags = SDL_GetMouseState(&mousex,&mousey);
|
|
||||||
const bool left_button = mouse_flags&SDL_BUTTON_LMASK;
|
|
||||||
|
|
||||||
for(size_t b = 0; b != buttons.size(); ++b) {
|
|
||||||
if(buttons[b].process(mousex,mousey,left_button)) {
|
|
||||||
return TITLE_RESULT(b);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!last_escape && key[SDLK_ESCAPE])
|
|
||||||
return QUIT_GAME;
|
|
||||||
|
|
||||||
last_escape = key[SDLK_ESCAPE];
|
|
||||||
|
|
||||||
screen.video().flip();
|
|
||||||
|
|
||||||
events::pump();
|
|
||||||
|
|
||||||
SDL_Delay(20);
|
|
||||||
}
|
|
||||||
|
|
||||||
return QUIT_GAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
} //end namespace gui
|
} //end namespace gui
|
||||||
|
|
|
@ -132,11 +132,6 @@ int show_dialog(display& screen, SDL_Surface* image,
|
||||||
|
|
||||||
network::connection network_data_dialog(display& disp, const std::string& msg, config& cfg, network::connection connection_num=0);
|
network::connection network_data_dialog(display& disp, const std::string& msg, config& cfg, network::connection connection_num=0);
|
||||||
|
|
||||||
enum TITLE_RESULT { TUTORIAL, NEW_CAMPAIGN, MULTIPLAYER, LOAD_GAME,
|
|
||||||
CHANGE_LANGUAGE, EDIT_PREFERENCES, SHOW_ABOUT, QUIT_GAME };
|
|
||||||
|
|
||||||
TITLE_RESULT show_title(display& screen);
|
|
||||||
|
|
||||||
void check_quit(display& screen);
|
void check_quit(display& screen);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
184
src/titlescreen.cpp
Normal file
184
src/titlescreen.cpp
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
#include "cursor.hpp"
|
||||||
|
#include "display.hpp"
|
||||||
|
#include "events.hpp"
|
||||||
|
#include "font.hpp"
|
||||||
|
#include "game_config.hpp"
|
||||||
|
#include "hotkeys.hpp"
|
||||||
|
#include "key.hpp"
|
||||||
|
#include "language.hpp"
|
||||||
|
#include "preferences.hpp"
|
||||||
|
#include "sdl_utils.hpp"
|
||||||
|
#include "show_dialog.hpp"
|
||||||
|
#include "titlescreen.hpp"
|
||||||
|
#include "util.hpp"
|
||||||
|
#include "video.hpp"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void fade_logo(display& screen, int xpos, int ypos)
|
||||||
|
{
|
||||||
|
const scoped_sdl_surface logo(image::get_image(game_config::game_logo,image::UNSCALED));
|
||||||
|
if(logo == NULL) {
|
||||||
|
std::cerr << "Could not find game logo\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Surface* const fb = screen.video().getSurface();
|
||||||
|
|
||||||
|
if(fb == NULL || xpos < 0 || ypos < 0 || xpos + logo->w > fb->w || ypos + logo->h > fb->h) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//only once, when the game is first started, the logo fades in
|
||||||
|
static bool faded_in = false;
|
||||||
|
|
||||||
|
CKey key;
|
||||||
|
bool last_button = key[SDLK_ESCAPE] || key[SDLK_SPACE];
|
||||||
|
|
||||||
|
std::cerr << "fading logo in....\n";
|
||||||
|
|
||||||
|
std::cerr << "logo size: " << logo->w << "," << logo->h << "\n";
|
||||||
|
|
||||||
|
for(int x = 0; x != logo->w; ++x) {
|
||||||
|
SDL_Rect srcrect = {x,0,1,logo->h};
|
||||||
|
SDL_Rect dstrect = {xpos+x,ypos,1,logo->h};
|
||||||
|
|
||||||
|
SDL_BlitSurface(logo,&srcrect,fb,&dstrect);
|
||||||
|
|
||||||
|
update_rect(dstrect);
|
||||||
|
|
||||||
|
if(!faded_in && (x%5) == 0) {
|
||||||
|
|
||||||
|
const bool new_button = key[SDLK_ESCAPE] || key[SDLK_SPACE] || key[SDLK_RETURN];
|
||||||
|
if(new_button && !last_button) {
|
||||||
|
faded_in = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
last_button = new_button;
|
||||||
|
|
||||||
|
screen.update_display();
|
||||||
|
|
||||||
|
SDL_Delay(10);
|
||||||
|
|
||||||
|
events::pump();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "logo faded in\n";
|
||||||
|
|
||||||
|
faded_in = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace gui {
|
||||||
|
|
||||||
|
TITLE_RESULT show_title(display& screen)
|
||||||
|
{
|
||||||
|
cursor::set(cursor::NORMAL);
|
||||||
|
|
||||||
|
const preferences::display_manager disp_manager(&screen);
|
||||||
|
const hotkey::basic_handler key_handler(&screen);
|
||||||
|
|
||||||
|
const video_change_detector disp_change_detector(screen.video());
|
||||||
|
|
||||||
|
const scoped_sdl_surface title_surface_unscaled(image::get_image(game_config::game_title,image::UNSCALED));
|
||||||
|
const scoped_sdl_surface title_surface(scale_surface(title_surface_unscaled,screen.x(),screen.y()));
|
||||||
|
|
||||||
|
if(title_surface == NULL) {
|
||||||
|
std::cerr << "Could not find title image\n";
|
||||||
|
} else {
|
||||||
|
screen.blit_surface(0,0,title_surface);
|
||||||
|
update_rect(screen.screen_area());
|
||||||
|
|
||||||
|
std::cerr << "displayed title image\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
fade_logo(screen,(game_config::title_logo_x*screen.x())/1024,(game_config::title_logo_y*screen.y())/768);
|
||||||
|
|
||||||
|
std::cerr << "faded logo\n";
|
||||||
|
|
||||||
|
const std::string& version_str = string_table["version"] + " " +
|
||||||
|
game_config::version;
|
||||||
|
|
||||||
|
const SDL_Rect version_area = font::draw_text(NULL,screen.screen_area(),10,
|
||||||
|
font::NORMAL_COLOUR,version_str,0,0);
|
||||||
|
const size_t versiony = screen.y() - version_area.h;
|
||||||
|
|
||||||
|
if(versiony < size_t(screen.y())) {
|
||||||
|
font::draw_text(&screen,screen.screen_area(),
|
||||||
|
10,font::NORMAL_COLOUR,version_str,0,versiony);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "drew version number\n";
|
||||||
|
|
||||||
|
//members of this array must correspond to the enumeration TITLE_RESULT
|
||||||
|
static const std::string button_labels[] = { "tutorial_button", "campaign_button", "multiplayer_button",
|
||||||
|
"load_button", "language_button", "preferences", "about_button", "quit_button" };
|
||||||
|
|
||||||
|
static const size_t nbuttons = sizeof(button_labels)/sizeof(*button_labels);
|
||||||
|
|
||||||
|
const int menu_xbase = (game_config::title_buttons_x*screen.x())/1024;
|
||||||
|
const int menu_xincr = 0;
|
||||||
|
const int menu_ybase = (game_config::title_buttons_y*screen.y())/768;
|
||||||
|
const int menu_yincr = 40;
|
||||||
|
const int padding = game_config::title_buttons_padding;
|
||||||
|
|
||||||
|
std::vector<button> buttons;
|
||||||
|
size_t b, max_width = 0;
|
||||||
|
for(b = 0; b != nbuttons; ++b) {
|
||||||
|
buttons.push_back(button(screen,string_table[button_labels[b]]));
|
||||||
|
buttons.back().set_xy(menu_xbase + b*menu_xincr, menu_ybase + b*menu_yincr);
|
||||||
|
max_width = maximum<size_t>(max_width,buttons.back().width());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string style = "mainmenu";
|
||||||
|
draw_dialog_frame(menu_xbase-padding,menu_ybase-padding,max_width+padding*2,menu_yincr*(nbuttons-1)+buttons.back().height()+padding*2,screen,&style);
|
||||||
|
|
||||||
|
for(b = 0; b != nbuttons; ++b) {
|
||||||
|
buttons.back().draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "drew buttons dialog\n";
|
||||||
|
|
||||||
|
CKey key;
|
||||||
|
|
||||||
|
bool last_escape = key[SDLK_ESCAPE];
|
||||||
|
|
||||||
|
update_whole_screen();
|
||||||
|
|
||||||
|
std::cerr << "entering interactive loop...\n";
|
||||||
|
|
||||||
|
for(;;) {
|
||||||
|
int mousex, mousey;
|
||||||
|
const int mouse_flags = SDL_GetMouseState(&mousex,&mousey);
|
||||||
|
const bool left_button = mouse_flags&SDL_BUTTON_LMASK;
|
||||||
|
|
||||||
|
for(size_t b = 0; b != buttons.size(); ++b) {
|
||||||
|
if(buttons[b].process(mousex,mousey,left_button)) {
|
||||||
|
return TITLE_RESULT(b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!last_escape && key[SDLK_ESCAPE])
|
||||||
|
return QUIT_GAME;
|
||||||
|
|
||||||
|
last_escape = key[SDLK_ESCAPE];
|
||||||
|
|
||||||
|
screen.video().flip();
|
||||||
|
|
||||||
|
events::pump();
|
||||||
|
|
||||||
|
//if the resolution has changed due to the user resizing the screen,
|
||||||
|
//or from changing between windowed and fullscreen
|
||||||
|
if(disp_change_detector.changed()) {
|
||||||
|
return CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Delay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
return QUIT_GAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
15
src/titlescreen.hpp
Normal file
15
src/titlescreen.hpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef TITLE_HPP_INCLUDED
|
||||||
|
#define TITLE_HPP_INCLUDED
|
||||||
|
|
||||||
|
#include "display.hpp"
|
||||||
|
|
||||||
|
namespace gui {
|
||||||
|
|
||||||
|
enum TITLE_RESULT { TUTORIAL = 0, NEW_CAMPAIGN, MULTIPLAYER, LOAD_GAME,
|
||||||
|
CHANGE_LANGUAGE, EDIT_PREFERENCES, SHOW_ABOUT, QUIT_GAME, CONTINUE };
|
||||||
|
|
||||||
|
TITLE_RESULT show_title(display& screen);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -77,4 +77,17 @@ private:
|
||||||
bool fake_screen;
|
bool fake_screen;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//a structure which will detect if the resolution or fullscreen mode has changed
|
||||||
|
struct video_change_detector {
|
||||||
|
video_change_detector(CVideo& video) : video_(video), full_(video.isFullScreen()), x_(video.getx()), y_(video.gety())
|
||||||
|
{}
|
||||||
|
|
||||||
|
bool changed() const { return full_ != video_.isFullScreen() || x_ != video_.getx() || y_ != video_.gety(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CVideo& video_;
|
||||||
|
bool full_;
|
||||||
|
int x_, y_;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue