diff --git a/jme3-examples/src/main/java/jme3test/input/TestJoystick.java b/jme3-examples/src/main/java/jme3test/input/TestJoystick.java index 605cfaa67..8633b0aef 100644 --- a/jme3-examples/src/main/java/jme3test/input/TestJoystick.java +++ b/jme3-examples/src/main/java/jme3test/input/TestJoystick.java @@ -1,9 +1,12 @@ package jme3test.input; +import java.util.*; + import com.jme3.app.SimpleApplication; import com.jme3.collision.CollisionResult; import com.jme3.collision.CollisionResults; import com.jme3.font.BitmapText; +import com.jme3.input.DefaultJoystickAxis; import com.jme3.input.Joystick; import com.jme3.input.JoystickAxis; import com.jme3.input.JoystickButton; @@ -160,9 +163,29 @@ public class TestJoystick extends SimpleApplication { */ protected class JoystickEventListener implements RawInputListener { + private Map lastValues = new HashMap<>(); + public void onJoyAxisEvent(JoyAxisEvent evt) { - setViewedJoystick( evt.getAxis().getJoystick() ); - gamepad.setAxisValue( evt.getAxis(), evt.getValue() ); + Float last = lastValues.remove(evt.getAxis()); + float value = evt.getValue(); + + // Check the axis dead zone. InputManager normally does this + // by default but not for raw events like we get here. + float effectiveDeadZone = Math.max(inputManager.getAxisDeadZone(), evt.getAxis().getDeadZone()); + if( Math.abs(value) < effectiveDeadZone ) { + if( last == null ) { + // Just skip the event + return; + } + // Else set the value to 0 + lastValues.remove(evt.getAxis()); + value = 0; + } + setViewedJoystick( evt.getAxis().getJoystick() ); + gamepad.setAxisValue( evt.getAxis(), value ); + if( value != 0 ) { + lastValues.put(evt.getAxis(), value); + } } public void onJoyButtonEvent(JoyButtonEvent evt) { @@ -266,6 +289,7 @@ public class TestJoystick extends SimpleApplication { } public void setAxisValue( JoystickAxis axis, float value ) { + System.out.println( "Axis:" + axis.getName() + "=" + value ); if( axis == axis.getJoystick().getXAxis() ) { setXAxis(value);