making xinput to actually work (tested with xbone gamepad)

This commit is contained in:
minjaesong
2019-02-09 18:33:54 +09:00
parent d891afa1cd
commit 1730ebd0d7
14 changed files with 207 additions and 65 deletions

Binary file not shown.

BIN
lib/jxinput-1.0.0.jar Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -175,7 +175,7 @@ public class AppLoader implements ApplicationListener {
public static TinyAlphNum fontSmallNumbers; public static TinyAlphNum fontSmallNumbers;
/** A gamepad. Multiple gamepads may controll this single virtualised gamepad. */ /** A gamepad. Multiple gamepads may controll this single virtualised gamepad. */
public static float gamepadDeadzone = 0.1f; public static float gamepadDeadzone = 0.2f;
/** /**
* For the events depends on rendering frame (e.g. flicker on post-hit invincibility) * For the events depends on rendering frame (e.g. flicker on post-hit invincibility)

View File

@@ -28,6 +28,8 @@ object DefaultConfig {
// control-gamepad // control-gamepad
jsonObject.addProperty("usexinput", true) // when FALSE, LT+RT input on xbox controller is impossible
jsonObject.addProperty("gamepadkeyn", 3) jsonObject.addProperty("gamepadkeyn", 3)
jsonObject.addProperty("gamepadkeyw", 2) jsonObject.addProperty("gamepadkeyw", 2)
jsonObject.addProperty("gamepadkeys", 0) jsonObject.addProperty("gamepadkeys", 0)
@@ -38,6 +40,9 @@ object DefaultConfig {
jsonObject.addProperty("gamepadselect", 6) jsonObject.addProperty("gamepadselect", 6)
jsonObject.addProperty("gamepadstart", 7) jsonObject.addProperty("gamepadstart", 7)
jsonObject.addProperty("gamepadltrigger", 8)
jsonObject.addProperty("gamepadrtrigger", 9)
jsonObject.addProperty("gamepadlstickx", 1) jsonObject.addProperty("gamepadlstickx", 1)
jsonObject.addProperty("gamepadlsticky", 0) jsonObject.addProperty("gamepadlsticky", 0)
jsonObject.addProperty("gamepadrstickx", 3) jsonObject.addProperty("gamepadrstickx", 3)

View File

@@ -0,0 +1,29 @@
package net.torvald.terrarum.controller
import com.badlogic.gdx.controllers.Controller
/**
* Created by minjaesong on 2019-02-09.
*/
class GdxControllerAdapter(val c: Controller): TerrarumController {
override fun getButton(index: Int): Boolean {
return c.getButton(index)
}
override fun getAxis(index: Int): Float {
return c.getAxis(index)
}
override fun getPov(): Int {
TODO()
}
override fun getName(): String {
return c.name
}
override fun setRumble(left: Float, right: Float) {
return
}
}

View File

@@ -0,0 +1,66 @@
package net.torvald.terrarum.controller
/**
* Created by minjaesong on 2019-02-09.
*/
interface TerrarumController {
/**
* 0, 1, 2, 3 : A B X Y
*
* 4, 5 : L/R Shoulder
*
* 6, 7 : Back Start
*
* 8, 9 : L/R Trigger
*
* DirectInput devices may need external Index-to-button mapping (just a config file)
*
*/
fun getButton(index: Int): Boolean
/**
* 0: Left Y
*
* 1: Left X
*
* 2: Right Y
*
* 3: Right X
*
* 4: Left Trigger
*
* 5: Right Trigger
*
* DirectInput devices may need external Index-to-button mapping (just a config file).
*
* Warning: Under DirectInput, Xbox controllers' LT and RT shares the same axis #4, and thus it's impossible to read LT+RT input.
*
* @return 0f..1f for the axis
*/
fun getAxis(index: Int): Float
/**
* ```
* 12 8 9
* 4 0 1
* 6 2 3
* ```
*/
fun getPov(): Int
fun getName(): String
fun setRumble(left: Float, right: Float)
companion object {
const val POV_E = 1
const val POV_S = 2
const val POV_W = 4
const val POV_N = 8
const val POV_SE = POV_E or POV_S
const val POV_SW = POV_W or POV_S
const val POV_NW = POV_W or POV_N
const val POV_NE = POV_E or POV_N
}
}

View File

@@ -0,0 +1,78 @@
package net.torvald.terrarum.controller
import com.github.strikerx3.jxinput.XInputAxes
import com.github.strikerx3.jxinput.XInputDevice
import net.torvald.terrarum.AppLoader
import kotlin.math.roundToInt
/**
* Created by minjaesong on 2019-02-09.
*/
class XinputControllerAdapter(val c: XInputDevice): TerrarumController {
override fun getButton(index: Int): Boolean {
if (c.poll()) {
val button = c.components.buttons
return when (index) {
0 -> button.a
1 -> button.b
2 -> button.x
3 -> button.y
4 -> button.lShoulder
5 -> button.rShoulder
6 -> button.back
7 -> button.start
8 -> getAxis(4) >= AppLoader.gamepadDeadzone
9 -> getAxis(5) >= AppLoader.gamepadDeadzone
else -> throw UnsupportedOperationException("Unknown button: $index")
}
}
return false
}
override fun getAxis(index: Int): Float {
if (c.poll()) {
val axes = c.components.axes
return when (index) {
0 -> axes.ly
1 -> axes.lx
2 -> axes.ry
3 -> axes.rx
4 -> axes.lt
5 -> axes.rt
else -> throw UnsupportedOperationException("Unknown axis: $index")
}
}
return -1f
}
override fun getPov(): Int {
if (c.poll()) {
val axes = c.components.axes
return when (axes.dpad) {
XInputAxes.DPAD_CENTER -> 0
XInputAxes.DPAD_UP_LEFT -> TerrarumController.POV_NW
XInputAxes.DPAD_UP -> TerrarumController.POV_N
XInputAxes.DPAD_UP_RIGHT -> TerrarumController.POV_NE
XInputAxes.DPAD_RIGHT -> TerrarumController.POV_E
XInputAxes.DPAD_DOWN_RIGHT -> TerrarumController.POV_SE
XInputAxes.DPAD_DOWN -> TerrarumController.POV_S
XInputAxes.DPAD_DOWN_LEFT -> TerrarumController.POV_SW
XInputAxes.DPAD_LEFT -> TerrarumController.POV_W
else -> throw UnsupportedOperationException("Unknown pov: ${axes.dpad}")
}
}
return -1
}
override fun getName(): String {
return "(XInput Compatible)"
}
override fun setRumble(left: Float, right: Float) {
c.setVibration((left * 65535f).roundToInt(), (right * 65535f).roundToInt())
}
}

View File

@@ -3,14 +3,11 @@ package net.torvald.terrarum.gamecontroller
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input import com.badlogic.gdx.Input
import com.badlogic.gdx.InputAdapter import com.badlogic.gdx.InputAdapter
import com.badlogic.gdx.controllers.Controller
import com.badlogic.gdx.controllers.ControllerListener
import com.badlogic.gdx.controllers.Controllers import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.controllers.PovDirection
import com.badlogic.gdx.math.Vector3
import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader
import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.Terrarum import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.controller.TerrarumController
import net.torvald.terrarum.floorInt import net.torvald.terrarum.floorInt
import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.AVKey
import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.gameworld.fmod
@@ -22,10 +19,12 @@ import net.torvald.terrarum.worlddrawer.WorldCamera
/** /**
* Created by minjaesong on 2015-12-31. * Created by minjaesong on 2015-12-31.
*/ */
class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener { class IngameController(val ingame: Ingame) : InputAdapter() {
var hasController = true val hasGamepad: Boolean
get() = gamepad != null
var gamepad: TerrarumController? = null
// these four values can also be accessed with GameContainer.<varname> // these four values can also be accessed with GameContainer.<varname>
// e.g. gc.mouseTileX // e.g. gc.mouseTileX
@@ -45,7 +44,6 @@ class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener
init { init {
if (Controllers.getControllers().size == 0) { if (Controllers.getControllers().size == 0) {
hasController = false
printdbg(this, "Controller not found") printdbg(this, "Controller not found")
} }
} }
@@ -211,39 +209,4 @@ class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener
return true return true
} }
override fun connected(p0: Controller?) {
hasController = true
}
override fun buttonUp(p0: Controller?, p1: Int): Boolean {
return false
}
override fun ySliderMoved(p0: Controller?, p1: Int, p2: Boolean): Boolean {
return false
}
override fun accelerometerMoved(p0: Controller?, p1: Int, p2: Vector3?): Boolean {
return false
}
override fun axisMoved(p0: Controller?, p1: Int, p2: Float): Boolean {
return false
}
override fun disconnected(p0: Controller?) {
hasController = false
}
override fun xSliderMoved(p0: Controller?, p1: Int, p2: Boolean): Boolean {
return false
}
override fun povMoved(p0: Controller?, p1: Int, p2: PovDirection?): Boolean {
return false
}
override fun buttonDown(p0: Controller?, p1: Int): Boolean {
return false
}
} }

