MBC7 mouse control in SDL
This commit is contained in:
parent
979d32faed
commit
24796acccf
37
SDL/gui.c
37
SDL/gui.c
@ -1155,9 +1155,20 @@ void connect_joypad(void)
|
||||
}
|
||||
}
|
||||
|
||||
static void toggle_mouse_control(unsigned index)
|
||||
{
|
||||
configuration.allow_mouse_controls = !configuration.allow_mouse_controls;
|
||||
}
|
||||
|
||||
const char *mouse_control_string(unsigned index)
|
||||
{
|
||||
return configuration.allow_mouse_controls? "Allow mouse control" : "Disallow mouse control";
|
||||
}
|
||||
|
||||
static const struct menu_item controls_menu[] = {
|
||||
{"Keyboard Options", enter_keyboard_menu},
|
||||
{"Joypad Options", enter_joypad_menu},
|
||||
{"Motion-controlled games:", toggle_mouse_control, mouse_control_string, toggle_mouse_control},
|
||||
{"Back", return_to_root_menu},
|
||||
{NULL,}
|
||||
};
|
||||
@ -1234,6 +1245,22 @@ static void toggle_audio_recording(unsigned index)
|
||||
}
|
||||
}
|
||||
|
||||
void convert_mouse_coordinates(signed *x, signed *y)
|
||||
{
|
||||
signed width = GB_get_screen_width(&gb);
|
||||
signed height = GB_get_screen_height(&gb);
|
||||
signed x_offset = (width - 160) / 2;
|
||||
signed y_offset = (height - 144) / 2;
|
||||
|
||||
*x = (signed)(*x - rect.x / factor) * width / (signed)(rect.w / factor) - x_offset;
|
||||
*y = (signed)(*y - rect.y / factor) * height / (signed)(rect.h / factor) - y_offset;
|
||||
|
||||
if (strcmp("CRT", configuration.filter) == 0) {
|
||||
*y = *y * 8 / 7;
|
||||
*y -= 144 / 16;
|
||||
}
|
||||
}
|
||||
|
||||
void run_gui(bool is_running)
|
||||
{
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
@ -1296,13 +1323,9 @@ void run_gui(bool is_running)
|
||||
event.key.keysym.scancode = SDL_SCANCODE_ESCAPE;
|
||||
}
|
||||
else if (gui_state == SHOWING_MENU) {
|
||||
signed x = (event.button.x - rect.x / factor) * width / (rect.w / factor) - x_offset;
|
||||
signed y = (event.button.y - rect.y / factor) * height / (rect.h / factor) - y_offset;
|
||||
|
||||
if (strcmp("CRT", configuration.filter) == 0) {
|
||||
y = y * 8 / 7;
|
||||
y -= 144 / 16;
|
||||
}
|
||||
signed x = event.button.x;
|
||||
signed y = event.button.y;
|
||||
convert_mouse_coordinates(&x, &y);
|
||||
y += scroll;
|
||||
|
||||
if (x < 0 || x >= 160 || y < 24) {
|
||||
|
@ -123,6 +123,9 @@ typedef struct {
|
||||
|
||||
/* v0.14.4 */
|
||||
bool osd;
|
||||
|
||||
/* v0.15 */
|
||||
bool allow_mouse_controls;
|
||||
} configuration_t;
|
||||
|
||||
extern configuration_t configuration;
|
||||
@ -149,5 +152,6 @@ void show_osd_text(const char *text);
|
||||
extern const char *osd_text;
|
||||
extern unsigned osd_countdown;
|
||||
extern unsigned osd_text_lines;
|
||||
void convert_mouse_coordinates(signed *x, signed *y);
|
||||
|
||||
#endif
|
||||
|
19
SDL/main.c
19
SDL/main.c
@ -242,6 +242,25 @@ static void handle_events(GB_gameboy_t *gb)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
case SDL_MOUSEBUTTONUP: {
|
||||
if (GB_has_accelerometer(gb) && configuration.allow_mouse_controls) {
|
||||
GB_set_key_state(gb, GB_KEY_A, event.type == SDL_MOUSEBUTTONDOWN);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_MOUSEMOTION: {
|
||||
if (GB_has_accelerometer(gb) && configuration.allow_mouse_controls) {
|
||||
signed x = event.motion.x;
|
||||
signed y = event.motion.y;
|
||||
convert_mouse_coordinates(&x, &y);
|
||||
x = SDL_max(SDL_min(x, 160), 0);
|
||||
y = SDL_max(SDL_min(y, 144), 0);
|
||||
GB_set_accelerometer_values(gb, (x - 80) / -80.0, (y - 72) / -72.0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SDL_JOYBUTTONUP:
|
||||
case SDL_JOYBUTTONDOWN: {
|
||||
|
Loading…
Reference in New Issue
Block a user