net.dermetfan.gdx.scenes.scene2d.Scene2DUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of libgdx-utils Show documentation
Show all versions of libgdx-utils Show documentation
support library for libGDX
/** Copyright 2014 Robin Stumm ([email protected], http://dermetfan.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. */
package net.dermetfan.gdx.scenes.scene2d;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Event;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
/** provides useful methods for scene2d
* @author dermetfan */
public class Scene2DUtils {
/** Some methods return this, so if you get your hands on it make sure to make a copy! This is used internally so it might change unexpectedly. */
private static final Vector2 tmp = new Vector2();
/** @param c the event to copy to
* @param e the event to copy from */
public static void copy(Event c, Event e) {
c.setTarget(e.getTarget());
c.setStage(e.getStage());
c.setCapture(e.isCapture());
c.setBubbles(e.getBubbles());
c.setListenerActor(e.getListenerActor());
}
/** @see #copy(Event, Event) */
public static void copy(InputEvent c, InputEvent e) {
copy((Event) c, e);
c.setStageX(e.getStageX());
c.setStageY(e.getStageY());
c.setButton(e.getButton());
c.setCharacter(e.getCharacter());
c.setKeyCode(e.getKeyCode());
c.setPointer(e.getPointer());
c.setType(e.getType());
c.setRelatedActor(e.getRelatedActor());
c.setScrollAmount(e.getScrollAmount());
}
/** @param pos the coordinates
* @param actor the actor in which coordinate system pos is given
* @param other the actor into which coordinate system to convert the coordinates to
* @return the given position, converted
* @throws IllegalArgumentException if the given actors are not in the same hierarchy */
public static Vector2 localToOtherCoordinates(Vector2 pos, Actor actor, Actor other) {
Group lastParent = lastParent(actor);
if(lastParent == null || lastParent != lastParent(other))
throw new IllegalArgumentException(actor + " and " + other + " are not in the same hierarchy");
actor.localToAscendantCoordinates(lastParent, pos);
lastParent.localToDescendantCoordinates(other, pos);
return pos;
}
/** @param pos the position
* @param actor the actor to which coordinate system to convert */
public static Vector2 stageToLocalCoordinates(Vector2 pos, Actor actor) {
if(actor == actor.getStage().getRoot())
return pos;
return actor.getStage().getRoot().localToDescendantCoordinates(actor, pos);
}
/** @see #stageToLocalCoordinates(Vector2, Actor) */
public static Vector2 stageToLocalCoordinates(float x, float y, Actor actor) {
return stageToLocalCoordinates(tmp.set(x, y), actor);
}
/** @return the highest parent in the hierarchy tree of the given actor */
public static Group lastParent(Actor actor) {
if(!actor.hasParent())
return null;
Group parent = actor.getParent();
while(parent.hasParent())
parent = parent.getParent();
assert !parent.hasParent();
return parent;
}
/** @param actor the actor which position in stage coordinates to return
* @return the position of the given actor in the stage coordinate system */
public static Vector2 positionInStageCoordinates(Actor actor) {
if(actor.hasParent())
actor.localToStageCoordinates(tmp.set(0, 0));
else
tmp.set(actor.getX(), actor.getY());
return tmp;
}
/** Adds the given Actor to the given Group at the coordinates relative to the Stage.
* @param actor the Actor to add to the given Group
* @param newParent the Group to add the given Actor to */
public static void addAtStageCoordinates(Actor actor, Group newParent) {
tmp.set(positionInStageCoordinates(actor));
newParent.stageToLocalCoordinates(tmp);
newParent.addActor(actor);
actor.setPosition(tmp.x, tmp.y);
}
/** @see #pointerPosition(Stage, int) */
public static Vector2 pointerPosition(Stage stage) {
return pointerPosition(stage, 0);
}
/** @param stage the Stage which coordinate system should be used
* @param pointer the pointer which position to return
* @return the position of the given pointer in stage coordinates */
public static Vector2 pointerPosition(Stage stage, int pointer) {
tmp.set(Gdx.input.getX(pointer), Gdx.input.getY(pointer));
stage.screenToStageCoordinates(tmp);
return tmp;
}
}