X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fmisc%2FInputHandlerGame.java;h=6a7e4d388f9dce5c22a137331361039887d7422f;hb=59d48c1b28c570755327a8fb0827fa57e7fd3914;hp=3eeb6f9f68368ec2b1ba3bf2d9cfaced828e3b40;hpb=0a855ca3c1d0c84de41a928cc99fd8544a933015;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java b/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java index 3eeb6f9..6a7e4d3 100644 --- a/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java +++ b/core/src/ru/deadsoftware/cavedroid/misc/InputHandlerGame.java @@ -1,122 +1,146 @@ 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; } }