Skip to content

Gamepad Input

Gamepad API Method Reference

Method Signature Return Type Description
Input.gamepads().current() Gamepad Returns the currently active primary gamepad controller.
Input.gamepads().getAll() List<Gamepad> Returns a list of all detected, connected gamepad devices.
Input.gamepads().onAdded(Consumer<Gamepad> c) void Registers a listener invoked when a controller is plugged in.
Input.gamepads().onRemoved(Consumer<Gamepad> c) void Registers a listener invoked when a controller is disconnected.
gamepad.getAxis(String axis) float Reads analog stick/trigger value between -1.0 and 1.0.
gamepad.isPressed(String button) boolean Checks if a digital button (e.g. Gamepad.Buttons.A) is held down.
gamepad.onPressed(String button, Consumer c) void Registers a listener triggered when a button is first pressed.

LITIENGINE uses Input4j for gamepad support, utilizing the Java FFM API for cross-platform compatibility. This eliminates the need for native library deployment.

Note

As of LITIENGINE 0.11.1, gamepad support uses Input4j instead of JInput. No native libraries are required.

Accessing Gamepads

// Get the gamepad manager
GamepadManager manager = Input.gamepads();

// Get all connected gamepads
List<Gamepad> gamepads = Input.gamepads().getAll();

// Get the first connected gamepad
Gamepad gamepad = Input.gamepads().getCurrent();

Button Events

Handling Button Presses

// Using button-specific listener
Input.gamepads().onPressed(Gamepad.Xbox.A, value -> {
  System.out.println("A button pressed!");
});

// Using generic button listener
Input.gamepads().onPressed((button, value) -> {
  if (button.equals(Gamepad.Xbox.A)) {
    System.out.println("A PRESSED");
  } else if (button.equals(Gamepad.Xbox.B)) {
    System.out.println("B PRESSED");
  }
});

Button Release Events

Input.gamepads().onReleased((button, value) -> {
  if (button.equals(Gamepad.Xbox.START)) {
    // Pause game
  }
});

Xbox Controller Buttons

The Gamepad.Xbox class provides constants for standard Xbox controller buttons:

Button Description
A A button (bottom)
B B button (right)
X X button (left)
Y Y button (top)
LB Left bumper
RB Right bumper
LT Left trigger
RT Right trigger
START Start button
BACK Back/Select button
LEFT_STICK Left stick press
RIGHT_STICK Right stick press
DPAD_UP D-Pad up
DPAD_DOWN D-Pad down
DPAD_LEFT D-Pad left
DPAD_RIGHT D-Pad right

Analog Sticks

Read analog values from thumbsticks:

Input.gamepads().onPressed(Gamepad.Xbox.LEFT_STICK_Y, pollValue -> {
  if (pollValue > 0.5) {
    System.out.println("MOVE UP");
  } else if (pollValue < -0.5) {
    System.out.println("MOVE DOWN");
  }
});

Input.gamepads().onPressed(Gamepad.Xbox.LEFT_STICK_X, pollValue -> {
  if (pollValue > 0.5) {
    System.out.println("MOVE RIGHT");
  } else if (pollValue < -0.5) {
    System.out.println("MOVE LEFT");
  }
});

Polling Current State

Check gamepad state directly without event listeners:

Gamepad gamepad = Input.gamepads().getCurrent();
if (gamepad != null) {
  // Get button state
  if (gamepad.isPressed(Gamepad.Xbox.A)) {
    // A button is pressed
  }

  // Get axis value (-1.0 to 1.0)
  float x = gamepad.getPollValue(Gamepad.Xbox.LEFT_STICK_X);
  float y = gamepad.getPollValue(Gamepad.Xbox.LEFT_STICK_Y);
}

Gamepad Connection Events

// When a gamepad is connected
Input.gamepads().onAdded(gamepad -> {
  System.out.println("Gamepad connected: " + gamepad.getName());
});

// When a gamepad is disconnected
Input.gamepads().onRemoved(gamepad -> {
  System.out.println("Gamepad disconnected");
});

GamepadEntityController

Control entities with gamepad input:

public class GamepadEntityController<T extends IMobileEntity> extends MovementController<T> {

  public GamepadEntityController(T entity) {
    super(entity);
    Input.gamepads().onPressed(Gamepad.Xbox.LEFT_STICK_X, x -> {
      this.setDx((float) x);
    });
    Input.gamepads().onPressed(Gamepad.Xbox.LEFT_STICK_Y, y -> {
      this.setDy((float) y);
    });
  }
}

Dead Zones

Handle stick dead zones to prevent drift:

private static final float DEAD_ZONE = 0.2f;

private float applyDeadZone(float value) {
  if (Math.abs(value) < DEAD_ZONE) {
    return 0;
  }
  return value;
}

// Usage
Input.gamepads().onPressed(Gamepad.Xbox.LEFT_STICK_X, x -> {
  float adjustedX = applyDeadZone((float) x);
  if (adjustedX != 0) {
    controller.setDx(adjustedX);
  }
});

See Also

Foreign Function & Memory (FFM) Support

LITIENGINE uses Input4j via Java Panama Foreign Function & Memory (FFM) APIs. Run your JVM on Java 25 or later with --enable-native-access=ALL-UNNAMED to enable native controller polling without JNI overhead.