View File

@@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import com.github.strikerx3.jxinput.XInputDevice
import net.torvald.dataclass.CircularArray import net.torvald.dataclass.CircularArray
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.AppLoader.printdbg
@@ -11,6 +12,8 @@ import net.torvald.terrarum.blockproperties.BlockPropUtil
import net.torvald.terrarum.blockstats.BlockStats import net.torvald.terrarum.blockstats.BlockStats
import net.torvald.terrarum.concurrent.ThreadParallel import net.torvald.terrarum.concurrent.ThreadParallel
import net.torvald.terrarum.console.Authenticator import net.torvald.terrarum.console.Authenticator
import net.torvald.terrarum.controller.GdxControllerAdapter
import net.torvald.terrarum.controller.XinputControllerAdapter
import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.Actor
import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody
import net.torvald.terrarum.gamecontroller.IngameController import net.torvald.terrarum.gamecontroller.IngameController
@@ -269,7 +272,11 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
// make controls work // make controls work
Gdx.input.inputProcessor = ingameController Gdx.input.inputProcessor = ingameController
Controllers.addListener(ingameController) ingameController.gamepad =
if (AppLoader.getConfigBoolean("usexinput"))
XinputControllerAdapter(XInputDevice.getDeviceFor(0))
else
GdxControllerAdapter(Controllers.getControllers()[0])

