LibGDX使用带有皮肤的动画(用于拖拽)

时间:2016-08-29 05:41:28

标签: android animation libgdx

我已经建立了一个游戏,其中演员萤火虫随机飞过屏幕,同时发光和关闭 - 用户可以将它们拖入一个梅森罐子里。很高兴我有这个工作,但我想补充一点细节。我想添加一个两步动画,看起来它们的翅膀正在拍打。

我知道如何使用Animation类,使用TextureAtlas和TextureRegion。但那是在我前往这个Drag n Drop方向之前。

我认为,我的问题是我使用的是皮肤,而且他们可能不会使用Animations。

/////////////////// 部分代码。 ///////////////////

我声明的一些项目最高:

private TextureAtlas textureAtlas;
private Texture texture;
private TextureRegion[] regions = new TextureRegion[3];
private Animation ffFlapping;

设置我的TextureAtlas:

textureAtlas = new TextureAtlas(Gdx.files.internal("Player Animation/player_animation.png.atlas"));
texture = new Texture(Gdx.files.internal("Player Animation/player_animation.png.png"));

设置皮肤:

final Skin skin = new Skin();
skin.addRegions(textureAtlas);

做动画:

TextureRegion[] ffAnimation = new TextureRegion[2];
ffAnimation[0] = (textureAtlas.findRegion("firefly-0"));
ffAnimation[1] = (textureAtlas.findRegion("firefly-1"));

ffFlapping = new Animation(0.01f, ffAnimation);

用于循环创建我的所有萤火虫:

