как перемещать спрайт и рисовать его через интервал времени в libGdx?

125
14 декабря 2019, 17:40

У меня есть поле из клеток, есть игрок - спрайт, есть массив точек(путь для игрока в определенную точку). У класса Field, содержащего информацию о клетках, имеется метод setListener для каждой клетки (при нажатии на клетку игрок перемещается в нее методом changePosition по пути из точек).

задача - сделать так чтобы игрок перемещался с интервалом (как бы шел по каждой точке). Он у меня либо перемещается очень быстро, либо ждет -> что-то выполняет -> а потом опять же быстро перемещается.

class GameScreen

 @Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    camera.update();
    spriteBatch.begin();
    spriteBatch.setProjectionMatrix(camera.combined);
    field.drawField(spriteBatch);
    field.setListener();
    p1.draw(spriteBatch);
    spriteBatch.end();
    }

class Field

public void setListener() {
    for (int i = 0; i < getLength(); i++) {
        for (int j = 0; j < getLength(); j++) {
            Step step = fieldMatrix[i][j];
            if (step.isPath()) {
                if (Gdx.input.isTouched()) {
                    float tX = Gdx.input.getX();
                    float tY = Gdx.input.getY();
                    Vector3 v = new Vector3(tX, tY, 0);
                    camera.unproject(v);
                    Rectangle getBounds = step.getBoundingRectangle();
                    if (getBounds.contains(v.x, v.y)) {
                        player.changePosition(j, i);
                        break;
                    }
                }
            }
        }
    }
}

class Player

    public void changePosition(int x, int y) {
    int sX = (int) (posX) / 60;
    int sY = (int) (posY) / 60;
    if (x != sX || y != sY) {
        Point start = new Point(sX, sY);
        Point end = new Point(x, y);
        Point[] pathArray = find(start, end);
        if (pathArray != null) {
            for (int i = 0; i < pathArray.length; i++) {
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                }
                catch (InterruptedException ie){
                    ie.printStackTrace();
                }
                    float changeX = pathArray[i].getX() * 60 + 7;
                    float changeY = pathArray[i].getY() * 60 + 7;
                    this.setPosition(changeY, changeX);
                    this.draw(batch);
                    this.updateCoordinates(changeX, changeY);
            }
        } else System.out.println("путь - null");
    }
}
READ ALSO
Почему блок не рендерится по всему своему размеру (Chrome)?

Почему блок не рендерится по всему своему размеру (Chrome)?

Накидал структуру и основные стили: https://fiddlejshell

107
Рандомное изменение стейта

Рандомное изменение стейта

Не получается выбрать рандомный элемент в thisstate

133
Слайдер, галерея на сайт с навигацией элементы состоят из текста и изображения

Слайдер, галерея на сайт с навигацией элементы состоят из текста и изображения

Всем привет, ищу готовое (или почти готовое) решение для слайдера-галереиОсобенность в том, что бы можно было управлять слайдами как при клике...

112
увеличение значения переменной

увеличение значения переменной

Учу js, подскажите что происходит в цикле while?

123