0

私は LibGDX でゲームに取り組んでいますが、プレイヤーの方向と歩行アニメーションの両方が変わりません。彼は上下左右に歩くことができますが、どの方向に歩いても左を向くだけです。

public class WorldController {

enum KeyBinds {
    LEFT, RIGHT, UP, DOWN, JUMP, FIRE
}

private World world;
private Player p;

static Map<KeyBinds, Boolean> keys = new HashMap<WorldController.KeyBinds, Boolean>();
static {
    keys.put(KeyBinds.LEFT, false);
    keys.put(KeyBinds.RIGHT, false);
    keys.put(KeyBinds.UP, false);
    keys.put(KeyBinds.DOWN, false);
    keys.put(KeyBinds.JUMP, false);
    keys.put(KeyBinds.FIRE, false);
};

public WorldController(World world) {
    this.world = world;
    this.p = world.getPlayer();
}

// ** Key presses and touches **************** //

public void leftPressed() {
    keys.get(keys.put(KeyBinds.LEFT, true));
}

public void rightPressed() {
    keys.get(keys.put(KeyBinds.RIGHT, true));
}

public void upPressed() {
    keys.get(keys.put(KeyBinds.UP, true));
}

public void downPressed() {
    keys.get(keys.put(KeyBinds.DOWN, true));
}

public void jumpPressed() {
    keys.get(keys.put(KeyBinds.JUMP, true));
}

public void firePressed() {
    keys.get(keys.put(KeyBinds.FIRE, false));
}

public void leftReleased() {
    keys.get(keys.put(KeyBinds.LEFT, false));
}

public void rightReleased() {
    keys.get(keys.put(KeyBinds.RIGHT, false));
}

public void upReleased() {
    keys.get(keys.put(KeyBinds.UP, false));
}

public void downReleased() {
    keys.get(keys.put(KeyBinds.DOWN, false));
}

public void jumpReleased() {
    keys.get(keys.put(KeyBinds.JUMP, false));
}

public void fireReleased() {
    keys.get(keys.put(KeyBinds.FIRE, false));
}

/** The main update method **/
public void update(float delta) {
    processInput();
    p.update(delta);
}

/** Change player's state and parameters based on input controls **/
private void processInput() {
    if(Gdx.input.isKeyPressed(Keys.LEFT)) {
        // left is pressed

        //p.setFacingLeft(true);
        p.setState(State.WALKING);
        p.getVelocity().x = -Player.SPEED;
        p.getVelocity().y = 0;
    }
    if(Gdx.input.isKeyPressed(Keys.RIGHT)){
        // right is pressed

        //p.setFacingRight(true);
        p.setState(State.WALKING);
        p.getVelocity().x = Player.SPEED;
        p.getVelocity().y = 0;
    }
    if(Gdx.input.isKeyPressed(Keys.UP)) {
        // up is pressed

        //p.setFacingUp(true);
        p.setState(State.WALKING);
        p.getVelocity().y = Player.SPEED;
        p.getVelocity().x = 0;
    }
    if(Gdx.input.isKeyPressed(Keys.DOWN)) {
        // down is pressed

        //p.setFacingDown(true);
        p.setState(State.WALKING);
        p.getVelocity().y = -Player.SPEED;
        p.getVelocity().x = 0;
    }
    // need to check if both or none direction are pressed, then player is idle
//      if ((keys.get(Keys.LEFT) && keys.get(Keys.RIGHT)) ||
//              (!keys.get(Keys.LEFT) && !(keys.get(Keys.RIGHT)))) {
//          p.setState(State.IDLE);
//          // acceleration is 0 on the x
//          p.getAcceleration().x = 0;
//          // horizontal speed is 0
//          p.getVelocity().x = 0;
//      }
}
}





public class WorldRenderer {

private static final float CAMERA_WIDTH = 10f;
private static final float CAMERA_HEIGHT = 7f;


    private World world;
    private OrthographicCamera cam;