// ********************************************
    // iterate through the number of fireflies
    // we want to draw out using fireflyCount
    // ********************************************
    for (int fireflyIndex = 0; fireflyIndex < fireflyCount; fireflyIndex++) {


        // YELLOW FIREFLY HERE
        String fireflyName = "firefly" + fireflyIndex;

        // if I replace ffFlapping below with object, I get no errors, 
        // but also no animation
        skin.add(fireflyName, ffFlapping);

        final Firefly ff = new Firefly(skin, fireflyName);

        System.out.println("Fireflies objects:" + fireflyIndex);

        // Not sure this affected the color, but it starts the alpha at 0
        ff.setColor(150, 150, 150, 0);
        ff.setOrigin(ff.getWidth()/2, ff.getHeight()/2);

        stage.addActor(ff);


        // This was set up in the attempt to continue movement if user misses target
        final MoveToAction actionRight = new MoveToAction();
        final MoveToAction actionLeft = new MoveToAction();



        // setting up right and left targets, with a random Y position
        float toRight = Gdx.graphics.getWidth() + 60;
        float toLeft = (Gdx.graphics.getWidth() -Gdx.graphics.getWidth())-60f;

        // sets up speed of glow, and the random time firefly is off, and also on
        float glow = MathUtils.random(.5f, 1f);
        float delayRandomOff = MathUtils.random(2.3f, 4.5f);
        float delayRandomOn = MathUtils.random(.5f, .9f);

        // sets up first variable to randomly choose between toRight and toLeft
        // assigns direction to that value
        float randomDirection = MathUtils.random.nextBoolean() ? toRight : toLeft;
        float direction = randomDirection;

        SequenceAction sequence = new SequenceAction();
        AlphaAction aa = new AlphaAction();

        Action alphaStartOn = Actions.delay(delayRandomOn, Actions.fadeOut(glow));
        Action alphaStartOff = Actions.delay(delayRandomOff, Actions.fadeIn(glow));


        // toRight is the x value ... it goes (x, y, duration)
        Action startRight = Actions.moveTo(toRight, MathUtils.random(50, Gdx.graphics.getHeight() - 40), MathUtils.random(10f, 45f));

        // toLeft is the x value ... it goes (x, y, duration)
        // 170 makes sure they don't fly on top of mason jar
        Action startLeft = Actions.moveTo(toLeft, MathUtils.random(170, Gdx.graphics.getHeight() - 40), MathUtils.random(10f, 45f));

        Action faceOpposite = Actions.rotateBy(180f);
        Action faceOpposite2 = Actions.rotateBy(180f);


        // THIS ENDLESSLY LOOPS THEM ON THE SCREEN
        Action loopRight = Actions.forever(Actions.sequence(faceOpposite, startRight, faceOpposite2, startLeft));
        Action loopLeft = Actions.forever(Actions.sequence(startLeft, faceOpposite, startRight, faceOpposite2));
        Action loopGlow1 = Actions.forever(Actions.sequence(alphaStartOn, alphaStartOff));
        Action loopGlow2 = Actions.forever(Actions.sequence(alphaStartOff, alphaStartOn));






            // THIS IS DEFINITELY TRIGGERING THE MOVEMENT

            if(direction == toRight) {

                ff.addAction(loopRight);
                ff.addAction(loopGlow1);

            } else {

                ff.addAction(loopLeft);
                ff.addAction(loopGlow2);

            }





            // MAKE EACH FIREFLY DRAGGABLE, and SET LARGER SIZE as you drag
            dragAndDrop.addSource(new DragAndDrop.Source(ff) {
                public DragAndDrop.Payload dragStart (InputEvent event, float x, float y, int pointer) {
                    DragAndDrop.Payload payload = new DragAndDrop.Payload();

                    payload.setObject("Firefly captured");
                    payload.setDragActor(ff);
                    ff.clearActions();
                    getActor().setSize(80, 80);
                    // Firefly freezes on drag, and enlarges ... disappears if dropped in jar
                    // Does not visually drag with cursor since it was part of animation.
                    return payload;
                }

                // IF YOU DON'T DROP FIREFLY ON TARGET, MAKE SURE IT STAYS ON STAGE
                // AND GOES BACK TO THE NORMAL SIZE
                @Override
                public void dragStop(InputEvent event, float x, float y, int pointer, DragAndDrop.Payload payload, DragAndDrop.Target target) {
                    if(target == null)
                        stage.addActor(ff);
                        ff.addAction(actionLeft);
                    getActor().setSize(50, 50);
                }
            });



            // MAKE EACH FIREFLY DRAGGABLE, and SET LARGER SIZE as you drag
            dragAndDrop.addSource(new DragAndDrop.Source(ff) {
                public DragAndDrop.Payload dragStart (InputEvent event, float x, float y, int pointer) {
                    DragAndDrop.Payload payload = new DragAndDrop.Payload();

                    payload.setObject("Firefly captured");
                    payload.setDragActor(ff);
                    ff.clearActions();
                    getActor().setSize(80, 80);
                    // Firefly freezes on drag, and enlarges ... disappears if dropped in jar
                    // Does not visually drag with cursor since it was part of animation.
                    return payload;
                }

                // IF YOU DON'T DROP FIREFLY ON TARGET, MAKE SURE IT STAYS ON STAGE
                // AND GOES BACK TO THE NORMAL SIZE
                @Override
                public void dragStop(InputEvent event, float x, float y, int pointer, DragAndDrop.Payload payload, DragAndDrop.Target target) {
                    if(target == null)
                        stage.addActor(ff);
                    ff.addAction(actionLeft);
                    getActor().setSize(50, 50);
                }
            });


    } // ***** END OF FOR LOOP ***********

这是我的Firefly代码:

public class Firefly extends Image {
private float x = MathUtils.random(20, Gdx.graphics.getWidth() -40);
private float  y = MathUtils.random(200, Gdx.graphics.getHeight() - 40);
private float width = 70;
private float height = 70;

public Firefly(Skin skin, String drawableName) {
super(skin, drawableName);
this.setBounds(x, y, width, height);

}

} // firefly

我得到的错误是:

com.badlogic.gdx.utils.GdxRuntimeException: No Drawable, NinePatch, TextureRegion, Texture, or Sprite registered with name: firefly-2

///////////////////////////////

非常感谢任何提示。 与此同时,我正在创建一个新的功能分支并保持它。 我的猜测是我需要以某种方式将我的两步动画制作成某种Drawable。

谢谢!

- 比尔

0 个答案:

没有答案