0

こんにちは。キャラクターのアニメーションとコントロールで問題が発生しました。私の問題は、左右の矢印キーを押しようとすると、プレーヤーが左右ではなく上下に移動することです。コードのどの部分が間違っているのかまだわからないので、コードをデバッグしようとしました。そのため、皆さんに私のコードを調べてもらい、コードのどの部分が間違っているか、または改善が必要かを判断してもらいたいのです。

これは私のプレーヤーのコードです:

public class DugmanPlayer {
    public enum state
    {
        standby,
        walking,
        digging,
        dying
    }

    public enum dir
    {
        left,
        right,
        up,
        down
    }

    public static float WIDTH;
    public static float HEIGHT;
    static float speedmax = 30f;
    static float damping = 0.9f;
    dir d = dir.up;

    public Vector2 position = new Vector2();
    public Vector2 speed = new Vector2();
    state st = state.walking;

    public float statetime = 0;

    public void UpdatePlayer(float deltatime)
    {
        if(deltatime==0)return;
        statetime += deltatime;
        //rightwalking
        if(Math.abs(speed.x) > speedmax) {
            speed.x = Math.signum(speed.x) * speedmax;
            if(d != dir.left)d = dir.right;
            st = state.walking;
        }

        if(Math.abs(speed.x) < 1) {
            speed.x = 0;
            if(st!=state.walking)st = state.standby;
            d=dir.right;
        }
        //upwalking
        if(Math.abs(speed.y) > speedmax) {
            speed.y = Math.signum(speed.y) * speedmax;
            if(d != dir.down)d = dir.up;
            st = state.walking;
        }

        if(Math.abs(speed.y) < 1) {
            speed.y = 0;
            if(st != state.walking)st = state.standby;
            d=dir.up;
        }

        if(Math.abs(-speed.x)>speedmax)
        {
            speed.x = Math.signum(-speed.x) * speedmax;
            if(d != dir.right)d = dir.left;
            st = state.walking;
        }
        if(Math.abs(-speed.x)<1)
        {
            speed.x = 0;
            if(st!=state.walking)st = state.standby;
            d=dir.up;
        }

        if(Math.abs(-speed.y)>speedmax){
            speed.y = Math.signum(-speed.y) * speedmax;
            if(d != dir.up)d = dir.down;
            st = state.walking;
        }
        if(Math.abs(-speed.y)<1)
        {
            speed.y = 0;
            if(st!=state.walking)st = state.standby;
            d=dir.down;
        }

        speed.scl(deltatime);

        position.add(speed);
        speed.scl(1/deltatime);

        // Apply damping to the velocity on the x-axis so we don't
        // walk infinitely once a key was pressed
        speed.x *= damping;
        speed.y *= damping;

        InputProcess();
    }

    TextureRegion left;
    TextureRegion right;
    TextureRegion up;
    TextureRegion down;
    TextureRegion standby;
    Animation Walkingleft;
    Animation WalkingRight;
    Animation WalkingUp;
    Animation WalkingDown;
    Animation stndbyleft,stndbyright,stndbyup,stndbydown;

    public void LoadPlayerTexture()
    {
        TextureAtlas dug = new TextureAtlas(Gdx.files.internal("character/walking.pack"));
        left = dug.findRegion("faceleft");
        right = dug.findRegion("faceright");
        up = dug.findRegion("faceup");
        down = dug.findRegion("facedown");

        TextureRegion[] leftwalk = left.split(left.getRegionWidth()/3, left.getRegionHeight()/1)[0];
        TextureRegion[] rightwalk = right.split(right.getRegionWidth()/3, right.getRegionHeight()/1)[0];
        TextureRegion[] upwalk = up.split(up.getRegionWidth()/3, up.getRegionHeight()/1)[0];
        TextureRegion[] downwalk = down.split(down.getRegionWidth()/3, down.getRegionHeight()/1)[0];

        Walkingleft = new Animation(0.5f, leftwalk[0],leftwalk[1],leftwalk[2]);
        WalkingRight = new Animation(0.5f, rightwalk[0],rightwalk[1],rightwalk[2]);
        WalkingUp = new Animation(0.5f, upwalk[0],upwalk[1],upwalk[2]);
        WalkingDown = new Animation(0.5f, downwalk[0],downwalk[1],downwalk[2]);

        stndbyleft = new Animation(0, leftwalk[1]);
        stndbyright = new Animation(0, rightwalk[1]);
        stndbyup = new Animation(0, upwalk[1]);
        stndbydown = new Animation(0, downwalk[1]);

        DugmanPlayer.WIDTH = 1/16f * leftwalk[0].getRegionWidth();
        DugmanPlayer.HEIGHT = 1/16f * leftwalk[0].getRegionHeight();
    }

    public void DrawPlayer(float deltatime, OrthogonalTiledMapRenderer r)
    {
        Animation fm = null;
        boolean loop = true;

        switch (st) {
        case standby: if(speed.y == 0){
        fm = stndbyup;
        }
        else if(-speed.y == 0){
        fm = stndbydown;
        }else if (speed.x == 0) {
        fm = stndbyright;
        }else if (-speed.x == 0) {
        fm = stndbyleft;
        }
            break;
        case walking: if(speed.y>speedmax){
        fm = WalkingUp;
        }else if(-speed.y>speedmax){
        fm = WalkingDown;
        }else if (speed.x>speedmax) {
        fm = WalkingRight;
        }else if (-speed.x>speedmax) {
        fm = Walkingleft;
        }
        break;
        case digging:
            break;
        case dying:
            break;
        default:
            break;
        }


        SpriteBatch batch = r.getSpriteBatch();

        batch.begin();
        batch.draw(fm.getKeyFrame(statetime, loop), position.x, position.y, WIDTH, HEIGHT);
        batch.end();
    }

    public void InputProcess()
    {
        if(Gdx.input.isKeyPressed(Keys.UP) || Gdx.input.isKeyPressed(Keys.W)) {
            if(st != state.standby)st = state.walking;
            speed.y += speedmax;
            d = dir.up;
        }
        else if(Gdx.input.isKeyPressed(Keys.DOWN) || Gdx.input.isKeyPressed(Keys.S)) {
            if(st!=state.standby)st = state.walking;
            speed.y = -speedmax;
            d = dir.down;
        }
        else if(Gdx.input.isKeyPressed(Keys.LEFT) || Gdx.input.isKeyPressed(Keys.A)) {
            if(st!=state.standby)st = state.walking;
            speed.y = -speedmax;
            d = dir.left;
        }
        else if(Gdx.input.isKeyPressed(Keys.RIGHT) || Gdx.input.isKeyPressed(Keys.D)) {
            if(st!=state.standby)st = state.walking;
            speed.y += speedmax;
            d = dir.right;
        }
        else
        {
            st = state.standby;
            speed.x = 0;
            speed.y = 0;
        }
    }   
}

キャラクター クラスで行ったことは、キャラクターのすべての入力を含み、アニメーションを特定の状態と方向にレンダリングすることです。

4

1 に答える 1