Animation 在Libgdx中定位和旋转动画
我有20个唾沫,我想他们是动画时,一个按钮被点击。 两种类型的动画1)位置2)旋转Animation 在Libgdx中定位和旋转动画,animation,opengl-es,libgdx,Animation,Opengl Es,Libgdx,我有20个唾沫,我想他们是动画时,一个按钮被点击。 两种类型的动画1)位置2)旋转 有推荐的方法吗?我能想到的唯一方法是在Render方法上使用delta值递归调用setposition和angle,直到达到所需的位置和角度
有推荐的方法吗?我能想到的唯一方法是在Render方法上使用delta值递归调用setposition和angle,直到达到所需的位置和角度当你有一个开始状态和一个结束状态,并且你想要填入中间状态时,这就是所谓的'TWEENEN(从中间)。它来源于卡通动画,但已被广泛使用 LibGDX使用通用Tween引擎。你可以开始你的旅程,以动画任何你想要的。但是,为了更详细地说明它是如何工作的,这里有一个来自我自己的一些东西的例子。关于精灵,有一个类似的用例,但我将精灵包装在一个更通用的类JJRenderNode中。这是我如何让我的班级对被吐温敞开大门的 首先,你需要一个吐温助教来帮助你想要吐温的班级
public class RenderNodeTweenAccessor implements TweenAccessor<JJRenderNode> {
public static final int WIDTH = 1;
public static final int HEIGHT = 2;
public static final int WIDTH_HEIGHT = 3;
public static final int ALPHA = 4;
public static final int ALPHA_WIDTH_HEIGHT=5;
@Override
public int getValues(JJRenderNode target, int tweenType, float[] returnValues) {
switch (tweenType) {
case WIDTH:
returnValues[0] = target.getWidth();
return 1;
case HEIGHT:
returnValues[0] = target.getHeight();
return 1;
case WIDTH_HEIGHT:
returnValues[0] = target.getWidth();
returnValues[1] = target.getHeight();
return 2;
case ALPHA:
returnValues[0] = target.getColour().a;
return 1;
case ALPHA_WIDTH_HEIGHT:
returnValues[0] = target.getColour().a;
returnValues[1] = target.getWidth();
returnValues[2] = target.getHeight();
return 3;
default:
assert false;
return -1;
}
}
@Override
public void setValues(JJRenderNode target, int tweenType, float[] newValues) {
switch (tweenType) {
case WIDTH:
target.setWidth(newValues[0]);
break;
case HEIGHT:
target.setHeight(newValues[0]);
break;
case WIDTH_HEIGHT:
target.setWidth(newValues[0]);
target.setHeight(newValues[1]);
break;
case ALPHA:
target.getColour().a=newValues[0];
break;
case ALPHA_WIDTH_HEIGHT:
target.getColour().a=newValues[0];
target.setWidth(newValues[1]);
target.setHeight(newValues[2]);
default:
break;
}
}
}
然后你可以自由地在你的班级之间穿行,例如:
Timeline.createSequence()
.push(Tween.set(node, RenderNodeTweenAccessor.WIDTH_HEIGHT).target(START_WIDTH, START_WIDTH))
.push(Tween.to(node, RenderNodeTweenAccessor.WIDTH_HEIGHT, 0.4f).target(PuzzleBlockCore.MAX_RENDER_WIDTH, PuzzleBlockCore.MAX_RENDER_WIDTH))
.start(JJ.tweenManager);
另外,您还需要一个TweenManger的实例,并且需要为每个gameloop使用delta进行更新。我有一个“单独的”全局实例,我到处使用它(JJ.TWeEnMealm)。 < P>当你有一个开始状态和一个结束状态,并且你想要填入中间状态时,这就是所谓的“TWEENEN”(从中间)。它来源于卡通动画,但已被广泛使用 LibGDX使用通用Tween引擎。你可以开始你的旅程,以动画任何你想要的。但是,为了更详细地说明它是如何工作的,这里有一个来自我自己的一些东西的例子。关于精灵,有一个类似的用例,但我将精灵包装在一个更通用的类JJRenderNode中。这是我如何让我的班级对被吐温敞开大门的 首先,你需要一个吐温助教来帮助你想要吐温的班级
public class RenderNodeTweenAccessor implements TweenAccessor<JJRenderNode> {
public static final int WIDTH = 1;
public static final int HEIGHT = 2;
public static final int WIDTH_HEIGHT = 3;
public static final int ALPHA = 4;
public static final int ALPHA_WIDTH_HEIGHT=5;
@Override
public int getValues(JJRenderNode target, int tweenType, float[] returnValues) {
switch (tweenType) {
case WIDTH:
returnValues[0] = target.getWidth();
return 1;
case HEIGHT:
returnValues[0] = target.getHeight();
return 1;
case WIDTH_HEIGHT:
returnValues[0] = target.getWidth();
returnValues[1] = target.getHeight();
return 2;
case ALPHA:
returnValues[0] = target.getColour().a;
return 1;
case ALPHA_WIDTH_HEIGHT:
returnValues[0] = target.getColour().a;
returnValues[1] = target.getWidth();
returnValues[2] = target.getHeight();
return 3;
default:
assert false;
return -1;
}
}
@Override
public void setValues(JJRenderNode target, int tweenType, float[] newValues) {
switch (tweenType) {
case WIDTH:
target.setWidth(newValues[0]);
break;
case HEIGHT:
target.setHeight(newValues[0]);
break;
case WIDTH_HEIGHT:
target.setWidth(newValues[0]);
target.setHeight(newValues[1]);
break;
case ALPHA:
target.getColour().a=newValues[0];
break;
case ALPHA_WIDTH_HEIGHT:
target.getColour().a=newValues[0];
target.setWidth(newValues[1]);
target.setHeight(newValues[2]);
default:
break;
}
}
}
然后你可以自由地在你的班级之间穿行,例如:
Timeline.createSequence()
.push(Tween.set(node, RenderNodeTweenAccessor.WIDTH_HEIGHT).target(START_WIDTH, START_WIDTH))
.push(Tween.to(node, RenderNodeTweenAccessor.WIDTH_HEIGHT, 0.4f).target(PuzzleBlockCore.MAX_RENDER_WIDTH, PuzzleBlockCore.MAX_RENDER_WIDTH))
.start(JJ.tweenManager);
另外,您还需要一个TweenManger的实例,并且需要为每个gameloop使用delta进行更新。我有一个“singleton”全局实例,在任何地方都可以使用(JJ.TweenManager)。您也可以使用spine 2d制作动画。这很贵,但值得。我想,只要花60美元,你就可以获得libgdx的全面支持+骨骼装配和动画
private void render() {
sprite.set(aninationframes.get(currentFrame)
currentFrame = currentFrame + 1}
但是,如果确实希望仅使用libgdx制作动画,则可以创建包含所有精灵动画帧的列表,循环并将精灵纹理切换到动画中的下一帧
private void render() {
sprite.set(aninationframes.get(currentFrame)
currentFrame = currentFrame + 1}
不过,您可能需要为每帧添加一个延迟
If(current time - time > some value) {
sprite.set(animationframes.get(currrntFrame)
currentFrame = currentFrame + 1
time = get current time here
}
您也可以使用spine 2d进行动画。这很贵,但值得。我想,只要花60美元,你就可以获得libgdx的全面支持+骨骼装配和动画
private void render() {
sprite.set(aninationframes.get(currentFrame)
currentFrame = currentFrame + 1}
但是,如果确实希望仅使用libgdx制作动画,则可以创建包含所有精灵动画帧的列表,循环并将精灵纹理切换到动画中的下一帧
private void render() {
sprite.set(aninationframes.get(currentFrame)
currentFrame = currentFrame + 1}
不过,您可能需要为每帧添加一个延迟
If(current time - time > some value) {
sprite.set(animationframes.get(currrntFrame)
currentFrame = currentFrame + 1
time = get current time here
}
谢谢你的回复,你能给我一个很好的例子吗。假设我想要一个精灵从屏幕的顶部移动到底部。@pats添加了一个例子,这样你就可以看到它是否适合你的情况。谢谢你的回复,你能给我一个很好的例子吗。比如说我想要一个精灵从屏幕的顶部移动到底部。@pats添加了一个例子,这样你们就可以看到它是否适合你们的情况。这也是我的想法,我希望有更好的方法。谢谢这也是我的想法,我希望有更好的方法。谢谢