使用TextureRegion(LibGDX)

时间:2017-06-15 13:16:10

标签: java android libgdx

我目前有主要角色的班级"学生",除了左右移动之外没有任何行为。我设法做到这一点,所以我的spritesheet的所有帧都将呈现,所以当我按下LEFT / RIGHT键时,我需要帮助绘制前3帧(这是步行周期)。 这是spritesheet:http://imgur.com/a/HHdm9

编辑:按下向上和向下键时的第2和第3行。

学生班

    public class Student {

    private Texture player;
    private Animation<TextureRegion> playerAnimation;
    private int pX;
    private int pY;
    private SpriteBatch batch;
    private int HP;

    public Student(float speed, int x, int y){
        player = new Texture("student.png");
        TextureRegion[][] tmp= TextureRegion.split(player,450/3,450/3);
        TextureRegion[] character = new TextureRegion[9];
        int index = 0;
        for(int i=0; i <3; i++){
            for(int j=0; j < 3; j++){
                character[index++] = tmp[i][j];}
        }

        playerAnimation = new Animation<TextureRegion>(speed,character);
        pX=x;
        pY=y;
    }

    public SpriteBatch getBatch() {
        return batch;
    }

    public void setBatch(SpriteBatch batch) {
        this.batch = batch;
    }

    public void goLeft(){
        pX-=5;
        if(pX < -10){
            pX = -10;
        }
    }

    public void goRight(){
        pX+=5;
    }

    public void renderStudent(float stateTime){
        TextureRegion currentFrame = playerAnimation.getKeyFrame(stateTime,true);
        batch.draw(currentFrame, (float) pX, (float) pY, 0, 0, currentFrame.getRegionWidth(),
                currentFrame.getRegionHeight(),1.5f,1.5f,0);
    }

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

主类

    public class HaxMain extends ApplicationAdapter {
    SpriteBatch batch;
    Texture bg;                                 

    float stateTime;

    private Student student1;
    private Guard mguard, fguard;
    private Admin madmin, fadmin;

    @Override
    public void create () {
        batch = new SpriteBatch();                        
        bg = new Texture("Level1.png");

        student1 = new Student(.5f, 100, 0);
        student1.setBatch(batch);
    }

    @Override
    public void render () {
        Gdx.gl.glClearColor(1, 0, 0, 1);    
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);                       

        stateTime += Gdx.graphics.getDeltaTime();

        if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){
            student1.goLeft();
            //Code to render image to the left
        }else if(Gdx.input.isKeyPressed(Input.Keys.RIGHT)){
            //Code to render image to the right
            student1.goRight();
        }

        batch.begin();                                                  /*default code*/

        batch.draw(bg, 0, 0);
        student1.renderStudent(stateTime);
        batch.end();                                                
    }

    @Override
    public void dispose () {
        batch.dispose();
        bg.dispose();
        student1.dispose();
    }
}

1 个答案:

答案 0 :(得分:1)

您需要仅为跑步创建动画,并使用该动画显示您的播放器向左或向右运行。您可以根据播放器的方向翻转TextureRegion,如下所示:

TextureRegion[] character;
boolean isRight;    

public Student(float speed, int x, int y){
    player = new Texture("student.png");
    TextureRegion[][] tmp= TextureRegion.split(player,450/3,450/3);
    character = new TextureRegion[9];
    int index = 0;
    for(int i=0; i <3; i++){
        for(int j=0; j < 3; j++){
            character[index++] = tmp[i][j];}
    }

    TextureRegion runningFrames[]=new TextureRegion[3];

    for (int i=0;i<runningFrames.length;i++)
        runningFrames[i]= character[i];

    playerAnimation = new Animation<TextureRegion>(speed, runningFrames);
    playerAnimation.setPlayMode(Animation.PlayMode.LOOP);
    pX=x;
    pY=y;

}

public void goLeft(){
    pX-=5;
    if(pX < -10){
        pX = -10;
    }
    if(isRight){
       isRight=false;
       for (TextureRegion textureRegion:playerAnimation.getKeyFrames())
           if(textureRegion.isFlipX()) textureRegion.flip(true,false);
    } 
}

public void goRight(){
    pX+=5;
    if(!isRight){
       isRight=true;
       for (TextureRegion textureRegion: playerAnimation.getKeyFrames())
           if(!textureRegion.isFlipX()) textureRegion.flip(true,false);
    }
}

创建其他动作的另一个动画,并使用标记绘制动画帧。