making gamepad work again

This commit is contained in:
minjaesong
2019-02-08 18:57:47 +09:00
parent 589ac0de95
commit 003fed6cf0
15 changed files with 99 additions and 52 deletions

1
.gitignore vendored
View File

@@ -12,7 +12,6 @@ Thumbs.db
.DS_Store
# Resources that should not be tracked
*.jar
assets/mods/basegame/demoworld
#assets/mods/basegame/demoworld.gz
external_resource_packs.zip

BIN
TerrarumBuild.jar Normal file

Binary file not shown.

BIN
lib/GetCpuName.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/gdx-controllers.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,6 +1,9 @@
package net.torvald.terrarum;
import com.badlogic.gdx.*;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Files;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
@@ -26,8 +29,6 @@ import net.torvald.terrarum.worlddrawer.BlocksDrawer;
import net.torvald.terrarum.worlddrawer.LightmapRenderer;
import net.torvald.terrarumsansbitmap.gdx.GameFontBase;
import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack;
import org.lwjgl.input.Controller;
import org.lwjgl.input.Controllers;
import java.io.File;
import java.io.IOException;
@@ -174,7 +175,6 @@ public class AppLoader implements ApplicationListener {
public static TinyAlphNum fontSmallNumbers;
/** A gamepad. Multiple gamepads may controll this single virtualised gamepad. */
public static org.lwjgl.input.Controller gamepad = null;
public static float gamepadDeadzone = 0.1f;
/**
@@ -305,21 +305,6 @@ public class AppLoader implements ApplicationListener {
);
updateFullscreenQuad(appConfig.width, appConfig.height);
// enlist suitable gamepads
try {
Controllers.create();
printdbg(this, "Available gamepads: " + Controllers.getControllerCount());
for (int x = 0; x < Controllers.getControllerCount(); x++) {
Controller gamepad = Controllers.getController(x);
printdbg(this, String.format("Gamepad #%d: %s", x + 1, gamepad.getName()));
}
}
catch (Throwable e) {
printdbg(this, "Exception occured while creating controllers -- there will be no gamepads available.");
printdbg(this, e);
}
// set up renderer info variables
renderer = Gdx.graphics.getGLVersion().getRendererString();
@@ -477,7 +462,6 @@ public class AppLoader implements ApplicationListener {
}
IngameRenderer.INSTANCE.dispose();
if (Controllers.isCreated()) Controllers.destroy();
Terrarum.INSTANCE.dispose();

View File

@@ -28,20 +28,22 @@ object DefaultConfig {
// control-gamepad
jsonObject.addProperty("gamepadkeyn", 4)
jsonObject.addProperty("gamepadkeyw", 1)
jsonObject.addProperty("gamepadkeys", 2)
jsonObject.addProperty("gamepadkeye", 3) // logitech indices
jsonObject.addProperty("gamepadkeyn", 3)
jsonObject.addProperty("gamepadkeyw", 2)
jsonObject.addProperty("gamepadkeys", 0)
jsonObject.addProperty("gamepadkeye", 1) // xbox indices
jsonObject.addProperty("gamepadlup", 4)
jsonObject.addProperty("gamepadrup", 5)
jsonObject.addProperty("gamepadldown", 6)
jsonObject.addProperty("gamepadrdown", 7) // logitech indices
jsonObject.addProperty("gamepadselect", 6)
jsonObject.addProperty("gamepadstart", 7)
jsonObject.addProperty("gamepadlstickx", 1)
jsonObject.addProperty("gamepadlsticky", 0)
jsonObject.addProperty("gamepadrstickx", 3)
jsonObject.addProperty("gamepadrsticky", 2) // 0-1-2-3 but sometimes 3-2-1-0 ?! what the actual fuck?
jsonObject.addProperty("gamepadtriggeraxis", 4) // positive: LT, negative: RT (xbox pad)
jsonObject.addProperty("gamepadlstickx", 0)
jsonObject.addProperty("gamepadlsticky", 1)
jsonObject.addProperty("gamepadrstickx", 2)
jsonObject.addProperty("gamepadrsticky", 3) // 0-1-2-3 but sometimes 3-2-1-0 ?! what the actual fuck?
jsonObject.addProperty("gamepadlabelstyle", "msxb360") // "nwii", "logitech", "sonyps", "msxb360", "generic"

View File

@@ -3,7 +3,13 @@ package net.torvald.terrarum.gamecontroller
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.Input
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.PovDirection
import com.badlogic.gdx.math.Vector3
import net.torvald.terrarum.AppLoader
import net.torvald.terrarum.AppLoader.printdbg
import net.torvald.terrarum.Terrarum
import net.torvald.terrarum.floorInt
import net.torvald.terrarum.gameactors.AVKey
@@ -16,9 +22,11 @@ import net.torvald.terrarum.worlddrawer.WorldCamera
/**
* Created by minjaesong on 2015-12-31.
*/
class IngameController(val ingame: Ingame) : InputAdapter() {
class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener {
var hasController = true
// these four values can also be accessed with GameContainer.<varname>
// e.g. gc.mouseTileX
@@ -35,6 +43,13 @@ class IngameController(val ingame: Ingame) : InputAdapter() {
val mouseTileY: Int
get() = (mouseY / FeaturesDrawer.TILE_SIZE).floorInt()
init {
if (Controllers.getControllers().size == 0) {
hasController = false
printdbg(this, "Controller not found")
}
}
fun update(delta: Float) {
///////////////////
@@ -196,4 +211,39 @@ class IngameController(val ingame: Ingame) : InputAdapter() {
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

@@ -1,6 +1,7 @@
package net.torvald.terrarum.modulebasegame
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.g2d.SpriteBatch
import net.torvald.dataclass.CircularArray
@@ -253,7 +254,7 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
}
}
private val ingameController = IngameController(this)
val ingameController = IngameController(this)
/** Load rest of the game with GL context */
fun postInit() {
@@ -266,7 +267,9 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) {
// make controls work
Gdx.input.inputProcessor = ingameController
Controllers.addListener(ingameController)

View File

@@ -1,10 +1,12 @@
package net.torvald.terrarum.modulebasegame.gameactors
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Color
import com.jme3.math.FastMath
import net.torvald.spriteanimation.HasAssembledSprite
import net.torvald.terrarum.*
import net.torvald.terrarum.AppLoader.gamepadDeadzone
import net.torvald.terrarum.gameactors.*
import net.torvald.terrarum.gameactors.faction.Faction
import net.torvald.terrarum.gameworld.GameWorld
@@ -143,7 +145,6 @@ open class ActorHumanoid(
@Transient private var prevVMoveKey = KEY_NULL
@Transient private val AXIS_KEYBOARD = -13372f // leetz
@Transient private val GAMEPAD_JUMP = 7
var isUpDown = false; protected set
var isDownDown = false; protected set
@@ -225,11 +226,13 @@ open class ActorHumanoid(
isRightDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyright"))
isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump"))
if (AppLoader.gamepad != null) {
axisX = AppLoader.gamepad!!.getAxisValue(AppLoader.getConfigInt("gamepadlstickx"))
axisY = AppLoader.gamepad!!.getAxisValue(AppLoader.getConfigInt("gamepadlsticky"))
axisRX = AppLoader.gamepad!!.getAxisValue(AppLoader.getConfigInt("gamepadrstickx"))
axisRY = AppLoader.gamepad!!.getAxisValue(AppLoader.getConfigInt("gamepadrsticky"))
if ((Terrarum.ingame as Ingame).ingameController.hasController) {
val gamepad = Controllers.getControllers()[0]
axisX = gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx"))
axisY = gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky"))
axisRX = gamepad.getAxis(AppLoader.getConfigInt("gamepadrstickx"))
axisRY = gamepad.getAxis(AppLoader.getConfigInt("gamepadrsticky"))
// deadzonning
if (Math.abs(axisX) < AppLoader.gamepadDeadzone) axisX = 0f
@@ -238,7 +241,7 @@ open class ActorHumanoid(
if (Math.abs(axisRY) < AppLoader.gamepadDeadzone) axisRY = 0f
isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) ||
AppLoader.gamepad!!.isButtonPressed(GAMEPAD_JUMP)
gamepad.getAxis(AppLoader.getConfigInt("gamepadtriggeraxis")) < -AppLoader.gamepadDeadzone
}
}
else {
@@ -250,7 +253,7 @@ open class ActorHumanoid(
}
private inline val hasController: Boolean
get() = if (isGamer) AppLoader.gamepad != null
get() = if (isGamer) (Terrarum.ingame as Ingame).ingameController.hasController
else true
private fun processInput(delta: Float) {
@@ -264,7 +267,7 @@ open class ActorHumanoid(
}
}
// ↑F, ↑S
if (isWalkingH && !isLeftDown && !isRightDown) {
if (isWalkingH && !isLeftDown && !isRightDown && axisX.abs() < gamepadDeadzone) {
walkHStop()
prevHMoveKey = KEY_NULL
}
@@ -278,7 +281,7 @@ open class ActorHumanoid(
}
// ↑E
// ↑D
if (isNoClip && !isUpDown && !isDownDown) {
if (isNoClip && !isUpDown && !isDownDown && axisY.abs() < gamepadDeadzone) {
walkVStop()
prevVMoveKey = KEY_NULL
}

View File

@@ -1,6 +1,7 @@
package net.torvald.terrarum.ui
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.controllers.Controllers
import com.badlogic.gdx.graphics.Camera
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.g2d.SpriteBatch
@@ -10,6 +11,7 @@ import net.torvald.terrarum.Terrarum.mouseTileY
import net.torvald.terrarum.gameworld.GameWorld
import net.torvald.terrarum.modulebasegame.Ingame
import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension
import net.torvald.terrarum.modulebasegame.ui.ItemSlotImageFactory
import net.torvald.terrarum.worlddrawer.FeaturesDrawer
import net.torvald.terrarum.worlddrawer.LightmapRenderer
import net.torvald.terrarum.worlddrawer.WorldCamera
@@ -190,10 +192,12 @@ class BasicDebugInfoWindow : UICanvas() {
batch.color = Color.WHITE
if (AppLoader.gamepad != null) {
if ((Terrarum.ingame as? Ingame)?.ingameController?.hasController == true) {
val gamepad = Controllers.getControllers()[0]
drawGamepadAxis(batch,
AppLoader.gamepad!!.getAxisValue(3),
AppLoader.gamepad!!.getAxisValue(2),
gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")),
gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")),
Terrarum.WIDTH - 135,
40
)
@@ -308,7 +312,7 @@ class BasicDebugInfoWindow : UICanvas() {
}
private fun drawGamepadAxis(batch: SpriteBatch, axisX: Float, axisY: Float, uiX: Int, uiY: Int) {
val uiColour = Color(0xAA000000.toInt())
val uiColour = ItemSlotImageFactory.CELLCOLOUR_BLACK
val w = 128f
val h = 128f
val halfW = w / 2f
@@ -317,22 +321,24 @@ class BasicDebugInfoWindow : UICanvas() {
val pointDX = axisX * halfW
val pointDY = axisY * halfH
val padName = if (AppLoader.gamepad!!.name.isEmpty()) "Gamepad"
else AppLoader.gamepad!!.name
val gamepad = Controllers.getControllers()[0]
val padName = if (gamepad.name.isEmpty()) "Gamepad"
else gamepad.name
blendNormal(batch)
batch.end()
gdxSetBlendNormal()
Terrarum.inShapeRenderer {
it.color = uiColour
it.rect(uiX.toFloat(), uiY.toFloat(), w, h)
it.rect(uiX.toFloat(), Terrarum.HEIGHT - uiY.toFloat(), w, -h)
it.color = Color.WHITE
it.line(uiX + halfW, uiY + halfH, uiX + halfW + pointDX, uiY + halfH + pointDY)
it.line(uiX + halfW, Terrarum.HEIGHT - (uiY + halfH), uiX + halfW + pointDX, Terrarum.HEIGHT - (uiY + halfH + pointDY))
it.color = Color.GRAY
}
batch.begin()
Terrarum.fontSmallNumbers.draw(batch, padName, uiX + w / 2 - (padName.length) * 4, uiY.toFloat() + h + 2)
Terrarum.fontSmallNumbers.draw(batch, padName, Terrarum.WIDTH - (padName.length) * 8f, uiY.toFloat() + h + 2)
}