无法使用 Tween 在 Libgdx 中为 sprite 设置动画
Unable to animate sprite in Libgdx using Tween
我正在开发像 Candy Crush 这样的游戏,我一直面临着在用户升级时弹出窗口的问题。我最近发布了一个以字体显示弹出窗口的问题并解决了它:
但现在我想使用 Tween Engine 为弹出窗口制作动画,但由于某种原因它无法正常工作。我在游戏的其他部分使用了 Tween Engine 来使硬币反弹和淡出,这在下面的代码中运行良好。
淡入淡出动画:
plusTen = new Sprite(ten);
plusTen.setSize(1, 1);
plusTen.setPosition(object.getX(), object.getY());
Tween.set(plusTen, SpriteAccessor.ALPHA).target(1).start(game.tweenManager);
to(plusTen, SpriteAccessor.ALPHA, 0.7f).target(0).delay(0.7f).start(game.tweenManager);
弹跳动画:
sprite.setSize(1, 1);
sprite.setPosition(columnIndex, this.MAX_ROWS + 5);
sprite.setPosition(columnIndex, this.MAX_ROWS + 5);
Tween.to(sprite, Accessor.POSITION_Y, 0.8f)
.target(sprite.getY() - moveBy - 5)
.ease(Bounce.OUT)
.start(game.tweenManager);
以上两个都有效。但是对于上面提到的我创建的弹出窗口 link,我想创建弹性动画(变大-变小-变大-变小),但它不起作用。
我正在使用下面的代码与 link 中显示的代码合并:
private void initLevelUpAnimation() {
Log.d("Runnable", "animation method called");
levelUp = new Sprite(levelUpBG);
levelUp.setSize(265, 180);
levelUp.setPosition(gamePlayBG.getWidth() / 2 - levelUp.getWidth() / 2,
gamePlayBG.getHeight() / 2 - levelUp.getHeight() / 2);
Tween.to(levelUp, Accessor.POSITION_XY, 3.0f)
.ease(Elastic.INOUT)
.target(50,50)
.start(game.tweenManager);
stopGameObjects = true;
}
这是我的 render() 方法代码:
public void render(float delta) {
// TODO Auto-generated method stub
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
game.batch.begin();
game.batch.setProjectionMatrix(camera2.combined);
game.batch.draw(gamePlayBG, 0, 0);
if (gameOver != true) {
//Log.d("render------------", "render: "+ delta);
camera.update();
game.batch.setProjectionMatrix(camera.combined);
if (lineHud.size > 1) {
for (Sprite sprite : this.lineHud) {
sprite.draw(game.batch);
}
}
for (int i = 0; i < gameObjects.size; i++) {
gameObjects.get(i).draw(game.batch);
}
for (Sprite sprite : this.scoreHud) {
sprite.draw(game.batch);
}
if (stopGameObjects) {
game.batch.setProjectionMatrix(camera2.combined);
levelUp.draw(game.batch);
game.levelUpFont.drawMultiLine(game.batch, "LEVEL " + (baseLevel + 1),
(gamePlayBG.getWidth() / 2) - 55,
(gamePlayBG.getHeight() / 2) + 35);
game.levelUpFont.drawMultiLine(game.batch, "KEEP GOING",
(gamePlayBG.getWidth() / 2) - 90,
gamePlayBG.getHeight() / 2);
}
game.tweenManager.update(delta);
game.batch.end();
update(delta);
game.batch.setProjectionMatrix(camera2.combined);
}
这是我的 SpriteAccessor class :
public class SpriteAccessor implements TweenAccessor<Sprite> {
public static final int ALPHA = 0;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues) {
switch (tweenType){
case ALPHA:
returnValues[0] = target.getColor().a;
return 1;
default:
assert false;
return -1;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues) {
switch (tweenType){
case ALPHA:
target.setColor(target.getColor().r, target.getColor().g, target.getColor().b, newValues[0]);
break;
default:
assert false;
}
}
}
请对我做错的地方提出建议。
在下面使用 Accessor
几乎所有类型的 属性 您想要补间,您正在使用 Accessor.POSITION_XY
补间 levelUp Sprite 的 xy 位置,但您的要求是放大和缩小您的 Sprite。
您必须在精灵上调用 setOrigin 将原点设置为中间,否则默认为左下角。原点用于缩放和旋转。
public class SpriteAccessor implements TweenAccessor<Sprite> {
public static final int POS_XY = 1;
public static final int CPOS_XY = 2;
public static final int SCALE_XY = 3;
public static final int ROTATION = 4;
public static final int OPACITY = 5;
public static final int TINT = 6;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues) {
switch (tweenType) {
case POS_XY:
returnValues[0] = target.getX();
returnValues[1] = target.getY();
return 2;
case CPOS_XY:
returnValues[0] = target.getX() + target.getWidth()/2;
returnValues[1] = target.getY() + target.getHeight()/2;
return 2;
case SCALE_XY:
returnValues[0] = target.getScaleX();
returnValues[1] = target.getScaleY();
return 2;
case ROTATION: returnValues[0] = target.getRotation(); return 1;
case OPACITY: returnValues[0] = target.getColor().a; return 1;
case TINT:
returnValues[0] = target.getColor().r;
returnValues[1] = target.getColor().g;
returnValues[2] = target.getColor().b;
return 3;
default: assert false; return -1;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues) {
switch (tweenType) {
case POS_XY: target.setPosition(newValues[0], newValues[1]); break;
case CPOS_XY: target.setPosition(newValues[0] - target.getWidth()/2, newValues[1] - target.getHeight()/2); break;
case SCALE_XY: target.setScale(newValues[0], newValues[1]); break;
case ROTATION: target.setRotation(newValues[0]); break;
case OPACITY:
Color c = target.getColor();
c.set(c.r, c.g, c.b, newValues[0]);
target.setColor(c);
break;
case TINT:
c = target.getColor();
c.set(newValues[0], newValues[1], newValues[2], c.a);
target.setColor(c);
break;
default: assert false;
}
}
}
我正在开发像 Candy Crush 这样的游戏,我一直面临着在用户升级时弹出窗口的问题。我最近发布了一个以字体显示弹出窗口的问题并解决了它:
但现在我想使用 Tween Engine 为弹出窗口制作动画,但由于某种原因它无法正常工作。我在游戏的其他部分使用了 Tween Engine 来使硬币反弹和淡出,这在下面的代码中运行良好。
淡入淡出动画:
plusTen = new Sprite(ten);
plusTen.setSize(1, 1);
plusTen.setPosition(object.getX(), object.getY());
Tween.set(plusTen, SpriteAccessor.ALPHA).target(1).start(game.tweenManager);
to(plusTen, SpriteAccessor.ALPHA, 0.7f).target(0).delay(0.7f).start(game.tweenManager);
弹跳动画:
sprite.setSize(1, 1);
sprite.setPosition(columnIndex, this.MAX_ROWS + 5);
sprite.setPosition(columnIndex, this.MAX_ROWS + 5);
Tween.to(sprite, Accessor.POSITION_Y, 0.8f)
.target(sprite.getY() - moveBy - 5)
.ease(Bounce.OUT)
.start(game.tweenManager);
以上两个都有效。但是对于上面提到的我创建的弹出窗口 link,我想创建弹性动画(变大-变小-变大-变小),但它不起作用。
我正在使用下面的代码与 link 中显示的代码合并:
private void initLevelUpAnimation() {
Log.d("Runnable", "animation method called");
levelUp = new Sprite(levelUpBG);
levelUp.setSize(265, 180);
levelUp.setPosition(gamePlayBG.getWidth() / 2 - levelUp.getWidth() / 2,
gamePlayBG.getHeight() / 2 - levelUp.getHeight() / 2);
Tween.to(levelUp, Accessor.POSITION_XY, 3.0f)
.ease(Elastic.INOUT)
.target(50,50)
.start(game.tweenManager);
stopGameObjects = true;
}
这是我的 render() 方法代码:
public void render(float delta) {
// TODO Auto-generated method stub
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
game.batch.begin();
game.batch.setProjectionMatrix(camera2.combined);
game.batch.draw(gamePlayBG, 0, 0);
if (gameOver != true) {
//Log.d("render------------", "render: "+ delta);
camera.update();
game.batch.setProjectionMatrix(camera.combined);
if (lineHud.size > 1) {
for (Sprite sprite : this.lineHud) {
sprite.draw(game.batch);
}
}
for (int i = 0; i < gameObjects.size; i++) {
gameObjects.get(i).draw(game.batch);
}
for (Sprite sprite : this.scoreHud) {
sprite.draw(game.batch);
}
if (stopGameObjects) {
game.batch.setProjectionMatrix(camera2.combined);
levelUp.draw(game.batch);
game.levelUpFont.drawMultiLine(game.batch, "LEVEL " + (baseLevel + 1),
(gamePlayBG.getWidth() / 2) - 55,
(gamePlayBG.getHeight() / 2) + 35);
game.levelUpFont.drawMultiLine(game.batch, "KEEP GOING",
(gamePlayBG.getWidth() / 2) - 90,
gamePlayBG.getHeight() / 2);
}
game.tweenManager.update(delta);
game.batch.end();
update(delta);
game.batch.setProjectionMatrix(camera2.combined);
}
这是我的 SpriteAccessor class :
public class SpriteAccessor implements TweenAccessor<Sprite> {
public static final int ALPHA = 0;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues) {
switch (tweenType){
case ALPHA:
returnValues[0] = target.getColor().a;
return 1;
default:
assert false;
return -1;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues) {
switch (tweenType){
case ALPHA:
target.setColor(target.getColor().r, target.getColor().g, target.getColor().b, newValues[0]);
break;
default:
assert false;
}
}
}
请对我做错的地方提出建议。
在下面使用 Accessor
几乎所有类型的 属性 您想要补间,您正在使用 Accessor.POSITION_XY
补间 levelUp Sprite 的 xy 位置,但您的要求是放大和缩小您的 Sprite。
您必须在精灵上调用 setOrigin 将原点设置为中间,否则默认为左下角。原点用于缩放和旋转。
public class SpriteAccessor implements TweenAccessor<Sprite> {
public static final int POS_XY = 1;
public static final int CPOS_XY = 2;
public static final int SCALE_XY = 3;
public static final int ROTATION = 4;
public static final int OPACITY = 5;
public static final int TINT = 6;
@Override
public int getValues(Sprite target, int tweenType, float[] returnValues) {
switch (tweenType) {
case POS_XY:
returnValues[0] = target.getX();
returnValues[1] = target.getY();
return 2;
case CPOS_XY:
returnValues[0] = target.getX() + target.getWidth()/2;
returnValues[1] = target.getY() + target.getHeight()/2;
return 2;
case SCALE_XY:
returnValues[0] = target.getScaleX();
returnValues[1] = target.getScaleY();
return 2;
case ROTATION: returnValues[0] = target.getRotation(); return 1;
case OPACITY: returnValues[0] = target.getColor().a; return 1;
case TINT:
returnValues[0] = target.getColor().r;
returnValues[1] = target.getColor().g;
returnValues[2] = target.getColor().b;
return 3;
default: assert false; return -1;
}
}
@Override
public void setValues(Sprite target, int tweenType, float[] newValues) {
switch (tweenType) {
case POS_XY: target.setPosition(newValues[0], newValues[1]); break;
case CPOS_XY: target.setPosition(newValues[0] - target.getWidth()/2, newValues[1] - target.getHeight()/2); break;
case SCALE_XY: target.setScale(newValues[0], newValues[1]); break;
case ROTATION: target.setRotation(newValues[0]); break;
case OPACITY:
Color c = target.getColor();
c.set(c.r, c.g, c.b, newValues[0]);
target.setColor(c);
break;
case TINT:
c = target.getColor();
c.set(newValues[0], newValues[1], newValues[2], c.a);
target.setColor(c);
break;
default: assert false;
}
}
}