/** * Obtains the actor at (x,y) with TOLERANCE. * * <p>Creates a square with size = TOLERANCE and checks: * * <p>1. if some vertex from the TOLERANCE square is inside an actor bbox 2. if some actor bbox * vertex is inside the TOLERANCE square */ public InteractiveActor getInteractiveActorAtWithTolerance(float x, float y, float tolerance) { List<SceneLayer> layers = getLayers(); tmpToleranceRect.x = x - tolerance / 2; tmpToleranceRect.y = y - tolerance / 2; tmpToleranceRect.width = tolerance; tmpToleranceRect.height = tolerance; for (SceneLayer layer : layers) { if (!layer.isVisible()) continue; // Obtain actors in reverse (close to camera) for (int l = layer.getActors().size() - 1; l >= 0; l--) { BaseActor a = layer.getActors().get(l); if (a instanceof InteractiveActor && ((InteractiveActor) a).hasInteraction()) { if (a.hit(x, y) || a.hit(tmpToleranceRect.x, tmpToleranceRect.y) || a.hit(tmpToleranceRect.x + tmpToleranceRect.width, tmpToleranceRect.y) || a.hit(tmpToleranceRect.x, tmpToleranceRect.y + tmpToleranceRect.height) || a.hit( tmpToleranceRect.x + tmpToleranceRect.width, tmpToleranceRect.y + tmpToleranceRect.height)) return (InteractiveActor) a; float[] verts = a.getBBox().getTransformedVertices(); for (int i = 0; i < verts.length; i += 2) { float vx = verts[i]; float vy = verts[i + 1]; if (tmpToleranceRect.contains(vx, vy)) return (InteractiveActor) a; } } } } return null; }
/** Returns the actor at the position. */ public BaseActor getActorAt(float x, float y) { for (SceneLayer layer : layers) { if (!layer.isVisible()) continue; // Obtain actors in reverse (close to camera) for (int i = layer.getActors().size() - 1; i >= 0; i--) { BaseActor a = layer.getActors().get(i); if (a.hit(x, y)) { return a; } } } return null; }
/** * Returns the Interactive actor at the position. The actor must have the interaction property * enabled. */ public InteractiveActor getInteractiveActorAt(float x, float y) { for (SceneLayer layer : layers) { if (!layer.isVisible()) continue; // Obtain actors in reverse (close to camera) for (int i = layer.getActors().size() - 1; i >= 0; i--) { BaseActor a = layer.getActors().get(i); if (a instanceof InteractiveActor && ((InteractiveActor) a).hasInteraction() && a.hit(x, y)) { return (InteractiveActor) a; } } } return null; }