DEADSOFTWARE

Refactor
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / misc / InputHandlerGame.java
index c00521f1311570106c91e8aecc5d2b4a1458238e..9ba00bcfca9ee5e393cb188651ed18b355bd23d7 100644 (file)
@@ -1,18 +1,63 @@
 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.GameScreen;
 import ru.deadsoftware.cavedroid.game.GameInput;
 
-import static ru.deadsoftware.cavedroid.GameScreen.*;
+import static ru.deadsoftware.cavedroid.GameScreen.GP;
 
-public class InputHandlerGame implements InputProcessor {
+public class InputHandlerGame extends InputAdapter {
+
+    private static final int
+            UP = 0,
+            DOWN = 1,
+            LEFT = 2,
+            RIGHT = 3,
+            ALT = 4,
+            LMB = 5,
+            RMB = 6;
 
     private GameInput gameInput;
 
     public InputHandlerGame() {
         this.gameInput = new GameInput();
+        loadTouchButtonsFromJSON();
+    }
+
+    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");
+            if (x < 0) x = GP.renderer.getWidth() + x;
+            if (y < 0) y = GP.renderer.getHeight() + y;
+            Assets.guiMap.put(key.name(), new Rectangle(x, y, w, h));
+        }
+
+    }
+
+    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 int getTouchedKey(float touchX, float touchY) {
+        for (int i = 0; i < Assets.guiMap.size; i++) {
+            if (Assets.guiMap.getValueAt(i).contains(touchX, touchY)) {
+                return i;
+            }
+        }
+        return -1;
     }
 
     @Override
@@ -27,96 +72,88 @@ public class InputHandlerGame implements InputProcessor {
         return false;
     }
 
-    @Override
-    public boolean keyTyped(char character) {
-        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.controlMode == ControlMode.CURSOR) {
-                    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.controlMode == ControlMode.CURSOR) 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);
-            } else {
-                gameInput.touchDown(screenX, screenY, -1);
+            int touchedKey = getTouchedKey(touchX, touchY);
+            switch (touchedKey) {
+                case UP:
+                    gameInput.keyDown(GP.controlMode == ControlMode.CURSOR ? Input.Keys.W : Input.Keys.SPACE);
+                    break;
+                case DOWN:
+                    gameInput.keyDown(GP.controlMode == ControlMode.CURSOR ? Input.Keys.S : Input.Keys.CONTROL_LEFT);
+                    break;
+                case LEFT:
+                    gameInput.keyDown(Input.Keys.A);
+                    break;
+                case RIGHT:
+                    gameInput.keyDown(Input.Keys.D);
+                    break;
+                case ALT:
+                    gameInput.keyDown(Input.Keys.ALT_LEFT);
+                    break;
+                case LMB:
+                    gameInput.touchDown(touchX, touchY, Input.Buttons.LEFT);
+                    break;
+                case RMB:
+                    gameInput.touchDown(touchX, touchY, Input.Buttons.RIGHT);
+                    break;
+                default:
+                    gameInput.touchDown(touchX, touchY, touchedKey);
             }
         } else {
-            gameInput.touchDown(screenX, screenY, button);
+            gameInput.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.controlMode == ControlMode.CURSOR) 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.controlMode == ControlMode.CURSOR) 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);
-            } else {
-                gameInput.touchUp(screenX, screenY, -1);
+            int touchedKey = getTouchedKey(touchX, touchY);
+            switch (touchedKey) {
+                case UP:
+                case DOWN:
+                case LEFT:
+                case RIGHT:
+                case ALT:
+                    gameInput.keyUp(GP.keyDownCode);
+                    break;
+                case LMB:
+                    gameInput.touchUp(touchX, touchY, Input.Buttons.LEFT);
+                    break;
+                case RMB:
+                    gameInput.touchUp(touchX, touchY, Input.Buttons.RIGHT);
+                    break;
+                default:
+                    gameInput.touchUp(touchX, touchY, touchedKey);
             }
         } else {
-            gameInput.touchUp(screenX, screenY, button);
+            gameInput.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.isKeyDown) {
+            if (getTouchedKey(touchX, touchY) == -1) {
+                gameInput.keyUp(GP.keyDownCode);
+            }
         } else {
-            gameInput.touchDragged(screenX, screenY);
+            gameInput.touchDragged(touchX, touchY);
         }
         return false;
     }
 
-    @Override
-    public boolean mouseMoved(int screenX, int screenY) {
-        return false;
-    }
-
     @Override
     public boolean scrolled(int amount) {
         gameInput.scrolled(amount);