DEADSOFTWARE

Fix codestyle
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / misc / InputHandlerGame.java
index 3eeb6f9f68368ec2b1ba3bf2d9cfaced828e3b40..6a7e4d388f9dce5c22a137331361039887d7422f 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;
     }
 }