コード例 #1
0
ファイル: input.cpp プロジェクト: hogdog375/nestopia
void input_match_joystick(Input::Controllers *controllers, SDL_Event event) {
	// Match NES buttons to joystick input
	int j;
	
	nesinput_t input, reverseinput;
	
	input.nescode = 0x00;
	input.player = 0;
	input.pressed = 0;
	input.turboa = 0;
	input.turbob = 0;
	
	// This is for releasing opposing directions
	reverseinput.nescode = 0x00;
	reverseinput.player = 0;
	reverseinput.pressed = 0;
	
	SDL_Event buttons[TOTALBUTTONS] = {
		player[0].ju, player[0].jd, player[0].jl, player[0].jr,
		player[0].jselect, player[0].jstart, player[0].ja, player[0].jb,
		player[0].jta, player[0].jtb,
		
		player[1].ju, player[1].jd, player[1].jl, player[1].jr,
		player[1].jselect, player[1].jstart, player[1].ja, player[1].jb,
		player[1].jta, player[1].jtb
	};
	
	switch(event.type) {
		// Handle button input
		case SDL_JOYBUTTONUP:
		case SDL_JOYBUTTONDOWN:
			for (j = 0; j < TOTALBUTTONS; j++) {
				if (buttons[j].jbutton.button == event.jbutton.button
					&& buttons[j].jbutton.which == event.jbutton.which) {
					input.nescode = nescodes[j];
					if (j >= NUMBUTTONS) { input.player = 1; }
					// This is really dirty
					if (j == 8 || j == 18) { input.turboa = 1; }
					if (j == 9 || j == 19) { input.turbob = 1; }
				}
			}
			input.pressed = event.jbutton.state;
			break;
		
		// Handling hat input can be a lot of fun if you like pain
		case SDL_JOYHATMOTION:
			unsigned char hu, hd, hl, hr;
			hu = hd = hl = hr = 0;
			
			// Start a loop to check if input matches
			for (j = 0; j < TOTALBUTTONS; j++) {
				
				// Read value of each hat direction on current hat
				if (buttons[j].type == event.type
					&& buttons[j].jhat.which == event.jhat.which
					&& buttons[j].jhat.hat == event.jhat.hat) {
					if (j >= NUMBUTTONS) { input.player = reverseinput.player = 1; }

					// Find the values at each hat position on the current hat
					if (buttons[j].jhat.value == SDL_HAT_UP) { hu = nescodes[j]; }
					else if (buttons[j].jhat.value == SDL_HAT_DOWN) { hd = nescodes[j]; }
					else if (buttons[j].jhat.value == SDL_HAT_LEFT) { hl = nescodes[j]; }
					else if (buttons[j].jhat.value == SDL_HAT_RIGHT) { hr = nescodes[j]; }
					
					input.pressed = 1;
					
					// Make sure opposing hat positions are turned off
					switch(event.jhat.value) {
						case SDL_HAT_UP:
							input.nescode |= hu;
							reverseinput.nescode |= hd |= hl |= hr;
							break;
						case SDL_HAT_LEFTUP:
							input.nescode |= hu |= hl;
							reverseinput.nescode |= hd |= hr;
							break;
						case SDL_HAT_RIGHTUP:
							input.nescode |= hu |= hr;
							reverseinput.nescode |= hd |= hl;
							break;
						case SDL_HAT_DOWN:
							input.nescode |= hd;
							reverseinput.nescode |= hu |= hl |= hr;
							break;
						case SDL_HAT_LEFTDOWN:
							input.nescode |= hd |= hl;
							reverseinput.nescode |= hu |= hr;
							break;
						case SDL_HAT_RIGHTDOWN:
							input.nescode |= hd |= hr;
							reverseinput.nescode |= hu |= hl;
							break;
						case SDL_HAT_LEFT:
							input.nescode |= hl;
							reverseinput.nescode |= hr |= hu |= hd;
							break;
						case SDL_HAT_RIGHT:
							input.nescode |= hr;
							reverseinput.nescode |= hl |= hu |= hd;
							break;
						default:
							input.nescode |= hu |= hd |= hl |= hr;
							break;
					}
				}
			}
			break;

		// Handle axis input
		case SDL_JOYAXISMOTION:
			for (j = 0; j < TOTALBUTTONS; j++) {
				
				int nvalue = input_checksign(event.jaxis.value);

				if (buttons[j].jaxis.axis == event.jaxis.axis
					&& buttons[j].jaxis.which == event.jaxis.which
					&& buttons[j].jaxis.type == event.jaxis.type
					&& buttons[j].jaxis.value == nvalue) {

					if (j >= NUMBUTTONS) { input.player = reverseinput.player = 1; }
					
					input.nescode = nescodes[j];
				}

				if (buttons[j].jaxis.axis == event.jaxis.axis
					&& buttons[j].jaxis.which == event.jaxis.which
					&& buttons[j].jaxis.type == event.jaxis.type
					&& buttons[j].jaxis.value == !nvalue) {
					
					reverseinput.nescode = nescodes[j];
				}

				if (abs(event.jaxis.value) > DEADZONE) { input.pressed = 1; }
			}
			break;
			
		default: break;
	}
	
	input_inject(controllers, reverseinput);
	input_inject(controllers, input);
}
コード例 #2
0
ファイル: input.cpp プロジェクト: hogdog375/nestopia
void input_match_keyboard(Input::Controllers *controllers, SDL_Event event) {
	// Match NES buttons to keyboard buttons
	
	nesinput_t input;

	input.nescode = 0x00;
	input.player = 0;
	input.pressed = 0;
	input.turboa = 0;
	input.turbob = 0;

	if (event.type == SDL_KEYDOWN) { input.pressed = 1; }

	for (int i = 0; i < NUMGAMEPADS; i++) {
		if (player[i].u == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::UP;
			input.player = i;
		}
		else if (player[i].d == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::DOWN;
			input.player = i;
		}
		else if (player[i].l == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::LEFT;
			input.player = i;
		}
		else if (player[i].r == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::RIGHT;
			input.player = i;
		}
		else if (player[i].select == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::SELECT;
			input.player = i;
		}
		else if (player[i].start == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::START;
			input.player = i;
		}
		else if (player[i].a == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::A;
			input.player = i;
		}
		else if (player[i].b == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::B;
			input.player = i;
		}
		else if (player[i].ta == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::A;
			input.player = i;
			input.turboa = 1;
		}
		else if (player[i].tb == event.key.keysym.scancode) {
			input.nescode = Input::Controllers::Pad::B;
			input.player = i;
			input.turbob = 1;
		}
	}

	input_inject(controllers, input);
	
	if (event.key.keysym.scancode == SDL_SCANCODE_GRAVE && event.type == SDL_KEYDOWN) { timing_set_altspeed(); }
	if (event.key.keysym.scancode == SDL_SCANCODE_GRAVE && event.type == SDL_KEYUP) { timing_set_default(); }
	
	const Uint8 *keys = SDL_GetKeyboardState(NULL);
	
	// Process non-game events
	if (keys[SDL_SCANCODE_F1]) { nst_flip_disk(); }
	if (keys[SDL_SCANCODE_F2]) { nst_reset(0); }
	//if (keys[SDL_SCANCODE_F3]) {  }
	//if (keys[SDL_SCANCODE_F4]) {  }
	if (keys[SDL_SCANCODE_F5]) { nst_state_quicksave(0); }
	if (keys[SDL_SCANCODE_F6]) { nst_state_quicksave(1); }
	if (keys[SDL_SCANCODE_F7]) { nst_state_quickload(0); }
	if (keys[SDL_SCANCODE_F8]) { nst_state_quickload(1); }
	//if (keys[SDL_SCANCODE_F9]) {  }
	//if (keys[SDL_SCANCODE_F10]) {  }
	//if (keys[SDL_SCANCODE_F11]) {  }
	//if (keys[SDL_SCANCODE_F12]) {  }
	
	// Insert Coins
	controllers->vsSystem.insertCoin = 0;
	if (keys[SDL_SCANCODE_1]) { controllers->vsSystem.insertCoin |= Input::Controllers::VsSystem::COIN_1; }
	if (keys[SDL_SCANCODE_2]) { controllers->vsSystem.insertCoin |= Input::Controllers::VsSystem::COIN_2; }
	
	// Rewinder
	if (keys[SDL_SCANCODE_BACKSPACE]) { nst_set_rewind(0); }
	if (keys[SDL_SCANCODE_BACKSLASH]) { nst_set_rewind(1); }
	
	// Escape exits when not in GUI mode
	if (keys[SDL_SCANCODE_ESCAPE]) {
		if (conf.misc_disable_gui) { nst_schedule_quit(); }
	}
	
	// F toggles fullscreen
	if (keys[SDL_SCANCODE_F]) { video_toggle_fullscreen(); }
	if (keys[SDL_SCANCODE_T]) { video_toggle_filter(); }
	if (keys[SDL_SCANCODE_G]) { video_toggle_scalefactor(); }
}
コード例 #3
0
ファイル: input.cpp プロジェクト: TaylanUB/nestopia
void input_match_keyboard(Input::Controllers *controllers, SDL_Event event) {
    // Match NES buttons to keyboard buttons

    nesinput_t input;

    input.nescode = 0x00;
    input.player = 0;
    input.pressed = 0;
    input.turboa = 0;
    input.turbob = 0;

    if (event.type == SDL_KEYDOWN) {
        input.pressed = 1;
    }

    for (int i = 0; i < NUMGAMEPADS; i++) {
        if (player[i].u == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::UP;
            input.player = i;
        }
        else if (player[i].d == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::DOWN;
            input.player = i;
        }
        else if (player[i].l == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::LEFT;
            input.player = i;
        }
        else if (player[i].r == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::RIGHT;
            input.player = i;
        }
        else if (player[i].select == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::SELECT;
            input.player = i;
        }
        else if (player[i].start == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::START;
            input.player = i;
        }
        else if (player[i].a == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::A;
            input.player = i;
        }
        else if (player[i].b == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::B;
            input.player = i;
        }
        else if (player[i].ta == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::A;
            input.player = i;
            input.turboa = 1;
        }
        else if (player[i].tb == event.key.keysym.scancode) {
            input.nescode = Input::Controllers::Pad::B;
            input.player = i;
            input.turbob = 1;
        }
    }

    input_inject(controllers, input);

    if (event.key.keysym.scancode == ui.altspeed && event.type == SDL_KEYDOWN) {
        timing_set_altspeed();
    }
    if (event.key.keysym.scancode == ui.altspeed && event.type == SDL_KEYUP) {
        timing_set_default();
    }

    const Uint8 *keys = SDL_GetKeyboardState(NULL);

    // Insert Coins
    controllers->vsSystem.insertCoin = 0;
    if (keys[ui.insertcoin1]) {
        controllers->vsSystem.insertCoin |= Input::Controllers::VsSystem::COIN_1;
    }
    if (keys[ui.insertcoin2]) {
        controllers->vsSystem.insertCoin |= Input::Controllers::VsSystem::COIN_2;
    }

    // Process non-game events
    if (keys[ui.fdsflip]) {
        nst_flip_disk();
    }
    if (keys[ui.fdsswitch]) {
        nst_switch_disk();
    }
    if (keys[ui.qsave1]) {
        nst_state_quicksave(0);
    }
    if (keys[ui.qsave2]) {
        nst_state_quicksave(1);
    }
    if (keys[ui.qload1]) {
        nst_state_quickload(0);
    }
    if (keys[ui.qload2]) {
        nst_state_quickload(1);
    }

    // Screenshot
    if (keys[ui.screenshot]) {
        video_screenshot(NULL);
    }

    // Reset
    if (keys[ui.reset]) {
        nst_reset(0);
    }

    // Rewinder
    if (keys[ui.rwstart]) {
        nst_set_rewind(0);
    }
    if (keys[ui.rwstop]) {
        nst_set_rewind(1);
    }

    // Video
    if (keys[ui.fullscreen]) {
        video_toggle_fullscreen();
    }
    if (keys[ui.filter]) {
        video_toggle_filter();
    }
    if (keys[ui.scalefactor]) {
        video_toggle_scalefactor();
    }

    // NSF
    if (nst_nsf) {
        Nsf nsf(emulator);

        if (keys[SDL_SCANCODE_UP]) {
            nsf.PlaySong();
            video_clear_buffer();
            video_disp_nsf();
        }
        if (keys[SDL_SCANCODE_DOWN]) {
            //nsf.StopSong();
        }
        if (keys[SDL_SCANCODE_LEFT]) {
            nsf.SelectPrevSong();
            video_clear_buffer();
            video_disp_nsf();
        }
        if (keys[SDL_SCANCODE_RIGHT]) {
            nsf.SelectNextSong();
            video_clear_buffer();
            video_disp_nsf();
        }
    }

    // Escape exits when not in GUI mode
    if (keys[SDL_SCANCODE_ESCAPE]) {
        if (conf.misc_disable_gui) {
            nst_schedule_quit();
        }
    }
}