2017-04-18 46 views
-1

我正在研究像Candy Crush这样的游戏,并且我一直在面对用户级别升高时弹出的问题。我最近发布了一个问题,以显示在字体中弹出,并得到它解决: Unable to Draw Sprite after Camera.Update in LibGDX无法在使用吐温的Libgdx中动画精灵

但现在我想动画,使用吐温引擎弹出,它不工作的原因。我在游戏的其他部分使用了吐温引擎来使硬币反弹并消失,这与以下代码一起工作正常。

衰落动画:

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); 

以上两者都在工作。但是对于我在上面提到的链接中提到的弹出窗口,我想要创建像弹性(变大 - 变小 - 变小)和动画不工作的动画。

我使用下面的代码合并与链接所示的代码: Unable to Draw Sprite after Camera.Update in LibGDX

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; 


} 

这里是我的渲染代码()方法:

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等级:

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; 
    } 

} 

}

请给我你做的错误的建议。

+0

显示你的'SpriteAccessor'类 – Aryan

+0

Hie,@Abhishek Aryan我上面已经更新并添加了SpriteAccessor类 –

回答

0

使用低于Accessor,几乎所有类型的属性,你想补间,你使用Accessor.POSITION_XY补间你的xUp的levelUp雪碧的位置,但你的要求是扩大和缩小你的雪碧。

您必须在您的精灵上调用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; 
     } 
    } 
}