android遊戲開發框架libgdx的使用(六)–演員和演出 – Android移動開發技術文章_手機開發 Android移動開發教學課程

上一篇說到UI,然後之前說到舞臺,現在我們可以很輕松的構建一出戲瞭。

因為actor類在繪制是以x,y值為基準,所以我們可以通過控制x,y值變化演員的位置,但是演員的其他效果需要配合Action類進行操作。

Action類是一個抽象類,所有的具體實現都在com.badlogic.gdx.scenes.scene2d.actions包中。

actions

而包中的類依功能而言可以分為兩類:

  1. 控制Action
  2. 表現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秒。

 

一個個寫例子太麻煩瞭,而且實際運用中也多是多個組合運用,下面來看一個綜合性的示例:

我們的主角是star

通過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 

 

    } 

 

}

 

 

效果(圖片有點大…多等等):

xingxing

其實每個action的用法都很簡單,主要問題是怎麼組合排列來顯示一種符合需求的效果。

我發現libgdx的更新不是一般快,每天都有幾個版本的。那個通過文件配置UI樣式讓我覺得非常有意思,但是具體操作中有諸多問題。

 


作者:黃雲坤
出處:http://www.cnblogs.com/htynkn/

發佈留言