2017-05-29 51 views
0

我想創建一個黑色的矩形,當我的應用程序完成某個動作時會淡入,但我似乎無法找到一種方法來做到這一點。我創建了一個擴展Scene2D的演員一個新的Rectangle類,這是它的外觀:如何使一個「手工製作」的演員褪色LibGDX

public class Rectangle extends Actor{ 
    private Texture texture; 

    public Rectangle(float x, float y, float width, float height, Color color) { 
     createTexture((int)width, (int)height, color); 

     setX(x); 
     setY(y); 
     setWidth(width); 
     setHeight(height); 
    } 

    private void createTexture(int width, int height, Color color) { 
     Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888); 
     pixmap.setColor(color); 
     pixmap.fillRectangle(0, 0, width, height); 
     texture = new Texture(pixmap); 
     pixmap.dispose(); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     Color color = getColor(); 
     batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
     batch.draw(texture, getX(), getY(), getWidth(), getHeight()); 
    } 
} 

問題是,當我繪製矩形,我必須設定一個恆定parentAlpha。如果我撥打:

rectangle.addAction(alpha(0.5f)); 

它不會做任何事情,因爲alpha不會改變。有沒有辦法做到這一點,而沒有一個固定的parentAlpha?

回答

0

固定parentAlpa意味着什麼?

從您的問題,您要fade in一個黑色的矩形。要將您的演員的Alpha值設置爲零,並在屏幕上顯示時添加fadeIn()動作。

public class MultiLine extends ApplicationAdapter { 

    Stage stage; 

    @Override 
    public void create() { 

    stage=new Stage(); 

    RectActor rectActor=new RectActor(100,100,100,100, Color.BLACK); 
    RectActor rectActor1=new RectActor(150,150,100,100, Color.BLACK); 

    stage.addActor(rectActor1); 
    stage.addActor(rectActor); 

    rectActor.getColor().a=0;    //Make transparent 
    rectActor.addAction(Actions.fadeIn(1f)); // In one second rectActor appear on Screen. 
    } 

    @Override 
    public void render() { 

    Gdx.gl.glClearColor(1,0,0,0); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    stage.draw(); 
    stage.act(); 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
    } 
} 

Rectangle已經在API中,所以最好使用不同的名稱。

public class RectActor extends Actor { 

    private Texture texture; 

    public RectActor(float x, float y, float width, float height, Color color) { 
     createTexture((int)width, (int)height, color); 

     setX(x); 
     setY(y); 
     setWidth(width); 
     setHeight(height); 
    } 

    private void createTexture(int width, int height, Color color) { 
     Pixmap pixmap = new Pixmap(width, height, Pixmap.Format.RGBA8888); 
     pixmap.setColor(color); 
     pixmap.fillRectangle(0, 0, width, height); 
     texture = new Texture(pixmap); //creating texture for each RectActor is not profitable so create once and share in all RectActor 
     pixmap.dispose(); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     Color color = getColor(); 
     batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
     batch.draw(texture, getX(), getY(), getWidth(), getHeight()); 
    } 
} 
+0

我知道這聽起來很奇怪,但是有可能在不將矩形添加到舞臺的情況下實現這一點? – vladutelu

+0

如果你不想添加到Stage中,你爲什麼要把Rect作爲'Actor'?你想如何手動繪製你的'Actor'而不是通過Stage的'draw()'方法。最好創建一個'Sprite'對象而不是'Actor',它也有自己的顏色,並根據一些時間邏輯計算手動改變他的alpha值。詢問如果你需要幫助。 – Aryan

+0

我正在創建它作爲演員,因爲演員api已經有淡入,淡出等內置動作,並節省了我一些時間。我不知道如何創建自己在指定時間內完成的動作 – vladutelu