本文使用的libgdx是0.92版本,和現在的最新版可能有一些不一樣的地方。全文內容僅供參考。
上一篇說到UI,然後之前說到舞台,現在我們可以很輕鬆的構建一齣戲了。
因為actor類在繪製是以x,y值為基準,所以我們可以通過控制x,y值變化演員的位置,但是演員的其他效果需要配合Action類進行操作。
Action類是一個抽象類別,所有的具體實現都在com.badlogic.gdx.scenes.scene2d.actions包中。
而包中的類依功能而言可以分為兩類:
- 控制Action
- 表現Action
控制Action沒有直接表現效果,它操作的對象是表現Action。
比如Delay。
表現Action就是直接的表現效果,繼承自AnimationAction,操作對象是Actor。
比如MoveTo。
現在挨著說吧:
控制類:
Delay $ (Action action, float duration)
延遲duration秒執行action。
Forever $ (Action action)
一直執行action。
Parallel $ (Action... actions)
並行(同時)執行actions。
Repeat $ (Action action, int times)
重複action times次。
Sequence $ (Action... actions)
按順序執行actions。
Remove $ ()
刪除所有Action。
表現類:
FadeIn $ (float duration)FadeOut $ (float duration)
淡入淡出效果
FadeTo $ (float alpha, float duration)
duration秒改變至alpha。
MoveTo $ (float x, float y, float duration)MoveBy $ (float x, float y, float duration)
用duration移動到x,y處。
RotateBy $ (float rotation, float duration)RotateTo $ (float rotation, float duration)
用duration秒旋轉rotation度。
ScaleTo $ (float scaleX, float scaleY, float duration)
縮放x到scaleX,y到scaleY,用時duration秒。
一個個寫例子太麻煩了,而且實際運用中也多是多個組合運用,下面來看一個綜合性的樣本:
我們的主角是
通過action的組合實現閃爍,飛動,旋轉等效果。
代碼如下:
package com.cnblogs.htynkn.listener;import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.actions.FadeIn; import com.badlogic.gdx.scenes.scene2d.actions.FadeOut; import com.badlogic.gdx.scenes.scene2d.actions.MoveBy; import com.badlogic.gdx.scenes.scene2d.actions.MoveTo; import com.badlogic.gdx.scenes.scene2d.actions.Parallel; import com.badlogic.gdx.scenes.scene2d.actions.Repeat; import com.badlogic.gdx.scenes.scene2d.actions.RotateTo; import com.badlogic.gdx.scenes.scene2d.actions.Sequence; import com.badlogic.gdx.scenes.scene2d.actors.Image;public class FirstGame implements ApplicationListener { private Stage stage; private Texture texture; @Override public void create() { stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true); texture = new Texture(Gdx.files.internal("star.png")); texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); float duration = 4f; int maxwidth = Gdx.graphics.getWidth() - texture.getWidth(); int maxheight = Gdx.graphics.getHeight() - texture.getHeight(); for (int i = 0; i < 20; i++) { Image image = new Image("star" + i, texture); image.x = MathUtils.random(0, maxwidth); image.y = MathUtils.random(0, Gdx.graphics.getHeight()); //隨機出現 Action moveAction = Sequence.$(MoveTo.$(MathUtils.random(0, maxwidth), MathUtils.random(0, maxheight), duration / 2), MoveBy.$(MathUtils.random(0, maxwidth), MathUtils.random(0, maxheight), duration / 2)); //移動方向和地點隨機 Action rotateAction = RotateTo.$(360, duration); //旋轉 Action fadeAction = Repeat.$(Sequence.$(FadeOut.$(duration / 20), FadeIn.$(duration / 20)), 10); //閃爍,重複10次 image.action(Parallel.$(moveAction, rotateAction, fadeAction)); //所有action並行 stage.addActor(image); } Gdx.input.setInputProcessor(stage); } @Override public void dispose() { texture.dispose(); stage.dispose(); } @Override public void pause() { // TODO Auto-generated method stub } @Override public void render() { Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); stage.act(Gdx.graphics.getDeltaTime()); stage.draw(); } @Override public void resize(int width, int height) { // TODO Auto-generated method stub } @Override public void resume() { // TODO Auto-generated method stub }}
效果(圖片有點大...多等等):
其實每個action的用法都很簡單,主要問題是怎麼組合排列來顯示一種符合需求的效果。
我發現libgdx的更新不是一般快,每天都有幾個版本的。那個通過檔案配置UI樣式讓我覺得非常有意思,但是具體操作中有諸多問題。