vtm/vtm-gdx/src/org/oscim/gdx/InputHandler.java
2014-09-04 02:32:36 +02:00

219 lines
4.4 KiB
Java

package org.oscim.gdx;
import org.oscim.layers.GenericLayer;
import org.oscim.layers.TileGridLayer;
import org.oscim.map.Map;
import org.oscim.map.ViewController;
import org.oscim.theme.VtmThemes;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Input.Buttons;
import com.badlogic.gdx.InputProcessor;
public class InputHandler implements InputProcessor {
private ViewController mViewport;
private final Map mMap;
private GenericLayer mGridLayer;
private final GdxMap mGdxApp;
public InputHandler(GdxMap map) {
mMap = map.getMap();
mViewport = mMap.viewport();
mGdxApp = map;
}
private boolean mActiveScale;
private boolean mActiveTilt;
private boolean mActiveRotate;
private int mPosX, mPosY;
@Override
public boolean keyDown(int keycode) {
if (mGdxApp.onKeyDown(keycode))
return true;
switch (keycode) {
case Input.Keys.ESCAPE:
Gdx.app.exit();
break;
case Input.Keys.SHIFT_LEFT:
mActiveScale = true;
mPosY = Gdx.input.getY();
break;
case Input.Keys.CONTROL_LEFT:
mActiveTilt = true;
mPosX = Gdx.input.getX();
mPosY = Gdx.input.getY();
break;
case Input.Keys.UP:
mViewport.moveMap(0, -50);
mMap.updateMap(true);
break;
case Input.Keys.DOWN:
mViewport.moveMap(0, 50);
mMap.updateMap(true);
break;
case Input.Keys.LEFT:
mViewport.moveMap(-50, 0);
mMap.updateMap(true);
break;
case Input.Keys.RIGHT:
mViewport.moveMap(50, 0);
mMap.updateMap(true);
break;
case Input.Keys.M:
mViewport.scaleMap(1.05f, 0, 0);
mMap.updateMap(true);
break;
case Input.Keys.N:
mViewport.scaleMap(0.95f, 0, 0);
mMap.updateMap(true);
break;
case Input.Keys.NUM_1:
mMap.animator().animateZoom(500, 0.5, 0, 0);
break;
case Input.Keys.NUM_2:
mMap.animator().animateZoom(500, 2, 0, 0);
break;
case Input.Keys.D:
mMap.setTheme(VtmThemes.DEFAULT);
mMap.updateMap(false);
break;
case Input.Keys.T:
mMap.setTheme(VtmThemes.TRONRENDER);
mMap.updateMap(false);
break;
case Input.Keys.R:
mMap.setTheme(VtmThemes.OSMARENDER);
mMap.updateMap(false);
break;
case Input.Keys.G:
if (mGridLayer == null) {
mGridLayer = new TileGridLayer(mMap);
mGridLayer.setEnabled(true);
mMap.layers().add(mGridLayer);
} else {
if (mGridLayer.isEnabled()) {
mGridLayer.setEnabled(false);
mMap.layers().remove(mGridLayer);
} else {
mGridLayer.setEnabled(true);
mMap.layers().add(mGridLayer);
}
}
mMap.render();
break;
}
return false;
}
@Override
public boolean keyUp(int keycode) {
switch (keycode) {
case Input.Keys.SHIFT_LEFT:
mActiveScale = false;
break;
case Input.Keys.CONTROL_LEFT:
mActiveTilt = false;
break;
}
return false;
}
@Override
public boolean keyTyped(char character) {
return false;
}
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
if (button == Buttons.MIDDLE) {
mActiveScale = true;
mPosY = screenY;
} else if (button == Buttons.RIGHT) {
mActiveRotate = true;
mPosX = screenX;
mPosY = screenY;
return true;
}
return false;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
mActiveScale = false;
mActiveRotate = false;
return false;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
boolean changed = false;
if (!(mActiveScale || mActiveRotate || mActiveTilt))
return false;
if (mActiveTilt) {
changed = mViewport.tiltMap((screenY - mPosY) / 5f);
mPosY = screenY;
}
if (mActiveScale) {
changed = mViewport.scaleMap(1 - (screenY - mPosY) / 100f, 0, 0);
mPosY = screenY;
}
if (mActiveRotate) {
mViewport.rotateMap((screenX - mPosX) / 500f, 0, 0);
mPosX = screenX;
mViewport.tiltMap((screenY - mPosY) / 10f);
mPosY = screenY;
changed = true;
}
if (changed) {
mMap.updateMap(true);
}
return true;
}
@Override
public boolean mouseMoved(int screenX, int screenY) {
mPosX = screenX;
mPosY = screenY;
return false;
}
@Override
public boolean scrolled(int amount) {
if (amount > 0) {
mMap.animator().animateZoom(250, 0.75f, 0, 0);
} else {
float fx = mPosX - mMap.getWidth() / 2;
float fy = mPosY - mMap.getHeight() / 2;
mMap.animator().animateZoom(250, 1.333f, fx, fy);
}
mMap.updateMap(false);
return true;
}
}