package dasherJava.core.input; import java.io.File; import dasherJava.DasherJava; import dasherJava.core.startStop.StartStopAction; import net.java.games.input.Component; import net.java.games.input.Controller; import net.java.games.input.ControllerEnvironment; public class JoystickInput implements InputProvider { private final Controller joystick; private final Component componentX; private final Component componentY; private final Component componentStartStop; private final float sensitivityX; private final float sensitivityY; private final float offsetX; private final float offsetY; private boolean lastButtonPressed = false; //JInput unfortunately does not provide a way to check if the required libraries/plugins failed to load or //if there actually are no connected controllers. It simply prints out any errors it encounters to the log //and to System.err, with no way to catch and/or properly report them to the user. static { System.setProperty("net.java.games.input.librarypath", DasherJava.BASE_DIRECTORY+File.separator+"libs" +File.separator); System.setProperty("jinput.loglevel", "WARNING"); //hide all JInput log output below warning level } public JoystickInput(String joystickName, String componentNameX, String componentNameY, String componentNameStartStop, float sensitivityX, float sensitivityY, float offsetX, float offsetY) throws JoystickNotFoundException { this.sensitivityX=sensitivityX; this.sensitivityY=sensitivityY; this.offsetX=offsetX; this.offsetY=offsetY; Controller[] controllers = ControllerEnvironment.getDefaultEnvironment().getControllers(); for (Controller controller : controllers) { if (controller.getName().equals(joystickName)) { joystick=controller; componentX=getComponentByName(controller, componentNameX); componentY=getComponentByName(controller, componentNameY); componentStartStop=getComponentByName(controller, componentNameStartStop); return; } } throw new JoystickNotFoundException("Joystick \""+joystickName+"\" not found"); } public static String getConnectedControllersInfo() { Controller[] controllers = ControllerEnvironment.getDefaultEnvironment().getControllers(); StringBuilder sb = new StringBuilder("Number of controllers: "); sb.append(controllers.length); for (Controller controller : controllers) { sb.append("\nController \""); sb.append(controller.getName()); sb.append("\", type: "); sb.append(controller.getType()); for (Component component : controller.getComponents()) { sb.append("\n "); if (component.isAnalog()) { sb.append(component.isRelative() ? "Relative" : "Absolute"); sb.append(" axis"); } else sb.append("Button"); sb.append(" \""); sb.append(component.getName()); sb.append("\""); } } return sb.toString(); } @Override public float getInputX() { float value = 0.0f; //no axis selected if (componentX!=null) { joystick.poll(); value=componentX.getPollData(); } return InputProvider.clampToInputRange(value*sensitivityX+offsetX); } @Override public float getInputY() { float value = 0.0f; //no axis selected if (componentY!=null) { joystick.poll(); value=componentY.getPollData(); } return InputProvider.clampToInputRange(value*sensitivityY+offsetY); } @Override public StartStopAction getStartStopAction() { if (componentStartStop==null) return StartStopAction.NOTHING; //no button selected joystick.poll(); boolean buttonPressed = componentStartStop.getPollData()==1.0f; if (buttonPressed && !lastButtonPressed) { lastButtonPressed=true; return StartStopAction.TOGGLE; } lastButtonPressed=buttonPressed; return StartStopAction.NOTHING; } private static Component getComponentByName(Controller controller, String componentName) throws JoystickNotFoundException { if (componentName.isEmpty()) return null; for (Component component : controller.getComponents()) { if (component.getName().equals(componentName)) return component; } throw new JoystickNotFoundException("Component \""+componentName+"\" of joystick \""+controller.getName() +"\" not found"); } public static class JoystickNotFoundException extends Exception { public JoystickNotFoundException(String message) { super(message); } } }