Tag 18 – Gesten

veröffentlicht am: 18. Dezember 2012

day18Wenn man einen Touchscreen hat, möchte man gerne mit Gesten, wie pinch to zoom nutzen, um z.B. sich Details auf der Karte näher anzusehen.
Natürlich macht libgdx dies uns wieder so einfach wie möglich.

Erinnerst du dich noch an die InputProcessoren von Tag 3. Wir hatten uns selbst erst einen geschrieben und dann den von der Stage genommen. Man kann aber auch mehrere InputProcessoren zusammenfassen. Der zweite InputProcessor kriegt dann das Event nur, wenn der erste es durchlässt. (z.B. wenn man keinen Button gedrückt hat).

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(new GameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);

Libgdx bietet nun ein Interface GestureListener an, dass man implementieren muss:

public class MyGestureListener implements GestureListener {

	@Override
	public boolean zoom (float originalDistance, float currentDistance) {
		return false;
	}

	@Override
	public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer) {
		return false;
	}

	@Override
	public boolean touchDown(float x, float y, int pointer, int button) {
		return false;
	}

	@Override
	public boolean tap(float x, float y, int count, int button) {
		return false;
	}

	@Override
	public boolean longPress(float x, float y) {
		return false;
	}

	@Override
	public boolean fling(float velocityX, float velocityY, int button) {
		return false;
	}

	@Override
	public boolean pan(float x, float y, float deltaX, float deltaY) {
		return false;
	}
}

// [...]
Gdx.input.setInputProcessor(new GestureDetector(new MyGestureListener()));

Dieses Interface übergibt man dann einem GestureDetector (der ein InputProcessor ist) und schon bekommt man alle Gesten übermittelt.

Eine Erklärung aller Methoden findet man in der API.

Ich hab das Zoomen mal eingebaut für die Tilemap. Hierbei ist zu beachten, dass man jedes Mal die ursprüngliche Entfernung der Finger und die momentane Entfernung der Finger mitgegeben bekommt. Man muss sich also anfangs immer den ursprünglichen Zoom der Kamera merken und mit diesem rechnen.

float origDistance;
float origZoom;
public boolean zoom (float originalDistance, float currentDistance) {
	if(originalDistance != origDistance){
		origDistance = origDistance;
		origZoom = camera.zoom;
	}
	camera.zoom = origZoom*currentDistance/originalDistance;
	return false;
}

20121218_09113520121218_09113020121218_091125

geposted in libgdx

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.