View File

@@ -1,7 +1,6 @@
package net.torvald.terrarum.modulebasegame.gameactors package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.jme3.math.FastMath import com.jme3.math.FastMath
import net.torvald.spriteanimation.HasAssembledSprite import net.torvald.spriteanimation.HasAssembledSprite
@@ -226,9 +225,9 @@ open class ActorHumanoid(
isRightDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyright")) isRightDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyright"))
isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump"))
if ((Terrarum.ingame as Ingame).ingameController.hasController) { val gamepad = (Terrarum.ingame as Ingame).ingameController.gamepad
val gamepad = Controllers.getControllers()[0]
if (gamepad != null) {
axisX = gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")) axisX = gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx"))
axisY = gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")) axisY = gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky"))
axisRX = gamepad.getAxis(AppLoader.getConfigInt("gamepadrstickx")) axisRX = gamepad.getAxis(AppLoader.getConfigInt("gamepadrstickx"))
@@ -241,7 +240,7 @@ open class ActorHumanoid(
if (Math.abs(axisRY) < AppLoader.gamepadDeadzone) axisRY = 0f if (Math.abs(axisRY) < AppLoader.gamepadDeadzone) axisRY = 0f
isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) || isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) ||
gamepad.getAxis(AppLoader.getConfigInt("gamepadtriggeraxis")) < -AppLoader.gamepadDeadzone gamepad.getButton(AppLoader.getConfigInt("gamepadltrigger"))
} }
} }
else { else {
@@ -253,7 +252,7 @@ open class ActorHumanoid(
} }
private inline val hasController: Boolean private inline val hasController: Boolean
get() = if (isGamer) (Terrarum.ingame as Ingame).ingameController.hasController get() = if (isGamer) (Terrarum.ingame as Ingame).ingameController.hasGamepad
else true else true
private fun processInput(delta: Float) { private fun processInput(delta: Float) {

View File

@@ -1,13 +1,13 @@
package net.torvald.terrarum.ui package net.torvald.terrarum.ui
import com.badlogic.gdx.Gdx import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.terrarum.* import net.torvald.terrarum.*
import net.torvald.terrarum.Terrarum.mouseTileX import net.torvald.terrarum.Terrarum.mouseTileX
import net.torvald.terrarum.Terrarum.mouseTileY import net.torvald.terrarum.Terrarum.mouseTileY
import net.torvald.terrarum.controller.TerrarumController
import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.Ingame import net.torvald.terrarum.modulebasegame.Ingame
import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension
@@ -192,10 +192,9 @@ class BasicDebugInfoWindow : UICanvas() {
batch.color = Color.WHITE batch.color = Color.WHITE
if ((Terrarum.ingame as? Ingame)?.ingameController?.hasController == true) { val gamepad = (Terrarum.ingame as? Ingame)?.ingameController?.gamepad
val gamepad = Controllers.getControllers()[0] if (gamepad != null) {
drawGamepadAxis(gamepad, batch,
drawGamepadAxis(batch,
gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")), gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")),
gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")), gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")),
Terrarum.WIDTH - 135, Terrarum.WIDTH - 135,
@@ -311,7 +310,7 @@ class BasicDebugInfoWindow : UICanvas() {
blendNormal(batch) blendNormal(batch)
} }
private fun drawGamepadAxis(batch: SpriteBatch, axisX: Float, axisY: Float, uiX: Int, uiY: Int) { private fun drawGamepadAxis(gamepad: TerrarumController, batch: SpriteBatch, axisX: Float, axisY: Float, uiX: Int, uiY: Int) {
val uiColour = ItemSlotImageFactory.CELLCOLOUR_BLACK val uiColour = ItemSlotImageFactory.CELLCOLOUR_BLACK
val w = 128f val w = 128f
val h = 128f val h = 128f
@@ -319,11 +318,7 @@ class BasicDebugInfoWindow : UICanvas() {
val halfH = h / 2f val halfH = h / 2f
val pointDX = axisX * halfW val pointDX = axisX * halfW
val pointDY = axisY * halfH val pointDY = -axisY * halfH
val gamepad = Controllers.getControllers()[0]
val padName = if (gamepad.name.isEmpty()) "Gamepad"
else gamepad.name
blendNormal(batch) blendNormal(batch)
@@ -338,7 +333,7 @@ class BasicDebugInfoWindow : UICanvas() {
} }
batch.begin() batch.begin()
Terrarum.fontSmallNumbers.draw(batch, padName, Terrarum.WIDTH - (padName.length) * 8f, uiY.toFloat() + h + 2) Terrarum.fontSmallNumbers.draw(batch, gamepad.getName(), Terrarum.WIDTH - (gamepad.getName().length) * 8f, uiY.toFloat() + h + 2)
} }

Binary file not shown.