fix gamepad

This commit is contained in:
ShirosakiMio 2024-04-06 12:35:25 +08:00
parent d64716f57b
commit b1cde42602
6 changed files with 127 additions and 7 deletions

View File

@ -176,6 +176,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.github.Mathias-Boulay:android_gamepad_remapper:06184ddbce'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

View File

@ -15,7 +15,11 @@ import com.tungsten.fclauncher.keycodes.GamepadKeycodeMap;
import java.util.HashMap;
public class FCLInput implements View.OnCapturedPointerListener {
import fr.spse.gamepad_remapper.GamepadHandler;
import fr.spse.gamepad_remapper.RemapperManager;
import fr.spse.gamepad_remapper.RemapperView;
public class FCLInput implements View.OnCapturedPointerListener, GamepadHandler {
public static final int MOUSE_LEFT = 1000;
public static final int MOUSE_MIDDLE = 1001;
@ -35,6 +39,9 @@ public class FCLInput implements View.OnCapturedPointerListener {
private Choreographer choreographer;
private float lastXAxis;
private float lastYAxis;
private RemapperManager remapperManager;
private boolean leftTriggerDown = false;
private boolean rightTriggerDown = false;
public static final HashMap<Integer, Integer> MOUSE_MAP = new HashMap<Integer, Integer>() {
@ -68,6 +75,7 @@ public class FCLInput implements View.OnCapturedPointerListener {
this.screenWidth = AndroidUtils.getScreenWidth(FCLApplication.getCurrentActivity());
this.screenHeight = AndroidUtils.getScreenHeight(FCLApplication.getCurrentActivity());
resetMapper();
}
public void setPointer(int x, int y, String id) {
@ -210,11 +218,7 @@ public class FCLInput implements View.OnCapturedPointerListener {
}
}
if (event.getDevice() != null && ((event.getSource() & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)) {
if (event.getRepeatCount() == 0) {
int converted = GamepadKeycodeMap.convert(event.getKeyCode());
sendKeyEvent(converted, event.getAction() == KeyEvent.ACTION_DOWN);
}
return true;
return remapperManager.handleKeyEventInput(((GameMenu) menu).getActivity(),event,this);
}
if ((event.getFlags() & KeyEvent.FLAG_SOFT_KEYBOARD) == KeyEvent.FLAG_SOFT_KEYBOARD) {
if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)
@ -256,6 +260,7 @@ public class FCLInput implements View.OnCapturedPointerListener {
};
choreographer.postFrameCallback(frameCallback);
}
remapperManager.handleMotionEventInput(((GameMenu) menu).getActivity(),event,this);
if (event.getAction() == MotionEvent.ACTION_MOVE) {
handleDPad(event);
handleLeftJoyStick(event);
@ -340,5 +345,78 @@ public class FCLInput implements View.OnCapturedPointerListener {
doTick();
}
}
public void resetMapper() {
remapperManager = new RemapperManager(((GameMenu) menu).getActivity(), new RemapperView.Builder(null)
.remapA(true)
.remapB(true)
.remapX(true)
.remapY(true)
.remapLeftJoystick(true)
.remapRightJoystick(true)
.remapStart(true)
.remapSelect(true)
.remapLeftShoulder(true)
.remapRightShoulder(true)
.remapLeftTrigger(true)
.remapRightTrigger(true));
}
/**
* Function handling all gamepad actions.
*
* @param code Either a keycode (Eg. KEYBODE_BUTTON_A), either an axis (Eg. AXIS_HAT_X)
* @param value For keycodes, 0 for released state, 1 for pressed state.
* For Axis, the value of the axis. Varies between 0/1 or -1/1 depending on the axis.
*/
@Override
public void handleGamepadInput(int code, float value) {
boolean isKeyDown = value == 1f;
switch (code) {
case KeyEvent.KEYCODE_BUTTON_A:
case KeyEvent.KEYCODE_BUTTON_B:
case KeyEvent.KEYCODE_BUTTON_X:
case KeyEvent.KEYCODE_BUTTON_Y:
//Shoulders
case KeyEvent.KEYCODE_BUTTON_L1:
case KeyEvent.KEYCODE_BUTTON_R1:
//Triggers
case KeyEvent.KEYCODE_BUTTON_L2:
case KeyEvent.KEYCODE_BUTTON_R2:
//L3 || R3
case KeyEvent.KEYCODE_BUTTON_THUMBL:
case KeyEvent.KEYCODE_BUTTON_THUMBR:
//DPAD
case KeyEvent.KEYCODE_DPAD_UP:
case KeyEvent.KEYCODE_DPAD_DOWN:
case KeyEvent.KEYCODE_DPAD_LEFT:
case KeyEvent.KEYCODE_DPAD_RIGHT:
case KeyEvent.KEYCODE_DPAD_CENTER:
//Start/select
case KeyEvent.KEYCODE_BUTTON_START:
case KeyEvent.KEYCODE_BUTTON_SELECT:
sendKeyEvent(GamepadKeycodeMap.convert(code), isKeyDown);
break;
// Triggers
case MotionEvent.AXIS_LTRIGGER:
if (!leftTriggerDown && value > 0.5) {
leftTriggerDown = true;
sendKeyEvent(GamepadKeycodeMap.convert(KeyEvent.KEYCODE_BUTTON_L2), leftTriggerDown);
} else if (leftTriggerDown && value < 0.5) {
leftTriggerDown = false;
sendKeyEvent(GamepadKeycodeMap.convert(KeyEvent.KEYCODE_BUTTON_L2), leftTriggerDown);
}
break;
case MotionEvent.AXIS_RTRIGGER:
if (!rightTriggerDown && value > 0.5) {
rightTriggerDown = true;
sendKeyEvent(GamepadKeycodeMap.convert(KeyEvent.KEYCODE_BUTTON_R2), rightTriggerDown);
} else if (rightTriggerDown && value < 0.5) {
rightTriggerDown = false;
sendKeyEvent(GamepadKeycodeMap.convert(KeyEvent.KEYCODE_BUTTON_R2), rightTriggerDown);
}
break;
default:
break;
}
}
}

View File

@ -74,6 +74,8 @@ import java.util.UUID;
import java.util.logging.Level;
import java.util.stream.Collectors;
import fr.spse.gamepad_remapper.Remapper;
public class GameMenu implements MenuCallback, View.OnClickListener {
private boolean simulated;
@ -108,6 +110,7 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
private FCLButton openMultiplayerMenu;
private FCLButton manageQuickInput;
private FCLButton sendKeycode;
private FCLButton gamepadResetMapper;
private FCLButton forceExit;
public FCLActivity getActivity() {
@ -347,6 +350,7 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
openMultiplayerMenu = findViewById(R.id.open_multiplayer_menu);
manageQuickInput = findViewById(R.id.open_quick_input);
sendKeycode = findViewById(R.id.open_send_key);
gamepadResetMapper = findViewById(R.id.gamepad_reset_mapper);
forceExit = findViewById(R.id.force_exit);
FXUtils.bindBoolean(lockMenuSwitch, menuSetting.lockMenuViewProperty());
@ -464,6 +468,7 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
openMultiplayerMenu.setOnClickListener(this);
manageQuickInput.setOnClickListener(this);
sendKeycode.setOnClickListener(this);
gamepadResetMapper.setOnClickListener(this);
forceExit.setOnClickListener(this);
}
@ -721,6 +726,10 @@ public class GameMenu implements MenuCallback, View.OnClickListener {
SelectKeycodeDialog dialog = new SelectKeycodeDialog(getActivity(), list, false, true, this);
dialog.show();
}
if (v == gamepadResetMapper) {
Remapper.wipePreferences(getActivity());
getInput().resetMapper();
}
if (v == forceExit) {
FCLAlertDialog.Builder builder = new FCLAlertDialog.Builder(activity);
builder.setAlertLevel(FCLAlertDialog.AlertLevel.ALERT);

View File

@ -471,6 +471,34 @@
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal"
android:padding="5dp">
<com.tungsten.fcllibrary.component.view.FCLTextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:singleLine="true"
android:text="@string/menu_settings_gamepad_reset_mapper"
android:textSize="12sp"
app:auto_text_tint="true" />
<com.tungsten.fcllibrary.component.view.FCLButton
android:id="@+id/gamepad_reset_mapper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:singleLine="true"
android:text="@string/menu_settings_gamepad_reset"
android:textSize="12sp" />
</com.tungsten.fcllibrary.component.view.FCLLinearLayout>
<com.tungsten.fcllibrary.component.view.FCLLinearLayout
android:layout_marginTop="5dp"
android:padding="5dp"

View File

@ -497,6 +497,8 @@
<string name="menu_settings_mouse_sensitivity">鼠标灵敏度</string>
<string name="menu_settings_mouse_size">鼠标尺寸</string>
<string name="menu_settings_gamepad">手柄</string>
<string name="menu_settings_gamepad_reset_mapper">重置映射</string>
<string name="menu_settings_gamepad_reset">重置</string>
<string name="menu_settings_gamepad_deadzone">调整死区</string>
<string name="menu_settings_multiplayer">联机菜单</string>
<string name="menu_settings_multiplayer_button">打开</string>

View File

@ -528,6 +528,8 @@
<string name="menu_settings_mouse_sensitivity">Mouse Sensitivity</string>
<string name="menu_settings_mouse_size">Mouse Size</string>
<string name="menu_settings_gamepad">GamePad</string>
<string name="menu_settings_gamepad_reset_mapper">ResetMapper</string>
<string name="menu_settings_gamepad_reset">Reset</string>
<string name="menu_settings_gamepad_deadzone">DeadZone</string>
<string name="menu_settings_gamepad_aimzone">AimAssistZone</string>
<string name="menu_settings_multiplayer">Multiplayer Menu</string>