2017-04-18 42 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; 
     } 
    } 
}