42 |
{ |
{ |
43 |
class GameMenu : public gui::Menu { |
class GameMenu : public gui::Menu { |
44 |
public: |
public: |
45 |
GameMenu(); |
GameMenu(int zoomxpos_, int zoomypos_); |
46 |
|
virtual ~GameMenu(); |
47 |
private: |
private: |
48 |
bool on_event (const SDL_Event &e); |
bool on_event (const SDL_Event &e); |
49 |
void on_action(gui::Widget *w); |
void on_action(gui::Widget *w); |
50 |
|
void draw_background(px::GC &gc); |
51 |
|
|
52 |
gui::Widget *resume, *restart, *options, *abort; |
gui::Widget *resume, *restart, *options, *abort; |
53 |
|
px::Surface *zoomed; |
54 |
|
int zoomxpos, zoomypos; // position to be zoomed |
55 |
}; |
}; |
56 |
|
|
57 |
class Game { |
class Game { |
109 |
// GameMenu impl |
// GameMenu impl |
110 |
//---------------------------------------- |
//---------------------------------------- |
111 |
|
|
112 |
GameMenu::GameMenu() |
GameMenu::GameMenu(int zoomxpos_, int zoomypos_) |
113 |
: resume(new gui::TextButton("Resume Level", this)), |
: resume(new gui::TextButton("Resume Level", this)), |
114 |
restart(new gui::TextButton("Restart Level", this)), |
restart(new gui::TextButton("Restart Level", this)), |
115 |
options(new gui::TextButton("Options", this)), |
options(new gui::TextButton("Options", this)), |
116 |
abort(new gui::TextButton("Abort Level", this)) |
abort(new gui::TextButton("Abort Level", this)), |
117 |
|
zoomed(0), |
118 |
|
zoomxpos(zoomxpos_), |
119 |
|
zoomypos(zoomypos_) |
120 |
{ |
{ |
121 |
add(resume, Rect(0,0,150,40)); |
add(resume, Rect(0,0,150,40)); |
122 |
add(restart, Rect(0,45,150,40)); |
add(restart, Rect(0,45,150,40)); |
125 |
center(video::GetScreen()); |
center(video::GetScreen()); |
126 |
} |
} |
127 |
|
|
128 |
|
GameMenu::~GameMenu() { |
129 |
|
delete(zoomed); |
130 |
|
} |
131 |
|
|
132 |
|
void |
133 |
|
GameMenu::draw_background(px::GC &gc) { |
134 |
|
if (!zoomed) { |
135 |
|
const int PART = 3; |
136 |
|
const int WIDTH = 640; |
137 |
|
const int SCREEN_HEIGHT = 480; |
138 |
|
const int INVENTORY_HEIGHT = 64; |
139 |
|
const int GAME_HEIGHT = SCREEN_HEIGHT-INVENTORY_HEIGHT; |
140 |
|
const int PART_WIDTH = WIDTH/PART; |
141 |
|
const int PART_HEIGHT = SCREEN_HEIGHT/PART; |
142 |
|
|
143 |
|
// randomly choose upper-left corner (zoomxypos is always visible) |
144 |
|
int x = zoomxpos - IntegerRand(16, PART_WIDTH-16-1); |
145 |
|
int y = zoomypos - IntegerRand(16, PART_HEIGHT-16-1); |
146 |
|
|
147 |
|
x = min(max(0, x), WIDTH-(PART_WIDTH+16-1)); |
148 |
|
y = min(max(0, y), GAME_HEIGHT-(PART_HEIGHT+16-1)); |
149 |
|
|
150 |
|
x = (x/32)*32+24; |
151 |
|
y = (y/32)*32+16; |
152 |
|
|
153 |
|
Surface back(video::GetScreen()->get_surface()); |
154 |
|
Rect src_area(x, y, PART_WIDTH, PART_HEIGHT); |
155 |
|
Surface *src = Grab(&back, src_area); |
156 |
|
|
157 |
|
// zoom 3 times to get softer image : |
158 |
|
{ |
159 |
|
Surface *zoom1 = src->zoom(WIDTH/3, SCREEN_HEIGHT/3); |
160 |
|
Surface *zoom2 = src->zoom(WIDTH/6, SCREEN_HEIGHT/6); |
161 |
|
zoomed = zoom1->zoom(WIDTH, SCREEN_HEIGHT); |
162 |
|
delete zoom2; |
163 |
|
delete zoom1; |
164 |
|
} |
165 |
|
delete src; |
166 |
|
} |
167 |
|
|
168 |
|
px::blit(gc, 0,0, zoomed); |
169 |
|
} |
170 |
|
|
171 |
bool |
bool |
172 |
GameMenu::on_event (const SDL_Event &e) { |
GameMenu::on_event (const SDL_Event &e) { |
173 |
if (e.type == SDL_MOUSEBUTTONDOWN |
if (e.type == SDL_MOUSEBUTTONDOWN |
195 |
} |
} |
196 |
else if (w == options) |
else if (w == options) |
197 |
{ |
{ |
198 |
GUI_OptionsMenu(); |
GUI_OptionsMenu(zoomed); |
199 |
if (options::MustRestartLevel) { |
if (options::MustRestartLevel) { |
200 |
options::MustRestartLevel = false; |
options::MustRestartLevel = false; |
201 |
enigma::RestartGame(); |
enigma::RestartGame(); |
726 |
sdl::TempInputGrab grab(SDL_GRAB_OFF); |
sdl::TempInputGrab grab(SDL_GRAB_OFF); |
727 |
|
|
728 |
video::ShowMouse(); |
video::ShowMouse(); |
729 |
GameMenu().manage(screen); |
{ |
730 |
|
int x, y; |
731 |
|
display::GetReferencePointCoordinates(&x, &y); |
732 |
|
GameMenu(x, y).manage(screen); |
733 |
|
} |
734 |
video::HideMouse(); |
video::HideMouse(); |
735 |
update_mouse_button_state(); |
update_mouse_button_state(); |
736 |
last_tick_time = SDL_GetTicks(); |
last_tick_time = SDL_GetTicks(); |