2013-05-04 163 views
3

我不知道是否有辦法影響Actors孩子,當他們的父母Group被修改?像他們給他附加了。通過修改我的意思是做一些傳統的行爲,如翻譯,旋轉,規模...LibGDX - 修改組會影響孩子嗎?

我知道這是可能的父alpha通過draw()方法影響兒童的alpha,但其他屬性呢?

例如,如果我將TranslationAction添加到我的Group我希望它也影響兒童。

所以我在Scene2d API中錯過了這樣的東西,還是我真的必須自己編寫它(不難,但只是想盡量避免)?

如果實際API無法實現,那麼使用Group的目的是什麼?

+0

我想你需要重寫你的例子中的'addAction'方法。據我所知,沒有一個功能可以爲你的所有「組」添加一個「action」。也許這是一個很好的提到添加到系統?! – BennX 2013-05-05 12:21:37

回答

4

你的問題的答案是肯定的,不是。這是因爲Scene2d API是圍繞使用SpriteBatch設計的,它設置了父代和子代演員之間的各種轉換信息。

如果您正在使用SpriteBatch(即繪製紋理等),那麼應用於父項的yes操作也會影響子項。有一些演員,如果我沒記錯的幾個例外,但我認爲這只是有事情喜歡的顏色做,等

如果使用SpriteBatch(即直接與OpenGL繪圖的幾何形狀,或在Scene2d API提供的內容之外的自定義繪圖操作(如網格)),那麼不會有任何操作影響孩子。您必須編寫自己的代碼才能完成此任務,方法是對Scene2d進行子類化或爲自己創建簡單的內容。我知道這不是有史以來最好的事情,但'Libgdx嘗試不成爲'最終,全部'解決方案'。

如何變換工作的'魔術'位於組(link to source)。組類使用一個名爲drawChildren()的方法遍歷子元素並基於轉換後的SpriteBatch繪製它們。轉換髮生在Group類的draw()方法中。

沒有一些示例代碼,這不是一個真正的答案,我會假設你知道如何設置皮膚。下面的程序的最終結果是組按鈕將在50,100和Hello按鈕將在100,50。注意我沒有對Group按鈕做任何直接的修改,但是我把它放在一個組裏,並且翻譯了整個組。

public class Groups implements ApplicationListener { 
    private Stage stage; 
    private Skin uiSkin; 

    @Override public void create() { 
     this.stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false); 
     Gdx.input.setInputProcessor(this.stage); 

     this.uiSkin = new Skin(Gdx.files.internal("skin/uiskin.json")); 

     final TextButton plainTextButton = new TextButton("Hello", this.uiSkin); 
     this.stage.addActor(plainTextButton); 

     final Group group = new Group(); 
     final TextButton groupTextButton = new TextButton("Group", this.uiSkin); 
     group.addActor(groupTextButton); 
     this.stage.addActor(group); 

     plainTextButton.addAction(Actions.moveBy(100, 50)); 
     group.addAction(Actions.moveBy(50, 100)); 

     Gdx.gl20.glClearColor(0f, 0f, 0f, 1); 
     Gdx.gl20.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 
    } 

    @Override public void render() { 
     this.stage.act(); 
     Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     this.stage.draw(); 
    } 

    @Override public void dispose() {} 
    @Override public void resize(final int width, final int height) {} 
    @Override public void pause() {} 
    @Override public void resume() {} 
} 

希望這會給你足夠的信息和關於Scene2d的一些解釋。

+0

非常感謝您的回答,因爲我剛剛在一個「Group」上測試了一些「行動」,只是畫出了精靈的演員,而且翻譯確實會影響所有的孩子。除了像你說的「顏色」這樣的屬性,我想知道爲什麼。我在測試之前問過這個問題,因爲我查看了源代碼,並且不明白* drawChildren()*方法使用了矩陣。 – Flawyte 2013-05-05 20:23:45