2 #include "SDL_rotozoom.h"
9 static size_t game_handle_click(int xp
, int yp
, struct game_data_t
*data
,
10 struct smode_t
*smode
, struct theme_t
*theme
);
11 static void game_perform_click(int id
, enum loop_mode_t
*mode
,
12 enum game_mode_t
*gmode
);
13 static void free_resize_game(struct game_data_t
*data
);
15 void init_game(struct game_data_t
*data
, struct smode_t
*smode
,
16 struct font_t
*font
) {
18 data
->mode
= GMODE_NORMAL
;
21 resize_game_images(data
, smode
, font
);
25 void resize_game_images(struct game_data_t
*data
, struct smode_t
*smode
,
26 struct font_t
*font
) {
28 /*const SDL_Color white = {255, 255, 255, 0};*/
30 if(data
->loaded
) free_resize_game(data
);
32 data
->gui
.lastid
= (size_t)-1;
34 init_button(&data
->gui
.button
[0], font
->sans
, "Menu",
35 smode
->width
- smode
->width
/ 8, 0,
36 smode
->width
/ 8, smode
->height
/ 15);
38 init_button(&data
->gui
.menu
.button
[0], font
->sans
, "Return to game",
39 (smode
->width
- smode
->width
/ 3) / 2,
40 smode
->height
/ 8 /*+ smode->height / 15 * 0*/,
41 smode
->width
/ 3, smode
->height
/ 15);
42 init_button(&data
->gui
.menu
.button
[1], font
->sans
, "Exit to main menu",
43 (smode
->width
- smode
->width
/ 3) / 2,
44 smode
->height
/ 8 + smode
->height
/ 15 * 1.3,
45 smode
->width
/ 3, smode
->height
/ 15);
47 /*data->text.menu = TTF_RenderText_Blended(font->sans, "Menu", white);*/
50 void start_game(struct game_data_t
*data
) {
51 set_caption("Explore the Universe");
53 data
->mode
= GMODE_NORMAL
;
56 void game_event(SDL_Surface
*screen
, enum loop_mode_t
*mode
, SDL_Event
*event
,
57 struct game_data_t
*data
, struct smode_t
*smode
, struct font_t
*font
,
58 struct theme_t
*theme
) {
64 switch(event
->key
.keysym
.sym
) {
71 case SDL_MOUSEBUTTONDOWN
:
72 /*repaint = */ game_handle_click(event
->button
.x
, event
->button
.y
, data
, smode
,
75 case SDL_MOUSEBUTTONUP
:
76 if(smode
->button
.button
& SDL_BUTTON_LEFT
77 && event
->button
.button
== SDL_BUTTON_LEFT
) {
79 t
= game_handle_click(smode
->button
.xp
, smode
->button
.yp
, data
,
81 if(t
!= (size_t)-1 && t
== game_handle_click(event
->button
.x
,
82 event
->button
.y
, data
, smode
, theme
)) {
84 game_perform_click(t
, mode
, &data
->mode
);
89 smode
->button
.button
= 0;
92 t
= game_handle_click(event
->motion
.x
, event
->motion
.y
, data
,
94 if(data
->gui
.lastid
!= t
) {
102 case SDL_VIDEORESIZE
:
103 resize_game_images(data
, smode
, font
);
110 void paint_game(SDL_Surface
*screen
, struct game_data_t
*data
,
111 struct smode_t
*smode
, struct font_t
*font
, struct theme_t
*theme
) {
115 SDL_FillRect(screen
, NULL
, SDL_MapRGB(screen
->format
, 0, 0, 0));
117 /*blit_surface(screen, data->text.menu,
118 (smode->width - data->text.menu->w) / 2, smode->height / 10);*/
120 paint_button_array(screen
, smode
, theme
, data
->gui
.button
,
121 sizeof(data
->gui
.button
)/sizeof(*data
->gui
.button
));
123 if(data
->mode
== GMODE_MENU
) {
124 for(x
= 0; x
< sizeof(data
->gui
.menu
.button
)
125 / sizeof(*data
->gui
.menu
.button
); x
++) {
127 paint_button(screen
, smode
, theme
, &data
->gui
.menu
.button
[x
]);
131 paint_menu_fps(screen
, font
);
133 SDL_UpdateRect(screen
, 0, 0, 0, 0);
136 static size_t game_handle_click(int xp
, int yp
, struct game_data_t
*data
,
137 struct smode_t
*smode
, struct theme_t
*theme
) {
141 x
= handle_button_click(xp
, yp
, 0, data
->gui
.button
,
142 sizeof(data
->gui
.button
) / sizeof(*data
->gui
.button
));
143 if(x
!= (size_t)-1) return x
;
145 if(data
->mode
== GMODE_MENU
) {
146 x
= handle_button_click(xp
, yp
, 100, data
->gui
.menu
.button
,
147 sizeof(data
->gui
.menu
.button
) / sizeof(*data
->gui
.menu
.button
));
148 if(x
!= (size_t)-1) return x
;
154 static void game_perform_click(int id
, enum loop_mode_t
*mode
,
155 enum game_mode_t
*gmode
) {
162 *gmode
= GMODE_NORMAL
;
172 static void free_resize_game(struct game_data_t
*data
) {
173 free_button_array(data
->gui
.button
,
174 sizeof(data
->gui
.button
)/sizeof(*data
->gui
.button
));
176 free_button_array(data
->gui
.menu
.button
,
177 sizeof(data
->gui
.menu
.button
)/sizeof(*data
->gui
.menu
.button
));
180 void free_game(struct game_data_t
*data
) {
181 free_resize_game(data
);