-
Notifications
You must be signed in to change notification settings - Fork 0
/
SubWindows.cpp
162 lines (143 loc) · 4.19 KB
/
SubWindows.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include"SubWindows.h"
extern int g_score;
extern bool g_game_active;
extern bool g_game_restart;
extern std::string g_name;
Record::Record(int a, int b,int ff,int fs, std::string n) :Fl_Widget(a, b, a, b),
x(a), y(b),font_face(ff),font_size(fs), name(n){}
void Record::draw() {
fl_color(fc);
fl_font(font_face, font_size);
fl_draw(name.c_str(), x, y);
}
void Record::set_color(Fl_Color c) {
fc = c;
}
Start_window::Start_window(int a, int b, int w, int h) :Fl_Window(a, b-30, w, h),
x(a), y(b), width(w), backround(a, b, w, h),
start(470, 500, 280, 60, "Start Game")
{
g_game_active = false;
start.callback(cb_start, this);
start.labelsize(40);
start.labelfont(5);
start.labelcolor(fc);
start.box(FL_PLASTIC_UP_FRAME);
start.color(FL_DARK_BLUE);
title.set_color(fc);
instr1.set_color(fc);
instr2.set_color(fc);
instr3.set_color(fc);
clear_border(); //Prevents closing the window by control bar which wont make the game start
show();
}
void Start_window::start_game() {
g_game_active = true;
this->hide();
}
Highscores::Highscores(int a, int b, int w, int h, const char* title) :Fl_Window(a, b, w, h, title),
x(a), y(b), width(w), backround(a, b, w, h),
cont(430, 700, 280, 60, "Continue")
{ //the constructor loads data from the textfile and draws it on the screen
cont.callback(cb_cont, this);
cont.labelsize(40);
cont.labelfont(5);
cont.labelcolor(fc);
cont.box(FL_PLASTIC_UP_FRAME);
cont.color(FL_DARK_BLUE);
hs_title.set_color(fc);
std::vector<std::string>data;
std::ifstream ifs{ "Highscores.txt" };
std::string name;
int score = 0;
int place = 1;
while (ifs) {
ifs >> name >> score;
std::stringstream ss;
int range = 45 - name.length();
ss <<place<<". "<< name << std::setw(range) << std::setfill('.') << score; //range takes care of having each record of same line-length
data.push_back(ss.str());
++place;
}
for (unsigned int i = 0; i < 10; ++i) {
std::string table = data[i];
if(i==9){
Record* r = new Record{ x + 250,y + 150 + (50 * (int)i),5,19,table.c_str() };
r->set_color(fc);
}
else {
Record* r = new Record{ x + 260,y + 150 + (50 * (int)i),5,19,table.c_str() };
r->set_color(fc);
}
}
clear_border(); //Prevents closing the window by control bar which wont make the game continue
show();
}
void Highscores::continue_game() {
g_game_active = true;
this->hide();
}
Game_Over::Game_Over(int a, int b, int w, int h, const char* title) :Fl_Window(a, b, w, h),
x(a), y(b), width(w), backround(a, b, w, h),
cont( 300,500,250,60,"Continue" ),
quit( 625,500,200,60,"Quit" ),
enter_name( 565,400,210,30,"Enter your name" )
{
cont.callback(cb_cont, this);
cont.labelsize(40);
cont.labelfont(5);
cont.labelcolor(fc);
cont.box(FL_PLASTIC_UP_FRAME);
cont.color(FL_DARK_BLUE);
quit.callback(cb_quit, this);
quit.labelsize(40);
quit.labelfont(5);
quit.labelcolor(fc);
quit.box(FL_PLASTIC_UP_FRAME);
quit.color(FL_DARK_BLUE);
enter_name.labelsize(40);
enter_name.labelfont(5);
enter_name.labelcolor(fc);
go_title.set_color(fc);
Record* r1 = new Record{ 200,325,5,60,"Your Score" };
r1->set_color(fc);
char points[50];
sprintf_s(points, "%d", g_score);
Record* r3 = new Record{ 730,325,5,90,points };
r3->set_color(fc);
clear_border();
show();
}
void Game_Over::continue_game() {
g_game_restart = true;
save_score();
this->hide();
}
void Game_Over::quit_game() {
save_score();
exit(0);
}
void Game_Over::save_score() { //Loads existing data for txt file and adds current score and payer name, if the player score well enough to be in the Top 10
std::vector<std::pair<int,std::string>>data;
std::ifstream ifs{ "Highscores.txt" };
std::string name;
int score = 0;
while (ifs) {
ifs >> name >> score;
data.emplace_back(score,name);
}
g_name = enter_name.value();
if (g_name.empty())g_name = "unknown";
std::string table;
for (unsigned int i = 0; i < g_name.size(); ++i) {
if (isspace(g_name[i]))table += "_";
else table += g_name[i];
if (table.length() == 32)break;
}
g_name = table;
data.emplace_back(g_score, g_name);
sort(data.begin(), data.end());
reverse(data.begin(), data.end());
std::ofstream ofs{ "Highscores.txt" };
for (int i = 0; i < 10; ++i) ofs << data[i].second << " " << data[i].first << '\n';
}