2016-07-18 5 views
0

Я пытаюсь оживить всех актеров на сцене, но FadeOut Действие не работает , хотя другие действия работают отличноFadeOut Действие в libgdx

У меня есть следующий код

getRoot().setPosition(Gdx.graphics.getWidth(), 0); 
getRoot().getColor().a = 0; 
SequenceAction sequenceAction = new SequenceAction(); 
sequenceAction.addAction(Actions.moveTo(0, 0, 3.0f)); 
sequenceAction.addAction(Actions.fadeOut(3.0f)); 
getRoot().addAction(sequenceAction); 

я также попробовал другой способ оживить их с помощью TweenEngine class GroupAccessor implements TweenAccessor<Group> и все работает отлично, за исключением манипулирования альфа-значение

public class GroupAccessor implements TweenAccessor<Group> { 

    public static final int ALPHA = 0; 
    public static final int POS_XY = 1; 

    @Override 
    public int getValues(Group target, int tweenType, float[] returnValues) { 
     switch (tweenType) { 
      case ALPHA : 
       returnValues[0] = target.getColor().a; 
       return 1; 
      case POS_XY : 
       returnValues[0] = target.getX(); 
       returnValues[1] = target.getY(); 
       return 2; 
      default: 
       assert false; 
       return -1; 
     } 
    } 

    @Override 
    public void setValues(Group target, int tweenType, float[] newValues) { 
     switch (tweenType) { 
      case ALPHA : 
       target.setColor(target.getColor().r, target.getColor().g, target.getColor().b, 
         newValues[0]); 
       break; 
      case POS_XY : 
       target.setPosition(newValues[0], newValues[1]); 
       break; 
      default: 
       assert false; 
     } 
    } 
} 

Анимация с использованием TweenEngine

Timeline.createSequence(). 
       push(Tween.set(getRoot(), GroupAccessor.POS_XY).target(Gdx.graphics.getWidth(),0)) 
       .push(Tween.to(getRoot(), GroupAccessor.POS_XY, 3.0f).target(0,0)) 
       .push(Tween.set(getRoot(), GroupAccessor.ALPHA).target(0)) 
       .push(Tween.to(getRoot(), GroupAccessor.ALPHA, 3.0f).target(1)).start(manager); 

У меня есть несколько актеров, и я создал массивы некоторых из этих актеров. Вот 2 примера ничьи() метод 2 актеров

public void draw(Batch batch, float parentAlpha) { 
     batch.draw(wallSprite, 0, 0, Constants.WIDTH, Constants.HEIGHT); 
    } 

public void draw(Batch batch, float parentAlpha) { 
     batch.draw(gearSprite, getX(), getY(), 
       gearSprite.getOriginX(), gearSprite.getOriginY(), gearSprite.getWidth(), 
       gearSprite.getHeight(), gearSprite.getScaleX(), gearSprite.getScaleY() 
       , gearSprite.getRotation()); 
     try { 
      batch.draw(permittedCSprite, getX() + gearSprite.getWidth()/2 
          - permittedCSprite.getWidth()/2, getY() + 
          gearSprite.getHeight()/2 - permittedCSprite.getHeight()/2, 
        permittedCSprite.getWidth(), permittedCSprite.getHeight()); 
     } 
     catch (NullPointerException e) {} 
    } 
+0

Если вы используете пользовательский подкласс Acer, пожалуйста, покажите его методом 'draw'. – Tenfour04

+0

вопрос редактируется. – MAGS94

ответ

4

draw метод актера абсолютно необходимо установить цвет на Batch. Это необходимо для поддержки замирания. Даже если вы не заботитесь о постепенном исчезновении или изменении цвета актера, вам все равно нужно будет изменить цвет партии до WHITE, чтобы обеспечить, какой цвет актер рисуется (потому что нет гарантии того, какой цвет какой-либо другой актер покинул партию в

как правило, вы бы что-то вроде этого в верхней части метода вытяжки:.

public void draw (Batch batch, float parentAlpha) { 
    Color color = getColor(); 
    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
    //... 
} 

Однако, если актер рисует Sprite вместо TextureRegion, то вам должен установить цвет на Sprite. Это связано с тем, что у спрайтов есть свой цвет, который они передают в пакет, когда вы звоните sprite.draw.

Если вы используете Sprite (который я не рекомендую с Актеров), ваш метод рисования должен выглядеть примерно так:

public void draw (Batch batch, float parentAlpha) { 
    sprite.setColor(getColor()); 
    sprite.draw(batch, parentAlpha); 
} 

One «Гоча» является то, что Sprite является подклассом TextureRegion. Sprite - это TextureRegion, который содержит информацию о цвете, размере, ориентации, позиции и т. Д., Поэтому его можно сделать немного быстрее (возможно), чем TextureRegion. Он делает это за счет использования большего объема памяти. Если вы используете Sprite, вы должны звонить sprite.drawнеbatch.draw(sprite ...), потому что второй вариант рассматривает спрайт как TextureRegion.

Если вы хотите использовать Sprite, вам необходимо применить все атрибуты, необходимые для спрайта. Например:

public void draw (Batch batch, float parentAlpha) { 
    sprite.setColor(getColor()); 
    sprite.setPosition(getX(), getY()); 
    sprite.setSize(getWidth(), getHeight()); 
    //etc. etc. etc. :(
    sprite.draw(batch, parentAlpha); 
} 

По этой причине, это действительно не имеет смысла использовать Sprite в актере вообще. Слишком много избыточности. Просто используйте TextureRegions.

+0

Я использую спрайты, потому что я хочу сделать эффекты для этих спрайтов движком движений, и я хочу, чтобы все спрайты были в одном акторе, поэтому я использую спрайт вместо области текстуры – MAGS94

 Смежные вопросы

  • Нет связанных вопросов^_^