Libgdx动画无法正常工作 [英] Libgdx Animation not working

查看:59
本文介绍了Libgdx动画无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读关于libgdx的信息,并且一直困扰于这个动画问题.我从他们的github上阅读了libgdx中的动画,当我在手机上运行我的应用程序时,该应用程序在加载屏幕后崩溃.这是我从演员延伸出来的演员演员.我在菜单屏幕类中创建了播放器演员,并将其添加到舞台中.假定它在菜单屏幕中上下浮动,但该应用程序崩溃了.我知道这是我的播放器演员,因为当我在菜单屏幕类中将播放器演员注释掉时,该应用程序不会崩溃.我在平面精灵上使用了纹理打包器,并将其加载到游戏中.

I have been reading about libgdx and I have been stuck on this animation problem. I have reading about animation in libgdx from their github and when I run my app on my phone, the app crashes after the loading screen. Here is my player Actor that extends from Actor. I create the player actor in my menu screen class and add it to the stage. It is suppose to appear flying up and down in the menu screen but the app crashes. I know it is my player actor because when I comment out the player actor in my menu screen class the app does not crash. I use texture packer on my plane sprite and load it into my game.

public class PlayerActor extends Actor{

private DrunkPilot pGame;

private static final int NUM_ROWS = 5, NUM_COLS = 5;

private Animation<TextureRegion> drunkFlying;
private float stateTimer;
private TextureRegion region;
private Texture planeTex;

public PlayerActor(){

    planeTex = pGame.assetManager.manager.get(Constants.plane);
    planeTex = new Texture(Gdx.files.internal(Constants.plane));

    drunkFlyingAnimation();

}

private void drunkFlyingAnimation(){

    TextureRegion[][] tmp = TextureRegion.split(planeTex, planeTex.getWidth() / NUM_COLS, planeTex.getHeight() / NUM_ROWS);
    TextureRegion[] flyFrames = new TextureRegion[NUM_COLS * NUM_ROWS];

    int index = 0;
    for (int i = 0; i < NUM_ROWS; i++) {
        for (int j = 0; j < NUM_COLS; j++) {
            flyFrames[index++] = tmp[i][j];
        }
    }

    drunkFlying = new Animation<TextureRegion>(0.025f, flyFrames);
    stateTimer = 0;
    region = drunkFlying.getKeyFrame(0);
}

@Override
public void draw(Batch batch, float alpha){
    super.draw(batch, alpha);
    GdxUtils.clearScreen();
    stateTimer += Gdx.graphics.getDeltaTime();
    TextureRegion drunk = drunkFlying.getKeyFrame(stateTimer, true);

    batch.draw(drunk, getX(), getY(), getWidth() / 2, getHeight() / 2, getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation());

}

public void dispose(){
    planeTex.dispose();
}

}

在这里我将演员添加到舞台上.

Here is where I add my actor to the stage.

@Override
public void show() {
    Gdx.input.setInputProcessor(menuStage);

    menuTitle = new Image(menuTitleTexture);
    menuStartImg = new Image(menuStartTexture);

    menuTable = new Table();
    menuTable.setFillParent(true);
    menuTable.add(menuTitle).pad(20).align(Align.top);
    menuTable.row();
    menuTable.add(menuStartImg).align(Align.bottom).pad(30);

    menuStage.addActor(parallaxBackground);
    menuStage.addActor(menuTable);
    menuStage.addActor(player);
}

推荐答案

使用TexturePacker时,可以更轻松地创建动画.

When you use TexturePacker there is an easier way to create animations.

当我们要创建运行动画时
首先,将所有动画图像投放到TexturePacker,您必须确保每个帧都具有相同的名称+下划线+ frameNumber. 因此,框架的名称必须为:run_1,run_2,run_3等.

When we want to create a run animation
First you ad all animation images to TexturePacker you have to look that every frame has the same name + underscore + frameNumber. So the name of the frames must be: run_1, run_2, run_3 etc.

创建时,我们的资产中包含run.txt和run.png.

When we created it we have a run.txt and run.png in our assets.

现在我们可以使用AssetManager加载TextureAtlas:

Now we can load the TextureAtlas with our AssetManager:

AssetManager assetManager = new AssetManager();
assetManager.load("run.txt", TextureAtlas.class);
assetManager.finishLoading();
TextureAtlas runAnimationAtlas = assetManager.get("run.txt", TextureAtlas.class);

有了这个TextureAtlas,我们可以创建动画:

With this TextureAtlas we can create our Animation:

float frameDuration = 0.1f; // the duration between the animation frames
Animation<TextureRegion> runAnimation = new Animation<TextureRegion>(frameDuration, runAnimationAtlas.findRegions("run"), Animation.PlayMode.LOOP);

并渲染动画:

batch.draw(runAnimation.getKeyFrame(stateTimer),posX, posY)

这篇关于Libgdx动画无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