繁体   English   中英

不同类别的Sprite代码

[英]Code for Sprite in Different Class

我想做一个游戏,当主角色精灵的X坐标小于屏幕中间时,他向右移动,而当其大于屏幕中间时,他向左移动。 精灵在移动和静止时(到达目的地之后)的动画都会改变。 我想知道的是,当精灵及其动画代码在一个类中,而更改其X坐标的代码在另一个类中时,我该怎么做? 最好在每个班级画一个相同的精灵吗? 当精灵水平移动和静止时如何更改精灵? 我计划将代码拆分为不同类中的sprite动作,因为我想随机调用它们。 这是我的精灵动画的代码,我还没有用于更改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();
}

}

我试图研究如何执行此操作,但是得到的答案并没有帮助。

最简单的方法是创建一个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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM