Simplified the code from GamePad.java

This commit is contained in:
SerpentSpirale 2021-06-25 12:28:02 +02:00
parent 003e17a12c
commit c743662b37

View File

@ -3,20 +3,22 @@ package net.kdt.pojavlaunch.customcontrols.gamepad;
import android.view.InputDevice; import android.view.InputDevice;
import android.view.MotionEvent; import android.view.MotionEvent;
import com.google.android.material.math.MathUtils; import com.google.android.material.math.MathUtils;
public class GamepadJoystick { public class GamepadJoystick {
//Directions //Directions
public static final int DIRECTION_NONE = -1; //GamepadJoystick at the center public static final int DIRECTION_NONE = -1; //GamepadJoystick at the center
public static final int DIRECTION_NORTH = 0;
public static final int DIRECTION_NORTH_EAST = 7; public static final int DIRECTION_EAST = 0;
public static final int DIRECTION_EAST = 6; public static final int DIRECTION_NORTH_EAST = 1;
public static final int DIRECTION_SOUTH_EAST = 5; public static final int DIRECTION_NORTH = 2;
public static final int DIRECTION_SOUTH = 4; public static final int DIRECTION_NORTH_WEST = 3;
public static final int DIRECTION_SOUTH_WEST = 3; public static final int DIRECTION_WEST = 4;
public static final int DIRECTION_WEST = 2; public static final int DIRECTION_SOUTH_WEST = 5;
public static final int DIRECTION_NORTH_WEST = 1; public static final int DIRECTION_SOUTH = 6;
public static final int DIRECTION_SOUTH_EAST = 7;
private float deadzone; private float deadzone;
@ -27,10 +29,9 @@ public class GamepadJoystick {
this.verticalAxis = verticalAxis; this.verticalAxis = verticalAxis;
this.horizontalAxis = horizontalAxis; this.horizontalAxis = horizontalAxis;
/* //Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2
Some controllers aren't recognized as such by android, so we fallback to a default value of 0.2 //And some others don't report their MotionRange. This was the case with the xbox one series S controller.
And some others don't report their MotionRange. This was the case with the xbox one series S controller.
*/
try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; } try { deadzone = Math.max(device.getMotionRange(verticalAxis).getFlat(), device.getMotionRange(horizontalAxis).getFlat()) * 1.9f; }
catch (NullPointerException e){ deadzone = 0.2f; } catch (NullPointerException e){ deadzone = 0.2f; }
@ -38,21 +39,17 @@ public class GamepadJoystick {
} }
public double getAngleRadian(MotionEvent event){ public double getAngleRadian(MotionEvent event){
float x = getHorizontalAxis(event); //From -PI to PI
float y = getVerticalAxis(event); return -Math.atan2(getVerticalAxis(event), getHorizontalAxis(event));
if(x == y && x == 0)
return 0.00; //atan2 don't like when x and y == 0
return -Math.atan2(y, x);
} }
public double getAngle(MotionEvent event){
float x = getHorizontalAxis(event);
float y = getVerticalAxis(event);
if(x == y && x == 0)
return 0.00; //atan2 don't like when x and y == 0
return 180+(Math.atan2(x, y)*57); public double getAngleDegree(MotionEvent event){
//From 0 to 360 degrees
double result = Math.toDegrees(getAngleRadian(event));
if(result < 0) result += 360;
return result;
} }
public double getMagnitude(MotionEvent event){ public double getMagnitude(MotionEvent event){
@ -71,17 +68,13 @@ public class GamepadJoystick {
} }
private float applyDeadzone(MotionEvent event, int axis){ private float applyDeadzone(MotionEvent event, int axis){
/* //This piece of code also modifies the value
This piece of code also modifies the value //to make it seem like there was no deadzone in the first place
to make it seem like there was no deadzone in the first place
*/
double magnitude = getMagnitude(event); double magnitude = getMagnitude(event);
if (magnitude < deadzone){ if (magnitude < deadzone) return 0;
return 0;
}
return (float) ((event.getAxisValue(axis) / magnitude) * ((magnitude - deadzone) / (1 - deadzone))); return (float) ( (event.getAxisValue(axis) / magnitude) * ((magnitude - deadzone) / (1 - deadzone)) );
} }
public static boolean isJoystickEvent(MotionEvent event){ public static boolean isJoystickEvent(MotionEvent event){
@ -92,7 +85,7 @@ public class GamepadJoystick {
public int getHeightDirection(MotionEvent event){ public int getHeightDirection(MotionEvent event){
if(getMagnitude(event) <= deadzone) return DIRECTION_NONE; if(getMagnitude(event) <= deadzone) return DIRECTION_NONE;
return ((int) ((getAngle(event)+22.5)/45)) % 8; return ((int) ((getAngleDegree(event)+22.5)/45)) % 8;
} }