    /** for debug rendering **/
    ShapeRenderer debugRenderer = new ShapeRenderer();

    private SpriteBatch spriteBatch;
    private boolean debug = false;
    private int width;
    private int height;
    private float ppuX;
    private float ppuY;

    private static final float RUNNING_FRAME_DURATION = 0.06f;

    /** Textures **/
    private TextureRegion pIdleLeft;
    private TextureRegion pIdleRight;
    private TextureRegion pIdleUp;
    private TextureRegion pIdleDown;
    private TextureRegion blockTexture;
    private TextureRegion pFrame;

    /** Animations **/
    private Animation walkLeftAnimation;
    private Animation walkRightAnimation;
    private Animation walkUpAnimation;
    private Animation walkDownAnimation;

    private void loadTextures() {
        TextureAtlas atlas = new TextureAtlas(Gdx.files.internal("images/textures/textures.pack"));
        pIdleLeft = atlas.findRegion("Left1");
        pIdleRight = new TextureRegion(pIdleLeft);
        pIdleRight.flip(true, false);
        pIdleUp = atlas.findRegion("Back1");
        pIdleDown = atlas.findRegion("Front1");
        blockTexture = atlas.findRegion("stone");

        //Walking Left Animation
        TextureRegion[] walkLeftFrames = new TextureRegion[2];

        walkLeftFrames[0] = atlas.findRegion("Left1");
        walkLeftFrames[1] = atlas.findRegion("Left2");

        walkLeftAnimation = new Animation(RUNNING_FRAME_DURATION, walkLeftFrames);

        //Walking Right Animation
        TextureRegion[] walkRightFrames = new TextureRegion[2];

        walkRightFrames[0] = new TextureRegion(walkLeftFrames[0]);
        walkRightFrames[0].flip(true, false);

        walkRightFrames[1] = new TextureRegion(walkLeftFrames[1]);
        walkRightFrames[1].flip(true, false);

        walkRightAnimation = new Animation(RUNNING_FRAME_DURATION, walkRightFrames);

        //Walking Up Animation
        TextureRegion[] walkUpFrames = new TextureRegion[2];

        walkUpFrames[0] = atlas.findRegion("Back1");
        walkUpFrames[1] = atlas.findRegion("Back2");

        walkUpAnimation = new Animation(RUNNING_FRAME_DURATION, walkUpFrames);

        //Walking Down Animation
        TextureRegion[] walkDownFrames = new TextureRegion[2];

        walkLeftFrames[0] = atlas.findRegion("Front1");
        walkLeftFrames[1] = atlas.findRegion("Front2");

        walkDownAnimation = new Animation(RUNNING_FRAME_DURATION, walkDownFrames);
    }

    public void drawPlayer() {
        Player p = world.getPlayer();
        if(p.getState().equals(State.IDLE)) {
            if(Gdx.input.isKeyPressed(Keys.LEFT)) pFrame = pIdleLeft;
            else if(Gdx.input.isKeyPressed(Keys.RIGHT)) pFrame = pIdleRight;
            else if(Gdx.input.isKeyPressed(Keys.UP)) pFrame = pIdleUp;
            else if(Gdx.input.isKeyPressed(Keys.DOWN)) pFrame = pIdleDown;
        }

        if(p.getState().equals(State.WALKING)) {
            if(Gdx.input.isKeyPressed(Keys.LEFT)) walkLeftAnimation.getKeyFrame(p.getStateTime(), true);
            else if(Gdx.input.isKeyPressed(Keys.RIGHT)) walkRightAnimation.getKeyFrame(p.getStateTime(), true);
            else if(Gdx.input.isKeyPressed(Keys.UP)) walkUpAnimation.getKeyFrame(p.getStateTime(), true);
            else if(Gdx.input.isKeyPressed(Keys.DOWN)) walkDownAnimation.getKeyFrame(p.getStateTime(), true);
        }

        spriteBatch.draw(pFrame, p.getXPosition() * ppuX, p.getYPosition() * ppuY, Player.SIZE * ppuX, Player.SIZE * ppuY);
    }

