/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.designer.input; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; import com.happydroids.droidtowers.designer.Canvas; public class CanvasTouchListener extends InputListener { private final Canvas canvas; private Actor selectedObject; private Vector2 touchOffset; public CanvasTouchListener(Canvas canvas) { this.canvas = canvas; } @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { Rectangle rect = new Rectangle(); float scale = canvas.getScaleX(); for (Actor child : canvas.getChildren()) { rect.set(child.getX() * scale, child.getY() * scale, child.getWidth() * scale, child.getHeight() * scale); if (rect.contains(x, y)) { selectedObject = child; touchOffset = new Vector2(x - child.getX() * scale, y - child.getY() * scale); event.stop(); break; } } return true; } @Override public void touchDragged(InputEvent event, float x, float y, int pointer) { if (selectedObject != null) { float xPos = x - touchOffset.x; float yPos = y - touchOffset.y; int step = 8; xPos = step * MathUtils.floor(xPos / step); yPos = step * MathUtils.floor(yPos / step); float scale = canvas.getScaleX(); xPos = MathUtils.clamp(xPos, 0, (canvas.getWidth() - selectedObject.getWidth()) * scale); yPos = MathUtils.clamp(yPos, 0, (canvas.getHeight() - selectedObject.getHeight()) * scale); selectedObject.setPosition(xPos, yPos); event.stop(); } } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { if (selectedObject != null) { canvas.addActor(selectedObject); selectedObject = null; event.stop(); } } @Override public boolean scrolled(InputEvent event, float x, float y, int amount) { float scale = canvas.getScaleX(); scale += (float) amount / 10; System.out.println("scale = " + scale); canvas.setScale(scale); return true; } public void setSelectedObject(Actor selectedObject) { this.selectedObject = selectedObject; } public Actor getSelectedObject() { return selectedObject; } public void setTouchOffset(Vector2 touchOffset) { this.touchOffset = touchOffset; } public Vector2 getTouchOffset() { return touchOffset; } }