LibGDX_4.8:動作(Action)


このリンクは次のとおりです.http://blog.csdn.net/xietansheng/article/details/50187485
LibGDX基本チュートリアル(総目次)
1.概要
アクション(Action)は、俳優に付加された所定時間内に時間が経つにつれて実行されるいくつかのタスクロジックである.前の章で紹介した俳優はみな静的で動かないので、俳優に動作を付加することで俳優自身が「動く」ことができ、AndroidにViewに追加されたアニメーション(Animation)に相当する.
2.動作の分類
LibGDXのすべての動作はAction抽象クラスから継承され、すべての動作実装はcom.badlogic.gdx.scenes.scene 2 d.actionsパッケージにあります.よく使われる動作は、特効系動作と制御系動作の2種類に分けられます.
(1)特効類動作
特殊効果系の動作は俳優の状態(位置、サイズ、回転角度、スケール比、透明度など)を変え、絶対動作や相対動作に細分化することもできます.
絶対動作(現在の状態から指定された状態に遷移する動作で、結果的に位置が確定し、元の位置とは関係ありません):
  • MoveToAction:俳優を現在位置から指定位置
  • に移動する
  • RotateToAction:俳優を現在の角度から指定された角度に回転させる
  • ScaleToAction:現在のスケーリング値から指定したスケーリング値
  • に俳優を移行する.
  • SizeToAction:現在のサイズ(幅の高さ)から指定サイズ(幅の高さ)
  • に俳優を移行する
  • AlphaAction:俳優の透明度を現在のalpha値から指定したalpha値
  • に移行する
    相対動作(現在の状態に基づいて、ある状態の値に増分を加え、結果の位置は元の位置に対して):
  • MoveByAction:俳優が現在位置に基づいて指定距離
  • を移動する
  • RotateByAction:俳優が現在の角度値に基づいて指定された角度
  • を回転する
  • ScaleByAction:現在のスケーリング値に基づいて俳優が再スケーリング
  • を行う
  • SizeByAction:俳優が現在のサイズに基づいて指定のサイズを追加する
  • (2)制御類動作
    制御系の動作自体は一般的に俳優の状態を変えることはなく、動作の実行を制御するために用いられる(動作のパッケージに対しても、それ自体が動作である)だけで、動作を制御する動作である.
  • SequenceAction:1つまたは複数のアクションを含むシーケンスアクション.これらのアクションはシーケンス順に実行されます.
  • ParallelAction:並列動作で、1つ以上の動作を含み、これらの動作は同時に実行されます.
  • RepeatAction:動作を繰り返し、1つの動作を含み、この含まれる動作を繰り返し実行する.
  • DelayAction:遅延動作は、通常、シーケンス動作の動作シーケンスに追加して使用されます.例えば、ある動作を順番に実行した後、1つの遅延動作(指定時間遅延)を実行してから、次の動作を続行します.
  • AfterAction:他の動作とともに俳優に追加された動作を含み、俳優の他のすべての動作が実行された後、そのAfterActionに含まれる動作を実行する.
  • RunnableAction:指定したタイミングで独自のコードを実行できるRunnableインスタンスが含まれます.例えば、1つのRunnableActionをシーケンス動作の最後に追加すると、シーケンス動作の実行が完了したときに、独自のRunnable内のrun()メソッド内のコードを実行することができる.

  • 3.コード例
    特に注意:アクションは俳優に付加して実行する必要がある(本質的には俳優の状態属性値を動的に変更する)ため、プレゼンテーションアクションの使用には、まずカスタマイズされた俳優が必要である.ここでは、前の章のカスタマイズされた俳優を直接引用することはできない.前の章の俳優は位置、サイズ、スケール比、回転角度しか処理していないからだ.(それぞれ、Move、Size、Scale、Rotateの4つの動作で変更するターゲットステータス属性に対応しています).ここにはもう1つのAlphaAction動作があり、AlphaActionで変更するターゲット属性は俳優のalpha属性なので、前章でカスタマイズした俳優をエンハンスメントして、描画時にcolor/alpha属性を処理します.以下のコードに示します.
    カスタムキャスト(ペイント時に位置、サイズ、スケール比、回転角度、color/alphaなどのアトリビュートを処理):
    package com.libgdx.test;
    
    import com.badlogic.gdx.graphics.Color;
    import com.badlogic.gdx.graphics.g2d.Batch;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import com.badlogic.gdx.scenes.scene2d.Actor;
    
    /** *      (        ,  ,   ,       color/alpha    ) */
    public class MyActor extends Actor {
    
        private TextureRegion region;
    
        public MyActor(TextureRegion region) {
            super();
            this.region = region;
            setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
        }
    
        public TextureRegion getRegion() {
            return region;
        }
    
        public void setRegion(TextureRegion region) {
            this.region = region;
            setSize(this.region.getRegionWidth(), this.region.getRegionHeight());
        }
    
        @Override
        public void act(float delta) {
            super.act(delta);
        }
    
        @Override
        public void draw(Batch batch, float parentAlpha) {
            super.draw(batch, parentAlpha);
            if (region == null || !isVisible()) {
                return;
            }
    
            /* *    batch     color     ,    batch         ,             , *            batch   color,        ,             batch     color     。 */
            Color tempBatchColor = batch.getColor();
    
            /* *             alpha   , alpha      (color)   , rgba color    a    alpha; *     alpha  ,     (  /   )    alpha  (parentAlpha)。                  *       ,          ,             ,           ,     alpha        *        ,              alpha  ,            alpha  (  draw       parentAlpha) *             ,            ,          alpha          。 */
    
            //       color   
            Color color = getColor();
    
            /* *    color/alpha   ,       rgba color         batch。 *     alpha             alpha,      alpha       alpha   , *        alpha   0.5,     alpha   0.5,             0.5 * 0.5 = 0.25 */
            batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
    
            //      ,         ,   ,    ,     
            batch.draw(
                    region, 
                    getX(), getY(), 
                    getOriginX(), getOriginY(), 
                    getWidth(), getHeight(), 
                    getScaleX(), getScaleY(), 
                    getRotation()
            );
    
            //   batch     color     
            batch.setColor(tempBatchColor);
        }
    }
    ゲームマスタープログラムの起動エントリクラス(すべてのアクションのプレゼンテーションを含む):
    package com.libgdx.test;
    
    import com.badlogic.gdx.Application;
    import com.badlogic.gdx.ApplicationAdapter;
    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import com.badlogic.gdx.scenes.scene2d.Stage;
    import com.badlogic.gdx.scenes.scene2d.actions.Actions;
    import com.badlogic.gdx.scenes.scene2d.actions.AfterAction;
    import com.badlogic.gdx.scenes.scene2d.actions.AlphaAction;
    import com.badlogic.gdx.scenes.scene2d.actions.DelayAction;
    import com.badlogic.gdx.scenes.scene2d.actions.MoveByAction;
    import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction;
    import com.badlogic.gdx.scenes.scene2d.actions.ParallelAction;
    import com.badlogic.gdx.scenes.scene2d.actions.RepeatAction;
    import com.badlogic.gdx.scenes.scene2d.actions.RotateByAction;
    import com.badlogic.gdx.scenes.scene2d.actions.RotateToAction;
    import com.badlogic.gdx.scenes.scene2d.actions.RunnableAction;
    import com.badlogic.gdx.scenes.scene2d.actions.ScaleByAction;
    import com.badlogic.gdx.scenes.scene2d.actions.ScaleToAction;
    import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction;
    import com.badlogic.gdx.scenes.scene2d.actions.SizeByAction;
    import com.badlogic.gdx.scenes.scene2d.actions.SizeToAction;
    import com.badlogic.gdx.utils.viewport.StretchViewport;
    
    /** *            */
    public class MainGame extends ApplicationAdapter {
    
        private static final String TAG = MainGame.class.getSimpleName();
    
        //            480 * 800,          (StretchViewport)
        public static final float WORLD_WIDTH = 480;
        public static final float WORLD_HEIGHT = 800;
    
        private Texture texture;
    
        private Stage stage;
    
        private MyActor actor;
    
        @Override
        public void create() {
            //    log     
            Gdx.app.setLogLevel(Application.LOG_DEBUG);
    
            //     , badlogic.jpg        256 * 256
            texture = new Texture(Gdx.files.internal("badlogic.jpg"));
    
            //       (StretchViewport)    
            stage = new Stage(new StretchViewport(WORLD_WIDTH, WORLD_HEIGHT));
    
            //     
            actor = new MyActor(new TextureRegion(texture));
    
            //        
            stage.addActor(actor);
    
    
            /* *      * *             ,                   ,      。 * LibGDX                  ,                      , *                  。LibGDX               Actions     *         (Actions          )。 * *                    (addAction),                  *          。                      (removeAction)。 * *                   ,                   (        *                ,                )。 */
    
            // 1.     
            testMoveToAction();
    
            // 2.     (  )
            // testMoveByAction();
    
            // 3.     
            // testRotateToAction();
    
            // 4.     (  )
            // testRotateByAction();
    
            // 5.     
            // testScaleToAction();
    
            // 6.     (  )
            // testScaleByAction();
    
            // 7.       
            // testSizeToAction();
    
            // 8.       (  )
            // testSizeByAction();
    
            // 9.      
            // testAlphaAction();
    
            // 10.     
            // testParallelAction();
    
            // 11.     (          )
            // testSequenceAction();
    
            // 12.     
            // testRepeatAction();
    
            // 13. Runnable   
            // testRunnableAction();
    
            // 14. After   
            // testAfterAction();
        }
    
        /** * 1.      */
        private void testMoveToAction() {
            //          
            actor.setPosition(0, 0);
    
            //      MoveTo   , 3       (150, 300)    
            MoveToAction action = Actions.moveTo(150, 300, 3.0F);
    
            //           ,     
            actor.addAction(action);
    
            /* *       (   Actor     Action    ): * *               ,            ,            actor.act()            , *             delta             。         actor.draw()              *        ,       ,       “ ”   。 */
        }
    
        /** * 2.     (  ) */
        private void testMoveByAction() {
            //                 
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //      MoveBy   
            // 2   ,           ,        100,        -200
            MoveByAction action = Actions.moveBy(100, -200, 2.0F);
    
            //           ,     
            actor.addAction(action);
        }
    
        /** * 3.      */
        private void testRotateToAction() {
            //            
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //            -90  (     ,      )
            actor.setRotation(-90);
    
            //      RotateTo   , 2             -270  (      -270  )
            RotateToAction action = Actions.rotateTo(-270, 2.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 4.     (  ) */
        private void testRotateByAction() {
            //            
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //            -90  (     ,      )
            actor.setRotation(-90);
    
            //      RotateBy   , 2             45 (      -90 + 45 = -45  )
            RotateByAction action = Actions.rotateBy(45, 2.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 5.      */
        private void testScaleToAction() {
            //            
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //                      0.5   2.0
            actor.setScale(0.5F, 2.0F);
    
            //      ScaleTo   , 2                          1.0   1.0,
            //                 1.0   1.0
            ScaleToAction action = Actions.scaleTo(1.0F, 1.0F, 2.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 6.     (  ) */
        private void testScaleByAction() {
            //            
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //                      0.5   0.5
            actor.setScale(0.5F, 0.5F);
    
            //      ScaleBy   , 2                            0.5   0.5(      ,       ),
            // ScaleBy              ,                : 0.5 + 0.5 = 1.0
            ScaleByAction action = Actions.scaleBy(0.5F, 0.5F, 2.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 7.        */
        private void testSizeToAction() {
            //          
            actor.setPosition(0, 0);
    
            //      SizeTo   , 2             150,    300 (      150 * 300)
            SizeToAction action = Actions.sizeTo(150, 300, 2.0F);
    
            //     
            actor.addAction(action);
    
            /* * Scale   Size    : * * Size         , Scale          Size     。 *    Scale   0.5, *   Size    256  ,             256 * 0.5 = 128, *   Size    512  ,             512 * 0.5 = 256, */
        }
    
        /** * 8.       (  ) */
        private void testSizeByAction() {
            //          
            actor.setPosition(0, 0);
    
            //              256 * 256
    
            //      SizeTo   , 2               150, 300 
            //      : 256 + 150 = 406
            //      : 256 + 300 = 556
            SizeByAction action = Actions.sizeBy(150, 300, 2.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 9.       */
        private void testAlphaAction() {
            //          
            actor.setPosition(0, 0);
    
            //        alpha    1(     ,       1)
            actor.getColor().a = 1.0F;
    
            //      Alpha   , 5    alpha    0(    )
            AlphaAction action = Actions.alpha(0.0F, 5.0F);
    
            //     
            actor.addAction(action);
        }
    
        /** * 10.     :      ,   ,    */
        private void testParallelAction() {
            //          
            actor.setPosition(0, 0);
            actor.setScale(0.5F, 0.5F);
            actor.setRotation(0);
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //     
            MoveToAction moveTo = Actions.moveTo(150, 500, 3.0F);
    
            //     
            ScaleToAction scaleTo = Actions.scaleTo(1.0F, 1.0F, 3.0F);
    
            //     
            RotateByAction rotateBy = Actions.rotateBy(360.0F, 3.0F);
    
            //     ,    moveTo, scaleTo, rotateBy
            ParallelAction parallelAction = Actions.parallel(moveTo, scaleTo, rotateBy);
    
            //       
            actor.addAction(parallelAction);
        }
    
        /** * 11.     (          ):    ,     ,        */
        private void testSequenceAction() {
            //          
            actor.setPosition(0, 0);
            actor.setScale(1.0F, 1.0F);
            actor.setRotation(0);
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            // 1.     ,    3  
            DelayAction delay = Actions.delay(3.0F);
    
            // 2.     
            MoveToAction moveTo = Actions.moveTo(150, 500, 3.0F);
    
            // 3.     ,                
            ParallelAction parallel = Actions.parallel(
                    Actions.scaleTo(0.5F, 0.5F, 3.0F), 
                    Actions.rotateBy(360.0F, 3.0F)
            );
    
            //     ,    delay, moveTo, parallel
            SequenceAction sequenceAction = Actions.sequence(delay, moveTo, parallel);
    
            //       
            actor.addAction(sequenceAction);
        }
    
        /** * 12.     :      ,    */
        private void testRepeatAction() {
            //            
            actor.setPosition(
                    actor.getStage().getWidth() / 2 - actor.getWidth() / 2, 
                    actor.getStage().getHeight() / 2 - actor.getHeight() / 2
            );
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //          
            actor.setScale(1.0F, 1.0F);
    
            //     :      0.5,      1.0
            SequenceAction sequence = Actions.sequence(
                    Actions.scaleTo(0.5F, 0.5F, 2.0F), 
                    Actions.scaleTo(1.0F, 1.0F, 2.0F)
            );
    
            //     :      sequence
            RepeatAction repeatAction = Actions.forever(sequence);
    
            //       
            actor.addAction(repeatAction);
        }
    
        /** * 13. Runnable   :            ,                       */
        private void testRunnableAction() {
            //          
            actor.setPosition(0, 0);
    
            //     
            MoveToAction moveTo = Actions.moveTo(150, 300, 3.0F);
    
            // Runnable   
            RunnableAction runnable = Actions.run(new Runnable() {
                @Override
                public void run() {
                    //      log        
                    Gdx.app.log(TAG, "The runnable action has been running.");
                }
            });
    
            //     :   moveTo          runnable   
            SequenceAction sequence = Actions.sequence(moveTo, runnable);
    
            //       
            actor.addAction(sequence);
        }
    
        /** * 14. After   :                */
        private void testAfterAction() {
            //          
            actor.setPosition(0, 0);
            actor.setRotation(0);
    
            //               
            actor.setOrigin(actor.getWidth() / 2, actor.getHeight() / 2);
    
            //     ,    3  
            MoveToAction moveTo = Actions.moveTo(150, 300, 3.0F);
    
            //     ,    2  
            RotateByAction rotateBy = Actions.rotateBy(360.0F, 2.0F);
    
            // Runnable   
            RunnableAction runnable = Actions.run(new Runnable() {
                @Override
                public void run() {
                    //      log        
                    Gdx.app.log(TAG, "                ");
                }
            });
    
            // After   ,      runnable   
            AfterAction afterAction = Actions.after(runnable);
    
            //            :       moveTo   rotateBy,         afterAction
            actor.addAction(moveTo);
            actor.addAction(rotateBy);
            actor.addAction(afterAction);
        }
    
        @Override
        public void render() {
            //        
            Gdx.gl.glClearColor(0.75F, 1, 0.98F, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
            //       
            stage.act();
            //     
            stage.draw();
        }
    
        @Override
        public void dispose() {
            //     
            if (stage != null) {
                stage.dispose();
            }
            if (texture != null) {
                texture.dispose();
            }
        }
    
    }
    アクションのプレゼンテーションが多く、結果も複雑です.ここでは実行結果は表示されません.