    public void setSize(int w, int h){
        this.width = w;
        this.height = h;
        ppuX = (float)width / CAMERA_WIDTH;
        ppuY = (float)height / CAMERA_HEIGHT;

    }

    public WorldRenderer(World world, boolean debug) {
        this.world = world;
        this.cam = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
        this.cam.position.set(CAMERA_WIDTH / 2f, CAMERA_HEIGHT / 2f, 0);
        this.cam.update();
        this.debug = debug;
        spriteBatch = new SpriteBatch();
        loadTextures();
    }

    public void render(){
        spriteBatch.begin();
            drawBlocks();
            drawPlayer();
        spriteBatch.end();
        if(debug){
            drawDebug();
        }
    }

    public void drawBlocks(){
        for(Block block : world.getBlocks()){
            spriteBatch.draw(blockTexture, block.getXPosition() * ppuX, block.getYPosition() * ppuY, Block.getSize() * ppuX, Block.getSize() * ppuY );
        }
    }

    public void drawDebug() {
        // render blocks
        debugRenderer.setProjectionMatrix(cam.combined);
        debugRenderer.begin(ShapeType.Line);
        for (Block block : world.getBlocks()) {
            Rectangle rect = block.getBounds();
            float x1 = block.getXPosition() + rect.x;
            float y1 = block.getYPosition() + rect.y;
            debugRenderer.setColor(new Color(1, 0, 0, 1));
            debugRenderer.rect(x1, y1, rect.width, rect.height);
        }
    // render Player
    Player p = world.getPlayer();
    Rectangle rect = p.getBounds();
    float x1 = p.getXPosition() + rect.x;
    float y1 = p.getYPosition() + rect.y;
    debugRenderer.setColor(new Color(0, 1, 0, 1));
    debugRenderer.rect(x1, y1, rect.width, rect.height);
    debugRenderer.end();
}
}



public class Player {

public enum State{
    IDLE, WALKING, JUMPING, DYING
}

public static final float SPEED = 4f; //units per second
public static final float SIZE = 0.5f; //half a unit
float stateTime = 0;

Vector2 position = new Vector2();
Vector2 acceleration = new Vector2();
Vector2 velocity = new Vector2();
Rectangle bounds = new Rectangle();
State state = State.IDLE;

boolean facingLeft;
boolean facingRight;
boolean facingUp;
boolean facingDown;

public Player(Vector2 position){
    this.position = position;
    this.bounds.height = SIZE;
    this.bounds.width = SIZE;
}

public void setFacingLeft(boolean facingLeft) {
    this.facingLeft = facingLeft;
}

public void setFacingRight(boolean facingRight) {
    this.facingRight = facingRight;
}

public void setFacingUp(boolean facingUp) {
    this.facingUp = facingUp;
}

public void setFacingDown(boolean facingDown) {
    this.facingDown = facingDown;
}

public Vector2 getAcceleration() {
    return acceleration;
}

public Vector2 getVelocity() {
    return velocity;
}

public void setState(State newState){
    this.state = newState;
}

public void update(float delta){
    stateTime += delta;
    position.add(velocity.cpy().scl(delta));
}

public Rectangle getBounds() {
    return bounds;
}

public Object getPosition() {
    return position;
}

public float getXPosition(){
    return this.position.x;
}

public float getYPosition(){
    return this.position.y;
}

public Object getState() {
    return state;
}

public float getStateTime() {
    return stateTime;
}
}

すべてのコードで申し訳ありませんが、問題がどこにあるのかわからず、関連するものを除外したくありませんでした. ばかげた間違いだと確信していますが、私は長い間それを見つめてきました.

また、各クラスを独自のコード ブロックに入れるように努力しましたが、うまくいきませんでした。stackoverflow は初めてです。助けようとする人に感謝します。

4

0 に答える 0