2017-04-24 38 views
0

我想用libGDX在Java中創建簡單的2D遊戲。 我堅持從PNG文件中的精靈表創建2D動畫。libGDX sprite工作表2d動畫

我有AbstractScreen類,它爲每個屏幕保存「東西」。

GameScreen類用於繪製我的遊戲和Player類與動畫代碼。

玩家等級是從https://github.com/libgdx/libgdx/wiki/2D-Animation的例子。

首先,我創建了AbstractScreen和MainMenuScreen(基於AbstractScreen)。這是有效的,但現在我正嘗試用我的動畫播放器創建GameScreen。有些東西是錯的,因爲我沒有任何錯誤,玩家在應用程序屏幕上不可見。如何正確實現我的應用程序框架的精靈圖表動畫?

我的遊戲畫面:

class GameScreen extends AbstractScreen { 
Player player; 

public GameScreen(NinjaGame game) { 
    super(game); 
    init(); 
} 

@Override 
protected void init() { 
    initPlayer(); 
} 

private void initPlayer() { 
    player = new Player(); 
    player.setDebug(true); 
    stage.addActor(player); 
} 

@Override 
public void render(float delta) { 
    super.render(delta); 
    update(); 
    spriteBatch.begin(); 
    stage.draw(); 
    spriteBatch.end(); 
} 

private void update() { 
    stage.act(); 
    } 
} 

我AbstractScreen類:

public abstract class AbstractScreen implements Screen { 
protected NinjaGame game; 
protected Stage stage; 
private OrthographicCamera camera; 
protected SpriteBatch spriteBatch; 

public AbstractScreen(NinjaGame game) { 
    this.game = game; 
    createCamera(); 
    /* Stage for actors */ 
    stage = new Stage(new StretchViewport(NinjaGame.SCREEN_WIDTH, NinjaGame.SCREEN_HEIGHT, camera)); 
    /* Batch for sprites */ 
    spriteBatch = new SpriteBatch(); 
    /* Stage takes user inputs */ 
    Gdx.input.setInputProcessor(stage); 
    init(); 
} 

protected abstract void init(); 

private void createCamera() { 
    /* Orthographic means like in CAD drawings */ 
    camera = new OrthographicCamera(); 
    camera.setToOrtho(false, NinjaGame.SCREEN_WIDTH, NinjaGame.SCREEN_HEIGHT); 
    camera.update(); 
} 

/** Clean screen on black color between render frames */ 
private void clearScreen() { 
    Gdx.gl.glClearColor(0, 0, 0, 0); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
} 

@Override 
public void render(float delta) { 
    clearScreen(); 
    camera.update(); 
    spriteBatch.setProjectionMatrix(camera.combined); 
    } 

} 

我的播放器類:

public class Player extends Actor { 
private static final int FRAME_COLS = 10, FRAME_ROWS = 1; 
Animation<TextureRegion> walkAnimation; 
Texture walkSheet; 
private final static int STARTING_X = 50; 
private final static int STARTING_Y = 50; 

public Player(){ 
    createIdleAnimation(); 
    this.setPosition(STARTING_X, STARTING_Y); 
} 

private void createIdleAnimation() { 
    walkSheet = new Texture(Gdx.files.internal("sheets/ninja-idle-sheet.png")); 

    TextureRegion[][] tmp = TextureRegion.split(walkSheet, 
      walkSheet.getWidth()/FRAME_COLS, 
      walkSheet.getHeight()/FRAME_ROWS); 

    TextureRegion[] walkFrames = new TextureRegion[FRAME_COLS * FRAME_ROWS]; 
    int index = 0; 
    for (int i = 0; i < FRAME_ROWS; i++) { 
     for (int j = 0; j < FRAME_COLS; j++) { 
      walkFrames[index++] = tmp[i][j]; 
     } 
    } 

    walkAnimation = new Animation<TextureRegion>(0.025f, walkFrames); 
} 

@Override 
public void act(float delta) { 
    super.act(delta); 
} 

@Override 
public void draw(Batch batch, float parentAlpha) { 
    super.draw(batch, parentAlpha); 
    } 
} 

