我们正在从 JavaFX 过渡到 libGDX。想知道是否有等同于 PathTransition 的东西在 libGDX 中。
PathTransition 特别棒的地方在于它会在遍历路径时相应地旋转您的节点。 PathTransition 的不足之处在于需要自己计算速度,也就是说只提供遍历需要多长时间,但需要自己计算出路径有多长,这样才能设置合适的时长.
希望 libGDX 有类似或更好的 PathTransition 改进版本。
最佳答案
根据您发布的示例,我认为 libGDX 中没有直接等效项,但我们可以创建一个。
libGDX 带有一个名为 Scene2d 的场景图它允许您将 Action 应用于 Actor 或 Actor 组。内置了一堆 Action (MoveTo、RotateBy),您可以并行或顺序执行它们。您还可以申请 Interpolation补间类。
libGDX 还附带一个 Path界面,但从 1.9.4 开始,没有 PathAction,但这并不意味着您不能构建如下所示的东西:
package tech.otter.gdxsandbox.demos;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.math.CatmullRomSpline;
import com.badlogic.gdx.math.Path;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
public class PathDemo extends Demo {
private ShapeRenderer sr;
private Stage stage;
public PathDemo() {
super("Action Demo");
stage = new Stage();
}
@Override
public void show() {
sr = new ShapeRenderer();
Actor ourCircle = new SimpleCircleActor(sr, 10f);
stage.addActor(ourCircle);
ourCircle.addAction(new PathAction(5f, 50f, 50f, 100f, 60f, 300f, 200f, 100f, 400f));
}
@Override
public void render(float delta) {
sr.setAutoShapeType(true);
sr.begin();
sr.set(ShapeRenderer.ShapeType.Filled);
stage.act(delta);
stage.draw();
sr.end();
}
@Override
public void dispose() {
stage.dispose();
sr.dispose();
}
private class SimpleCircleActor extends Actor {
private ShapeRenderer renderer;
private float radius;
public SimpleCircleActor(ShapeRenderer renderer, float radius) {
this.renderer = renderer;
this.radius = radius;
}
/**
* Assumes something outside is setting the ShapeRenderer type/begin/end.
* Don't do this at home, kids.
*/
@Override
public void draw(Batch batch, float delta) {
renderer.circle(this.getX(), this.getY(), this.radius);
}
}
private class PathAction extends Action {
private Path<Vector2> path;
private float current;
private float duration;
public PathAction(float duration, float... coordinates) {
this.duration = duration;
this.current = 0;
Vector2[] dataSet = new Vector2[coordinates.length / 2];
for(int i = 0; i < dataSet.length; i++) {
dataSet[i] = new Vector2(coordinates[2*i], coordinates[2*i+1]);
}
this.path = new CatmullRomSpline<Vector2>(dataSet, true);
}
@Override
public boolean act(float delta) {
if(duration == current) return true; // The action has already completed.
if(current + delta >= duration) {
current = duration;
} else {
current += delta;
}
Vector2 out = new Vector2(); // Get our position on the path.
this.path.valueAt(out, current / duration);
this.actor.setPosition(out.x, out.y);
return duration == current; // Return whether we are now complete.
}
}
}
关于java - 在 libGDX 中是否有 JavaFX 的 PathTransition 等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40856530/