diff --git a/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java b/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java
index 3eeb6f9f68368ec2b1ba3bf2d9cfaced828e3b40..359ac98f311aa00a36297cecf1803f58e875a9e6 100644 (file)
package ru.deadsoftware.cavedroid.misc;
+import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
-import com.badlogic.gdx.InputProcessor;
+import com.badlogic.gdx.InputAdapter;
+import com.badlogic.gdx.math.Rectangle;
+import com.badlogic.gdx.utils.JsonValue;
import ru.deadsoftware.cavedroid.CaveGame;
-import ru.deadsoftware.cavedroid.game.GameInput;
+import ru.deadsoftware.cavedroid.GameScreen;
+import ru.deadsoftware.cavedroid.game.objects.TouchButton;
-import static ru.deadsoftware.cavedroid.GameScreen.*;
+import static com.badlogic.gdx.utils.ObjectMap.Entry;
+import static ru.deadsoftware.cavedroid.GameScreen.GP;
-public class InputHandlerGame implements InputProcessor {
+public class InputHandlerGame extends InputAdapter {
- private GameInput gameInput;
+ private static TouchButton nullButton = new TouchButton(null, -1, true);
public InputHandlerGame() {
- this.gameInput = new GameInput();
+ loadTouchButtonsFromJSON();
}
- @Override
- public boolean keyDown(int keycode) {
- gameInput.keyDown(keycode);
- return false;
+ private int getMouseKey(String name) {
+ switch (name) {
+ case "Left":
+ return Input.Buttons.LEFT;
+ case "Right":
+ return Input.Buttons.RIGHT;
+ case "Middle":
+ return Input.Buttons.MIDDLE;
+ case "Back":
+ return Input.Buttons.BACK;
+ case "Forward":
+ return Input.Buttons.FORWARD;
+ default:
+ return -1;
+ }
+ }
+
+ private void loadTouchButtonsFromJSON() {
+ JsonValue json = Assets.jsonReader.parse(Gdx.files.internal("json/touch_buttons.json"));
+ for (JsonValue key = json.child(); key != null; key = key.next()) {
+ float x = key.getFloat("x");
+ float y = key.getFloat("y");
+ float w = key.getFloat("w");
+ float h = key.getFloat("h");
+ boolean mouse = Assets.getBooleanFromJson(key, "mouse", false);
+ String name = key.getString("key");
+ int code = mouse ? getMouseKey(name) : Input.Keys.valueOf(name);
+ if (x < 0) x = GP.renderer.getWidth() + x;
+ if (y < 0) y = GP.renderer.getHeight() + y;
+ Assets.guiMap.put(key.name(), new TouchButton(new Rectangle(x, y, w, h), code, mouse));
+ }
+
+ }
+
+ private float transformScreenX(int screenX) {
+ return GP.renderer.getWidth() / GameScreen.getWidth() * screenX;
+ }
+
+ private float transformScreenY(int screenY) {
+ return GP.renderer.getHeight() / GameScreen.getHeight() * screenY;
+ }
+
+ private TouchButton getTouchedKey(float touchX, float touchY) {
+ for (Entry entry : Assets.guiMap) {
+ TouchButton button = (TouchButton) entry.value;
+ if (button.getRect().contains(touchX, touchY)) {
+ return button;
+ }
+ }
+ return nullButton;
}
@Override
- public boolean keyUp(int keycode) {
- gameInput.keyUp(keycode);
+ public boolean keyDown(int keycode) {
+ GP.input.keyDown(keycode);
return false;
}
@Override
- public boolean keyTyped(char character) {
+ public boolean keyUp(int keycode) {
+ GP.input.keyUp(keycode);
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
- screenX *= GP.renderer.getWidth() / getWidth();
- screenY *= GP.renderer.getHeight() / getHeight();
+ float touchX = transformScreenX(screenX);
+ float touchY = transformScreenY(screenY);
if (CaveGame.TOUCH) {
- if (screenX > 26 && screenX < 52 && screenY > GP.renderer.getHeight() - 52 &&
- screenY < GP.renderer.getHeight() - 26) {
- if (GP.ctrlMode == 1) gameInput.keyDown(Input.Keys.W);
- else gameInput.keyDown(Input.Keys.SPACE);
- } else if (screenX > 0 && screenX < 26 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyDown(Input.Keys.A);
- } else if (screenX > 26 && screenX < 52 && screenY > GP.renderer.getHeight() - 26) {
- if (GP.ctrlMode == 1) gameInput.keyDown(Input.Keys.S);
- else gameInput.keyDown(Input.Keys.CONTROL_LEFT);
- } else if (screenX > 52 && screenX < 78 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyDown(Input.Keys.D);
- } else if (screenX > 78 && screenX < 104 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyDown(Input.Keys.ALT_LEFT);
- } else if (screenX > GP.renderer.getWidth() - 52 && screenX < GP.renderer.getWidth() - 26 &&
- screenY > GP.renderer.getHeight() - 26) {
- gameInput.touchDown(screenX, screenY, Input.Buttons.LEFT);
- } else if (screenX > GP.renderer.getWidth() - 26 && screenY > screenY - 26) {
- gameInput.touchDown(screenX, screenY, Input.Buttons.RIGHT);
+ TouchButton touchedKey = getTouchedKey(touchX, touchY);
+ if (touchedKey.isMouse()) {
+ GP.input.touchDown(touchX, touchY, touchedKey.getCode());
} else {
- gameInput.touchDown(screenX, screenY, -1);
+ GP.input.keyDown(touchedKey.getCode());
}
} else {
- gameInput.touchDown(screenX, screenY, button);
+ GP.input.touchDown(touchX, touchY, button);
}
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
- screenX *= GP.renderer.getWidth() / getWidth();
- screenY *= GP.renderer.getHeight() / getHeight();
+ float touchX = transformScreenX(screenX);
+ float touchY = transformScreenY(screenY);
+
if (CaveGame.TOUCH) {
- if (screenX > 26 && screenX < 52 && screenY > GP.renderer.getHeight() - 52 &&
- screenY < GP.renderer.getHeight() - 26) {
- if (GP.ctrlMode == 1) gameInput.keyUp(Input.Keys.W);
- else gameInput.keyUp(Input.Keys.SPACE);
- } else if (screenX > 0 && screenX < 26 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyUp(Input.Keys.A);
- } else if (screenX > 26 && screenX < 52 && screenY > GP.renderer.getHeight() - 26) {
- if (GP.ctrlMode == 1) gameInput.keyUp(Input.Keys.S);
- else gameInput.keyUp(Input.Keys.CONTROL_LEFT);
- } else if (screenX > 52 && screenX < 78 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyUp(Input.Keys.D);
- } else if (screenX > 78 && screenX < 104 && screenY > GP.renderer.getHeight() - 26) {
- gameInput.keyUp(Input.Keys.ALT_LEFT);
- } else if (screenX > GP.renderer.getWidth() - 52 && screenX < GP.renderer.getWidth() - 26 &&
- screenY > GP.renderer.getHeight() - 26) {
- gameInput.touchUp(screenX, screenY, Input.Buttons.LEFT);
- } else if (screenX > GP.renderer.getWidth() - 26 && screenY > screenY - 26) {
- gameInput.touchUp(screenX, screenY, Input.Buttons.RIGHT);
+ TouchButton touchedKey = getTouchedKey(touchX, touchY);
+ if (touchedKey.isMouse()) {
+ GP.input.touchUp(touchX, touchY, touchedKey.getCode());
} else {
- gameInput.touchUp(screenX, screenY, -1);
+ GP.input.keyUp(GP.input.getKeyDownCode());
}
} else {
- gameInput.touchUp(screenX, screenY, button);
+ GP.input.touchUp(touchX, touchY, button);
}
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
- screenX *= GP.renderer.getWidth() / getWidth();
- screenY *= GP.renderer.getHeight() / getHeight();
- if (GP.isKeyDown && (screenX > 78 || screenY < GP.renderer.getHeight() - 52)) {
- gameInput.keyUp(GP.keyDownCode);
+ float touchX = transformScreenX(screenX);
+ float touchY = transformScreenY(screenY);
+ if (CaveGame.TOUCH && GP.input.isKeyDown()) {
+ if (getTouchedKey(touchX, touchY).getCode() == -1) {
+ GP.input.keyUp(GP.input.getKeyDownCode());
+ }
} else {
- gameInput.touchDragged(screenX, screenY);
+ GP.input.touchDragged(touchX, touchY);
}
return false;
}
- @Override
- public boolean mouseMoved(int screenX, int screenY) {
- return false;
- }
-
@Override
public boolean scrolled(int amount) {
- gameInput.scrolled(amount);
+ GP.input.scrolled(amount);
return false;
}
}