更新1

NinjaGame類

public class NinjaGame extends Game{ 
public final static int SCREEN_WIDTH = 800; 
public final static int SCREEN_HEIGHT = 480; 
public final static String GAME_NAME = "ninja vs zombie"; 
private boolean paused; 

@Override 
public void create() { 
    this.setScreen(new GameScreen(this)); 
} 
} 

回答

1

做小的修改您的播放器類,以便它吸取玩家動畫幀。您需要重載Actor的draw方法並繪製Player的紋理。

public class Player extends Actor { 
    private static final int FRAME_COLS = 10, FRAME_ROWS = 1; 
    Animation<TextureRegion> walkAnimation; 
    Texture walkSheet; 
    private final static int STARTING_X = 50; 
    private final static int STARTING_Y = 50; 
    TextureRegion reg; 
    float stateTime; 

    public Player(){ 
     createIdleAnimation(); 
     this.setPosition(STARTING_X, STARTING_Y); 
    } 

    private void createIdleAnimation() { 
     walkSheet = new Texture(Gdx.files.internal("sheets/ninja-idle-sheet.png")); 

     TextureRegion[][] tmp = TextureRegion.split(walkSheet, 
       walkSheet.getWidth()/FRAME_COLS, 
       walkSheet.getHeight()/FRAME_ROWS); 

     TextureRegion[] walkFrames = new TextureRegion[FRAME_COLS * FRAME_ROWS]; 
     int index = 0; 
     for (int i = 0; i < FRAME_ROWS; i++) { 
      for (int j = 0; j < FRAME_COLS; j++) { 
       walkFrames[index++] = tmp[i][j]; 
      } 
     } 

     walkAnimation = new Animation<TextureRegion>(0.025f, walkFrames); 
     stateTime = 0f; 
     reg=walkAnimation.getKeyFrame(0); 
    } 

    @Override 
    public void act(float delta) { 
     super.act(delta); 

     stateTime += delta; 
     reg = walkAnimation.getKeyFrame(stateTime,true); 
    } 

    @Override 
    public void draw(Batch batch, float parentAlpha) { 
     super.draw(batch, parentAlpha); 

     Color color = getColor(); 
     batch.setColor(color.r, color.g, color.b, color.a * parentAlpha); 
     batch.draw(reg,getX(),getY(),getWidth()/2,getHeight()/2,getWidth(),getHeight(),getScaleX(),getScaleY(),getRotation()); 
    } 
} 

編輯

您需要調整階段的視根據設備屏幕的寬度和高度,以便覆蓋resize方法,也沒有必要要求begin和spritebatch的end。您正在使用該階段有您的播放器類的代碼本身SpriteBatch

class GameScreen extends AbstractScreen { 

    Player player; 

    public GameScreen(NinjaGame game) { 
    super(game); 
    init(); 
    } 

    @Override 
    protected void init() { 
    initPlayer(); 
    } 

    private void initPlayer() { 
    player = new Player(); 
    player.setDebug(true); 
    stage.addActor(player); 
    } 

    @Override 
    public void render(float delta) { 
    super.render(delta); 

    update(); 
    stage.draw(); 
    } 

    private void update() { 
    stage.act(); 
    } 

    @Override 
    public void resize(int width, int height){ 
    stage.getViewport().update(width,height); 
    } 
} 

EDIT 2

private void initPlayer() { 
    player = new Player(); 
    player.setSize(100,150); 
    player.setDebug(true); 
    stage.addActor(player); 
} 
+0

我還有空白屏幕,不播放動畫@Abhishek雅利安 – twistezo

+0

請出示你的'NinjaGame'上課? – Aryan

+0

查看更新1 @Abhishek Aryan – twistezo