Java-игра - гладкий скроллер - игрок не может двигаться

Мой скроллер работает, но я не могу переместить проигрыватель.

Плеер центрируется посередине экрана окна. И карта центрируется по положению игрока.

Размер окна (программы) 640 x 640 px.

Карта map.tmx является ортогональной (игра в стиле zelda/pokemon).

Используя только клавиши ВВЕРХ, ВНИЗ, ВПРАВО, ВЛЕВО (без диагональных движений).

что я рассчитываю или делаю плохо?

public class Play extends BasicGameState {

    Animation movingUp, movingDown, movingLeft, movingRight;
    Animation player;
    String playerName = "Test";
    boolean quit = false;
    int[] duration = {200, 200, 200};
    int playerX = 0;
    int playerY = 0;
    int cameraX;
    int cameraY;
    int screenWidth;
    int screenHeight;
    private TiledMap map = null;
    private static final float SPEED = 0.1f;

    public Play(int state, float x, float y) {
        playerX = (int) x;
        playerY = (int) y;
    }

    @Override
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {

        map = new TiledMap("map/map.tmx");

        Image[] walkUp = {
            new Image("graphics/player/up0.png"),
            new Image("graphics/player/up1.png"),
            new Image("graphics/player/up2.png")
        };

        Image[] walkDown = {
            new Image("graphics/player/down0.png"),
            new Image("graphics/player/down1.png"),
            new Image("graphics/player/down2.png")
        };
        Image[] walkLeft = {
            new Image("graphics/player/left0.png"),
            new Image("graphics/player/left1.png"),
            new Image("graphics/player/left2.png")
        };
        Image[] walkRight = {
            new Image("graphics/player/right0.png"),
            new Image("graphics/player/right1.png"),
            new Image("graphics/player/right2.png")
        };

        movingUp = new Animation(walkUp, duration, false);
        movingDown = new Animation(walkDown, duration, false);
        movingLeft = new Animation(walkLeft, duration, false);
        movingRight = new Animation(walkRight, duration, false);

        player = movingDown;

    }

    @Override
    public void render(GameContainer gc, StateBasedGame sbg, Graphics g) throws SlickException {

        screenWidth = gc.getWidth();
        screenHeight = gc.getHeight();

        cameraX = (screenWidth / 2) - (playerX / 2);
        cameraY = (screenHeight / 2) - (playerY / 2);

        map.render(playerX, playerY);

        player.draw(cameraX, cameraY);

        g.drawString("X: " + playerX + "\nY: " + playerY, 520, 20);
        g.resetTransform();

    }

    @Override
    public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
        Input input = gc.getInput();

        if (input.isKeyDown(Input.KEY_UP)) {
            player = movingUp;
            player.update(delta);
            playerY += delta * SPEED;
        } else if (input.isKeyDown(Input.KEY_DOWN)) {
            player = movingDown;
            player.update(delta);
            playerY -= delta * SPEED;
        } else if (input.isKeyDown(Input.KEY_LEFT)) {
            player = movingLeft;
            player.update(delta);
            playerX += delta * SPEED;
        } else if (input.isKeyDown(Input.KEY_RIGHT)) {
            player = movingRight;
            player.update(delta);
            playerX -= delta * SPEED;
        }

    }

}

person Ing. Michal Hudak    schedule 17.11.2012    source источник
comment
вы не предоставили функцию player.update(), но похоже, что вы рисуете игрока в shiftX и shiftY, которые никогда не меняются. анимация плеера работает?   -  person Alex Lynch    schedule 17.11.2012
comment
Я могу изменить направление игрока, но анимация будет отображаться только вверх0,вниз0,влево0,вправо   -  person Ing. Michal Hudak    schedule 17.11.2012
comment
Есть player.update(дельта); в методе обновления   -  person Ing. Michal Hudak    schedule 17.11.2012
comment
Можете ли вы опубликовать скриншот и объяснить, каков желаемый результат?   -  person user1097489    schedule 19.11.2012
comment
Ваш плеер всегда будет в центре окна экрана. Когда вы двигаетесь вместе с игроком, он все еще будет в центре, но карта будет прокручиваться на экране.   -  person Ing. Michal Hudak    schedule 19.11.2012
comment
тогда ваш код выглядит нормально, за исключением того, что ваши направления меняются местами. единственное объяснение вашего поведения в том, что дельта всегда равна нулю. попробуйте удалить его из кода обновления и посмотрите, что произойдет.   -  person user1097489    schedule 19.11.2012


Ответы (1)


Основная идея:

screenWidth = gc.getWidth();
screenHeight = gc.getHeight();

cameraX = (screenWidth / 2) - (playerX / 2);
cameraY = (screenHeight / 2) - (playerY / 2);

map.render(playerX, playerY);
player.draw(cameraX, cameraY);

Работа в моем примере

person Ing. Michal Hudak    schedule 21.11.2012