不同类别的精灵代码

时间:2016-10-18 09:10:50

标签: java android class android-studio libgdx

我想制作一个游戏,当主角精灵的X坐标小于屏幕中间时,他向右移动,当它超过屏幕中间时,他向左移动。精灵的动画在他移动时和他静止时(到达目的地后)都会改变。 我想知道的是,当sprite及其动画代码在一个类中并且用于更改其X坐标的代码在另一个类中时,我该怎么做? 最好是在每个类中绘制相同的精灵? 如何在水平移动时和精灵移动时更改精灵?我打算将精灵的动作分开代码不同的类,因为我想随机调用它们。这是我的精灵动画的代码,我还没有改变x坐标的类:

    import com.badlogic.gdx.Gdx;
    import com.badlogic.gdx.Screen;
    import com.badlogic.gdx.audio.Music;
    import com.badlogic.gdx.audio.Sound;
    import com.badlogic.gdx.graphics.GL20;
    import com.badlogic.gdx.graphics.Texture;
    import com.badlogic.gdx.graphics.g2d.Animation;
    import com.badlogic.gdx.graphics.g2d.Sprite;
    import com.badlogic.gdx.graphics.g2d.TextureRegion;
    import com.jpfalmazan.ninjaassault.NinjaAssault;



public class MainScreen implements Screen {
private static final int  FRAME_COLS = 3;
private static final int  FRAME_ROWS = 2;


Animation  walkAnimation;
Texture    walkSheet  = new Texture ("ninjaWalk.png");
TextureRegion[] walkFrames;
TextureRegion   currentFrame;
Texture holdStart;

float stateTime;

public Texture background;

private NinjaAssault game;
private Music BackgroundSFX;
public float screenWidth = Gdx.graphics.getWidth();
public float screenHeight = Gdx.graphics.getHeight();
float x = screenWidth/2;
float y = screenHeight/2;


public float walkSheetWidth = walkSheet.getWidth();
public float walkSheetHeight = walkSheet.getHeight();


public MainScreen (NinjaAssault game){
    this.game = game;
}

@Override
public void show(){

    background = new Texture("BGBlue.png");
    holdStart = new Texture ("HoldStart.png");


    BackgroundSFX = Gdx.audio.newMusic(Gdx.files.internal("data/RADWIMPS-iindesuka.mp3"));

    TextureRegion[][] tmp = TextureRegion.split(walkSheet, (int )walkSheetWidth/FRAME_COLS, (int) walkSheetHeight/FRAME_ROWS);
    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(0.0887f, walkFrames);
    stateTime = 0f;
}

@Override
public void render(float delta) {


    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stateTime += Gdx.graphics.getDeltaTime();
    currentFrame = walkAnimation.getKeyFrame(stateTime, true);
    float hsWidth = holdStart.getWidth();
    float hsHeight = holdStart.getHeight();
    float currentFrameWidth = (float)(screenHeight*0.15);
    float currentFrameHeight = (float)(screenHeight*0.15);
    float holdStartWidth = (float)(screenWidth * 0.75);




    game.batch.begin();


    game.batch.draw(background,0,0, screenWidth,screenHeight);
    BackgroundSFX.play();
    game.batch.draw(currentFrame, x -currentFrameWidth/2, 0,currentFrameWidth,currentFrameHeight);
    game.batch.draw(holdStart, (screenWidth / 2 - (holdStartWidth / 2)), (float) (screenHeight * 0.5), holdStartWidth, holdStartWidth * (hsHeight / hsWidth));


    game.batch.end();
}

@Override
public void resize(int width, int height) {

}

@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {
    BackgroundSFX.dispose();
    background.dispose();
    walkSheet.dispose();
    holdStart.dispose();
}

}

我试着研究如何做到这一点,但我得到的答案并没有那么有用。

1 个答案:

答案 0 :(得分:1)

最简单的方法是创建一个Player类,并将动画和帧的所有代码放在那里。然后给它一个方法来保存它的位置。像矢量或只是x坐标的浮点数。或者甚至更好,使用矩形。矩形将使移动和碰撞检测更容易。

这样的事情:

public class Player{

    private Animation  walkAnimation;
    private Texture    walkSheet;
    private TextureRegion[] walkFrames;
    private TextureRegion   currentFrame;
    private float stateTime;
    private Rectangle bound; //used for positioning and collision detection

    public Player(float x, float y, float width, float height){
        bound = new Rectangle(); 
        bound.x = x;
        bound.y = y;
        bound.width = width;
        bound.height = height;

        walkSheet = new Texture ("ninjaWalk.png");
        TextureRegion[][] tmp = TextureRegion.split(walkSheet,(int)walkSheetWidth/FRAME_COLS, (int) walkSheetHeight/FRAME_ROWS);
        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(0.0887f, walkFrames);
        stateTime = 0f;
    }

    public rectangle getBound(){
        return bound;
    }

    public void update(float delta){
        statetime += delta;
        currentFrame = walkAnimation.getKeyFrame(stateTime, true);
    }

    public TextureRegion getCurrentFrame(){
        return currentFrame;
    }

}

这只是一个未经测试的快速示例。

你说你想要从另一个班级移动玩家。我不知道你打算如何做到这一点,但是你需要做的就是操纵玩家的操作是操纵边界的x和y。

您对代码的其他一些评论:

@Override
public void render(float delta) {

    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);    
    player.update(delta); // to update the player

    /***
    * This does not have to be set every single frame. Move it to show()
    *
    float hsWidth = holdStart.getWidth();
    float hsHeight = holdStart.getHeight();
    float currentFrameWidth = (float)(screenHeight*0.15);
    float currentFrameHeight = (float)(screenHeight*0.15);
    float holdStartWidth = (float)(screenWidth * 0.75);
    ****************************************************/


    BackgroundSFX.play(); // I am sure you don't need to start playing this every single frame? 60 times a second.

    game.batch.begin();
    game.batch.draw(background,0,0, screenWidth,screenHeight);
    game.batch.draw(player.getCurrentFrame(), player.getBound().x, player.getbound().y, player.getBound().width, player.getBound().height)

    game.batch.draw(holdStart, (screenWidth / 2 - (holdStartWidth / 2)), (float) (screenHeight * 0.5), holdStartWidth, holdStartWidth * (hsHeight / hsWidth));
    game.batch.end();
}