platform

Table of Contents

Платформа

Раньше мы управляли шариком "вручную" - это было удобно во время отладки, чтобы проверить, что все столкновения считаются правильно. Теперь мы будем управлять им опосредованно - с помощью платформы, которая будет шарик отбивать. Займемся созданием платформы, для начала, надо ее нарисовать и положить в core/assets:

nil

Теперь, точно также как и остальные изображения, нужно завести для нее поле. Так же как для шарика нам могли бы понадобиться две переменных для координаты платформы и ее скорости. Но так как платформа все равно двигается только по горизонтали, то мы могли бы использовать ее вертикальную координату для хранения скорости. Создадим необходимые переменные:

Texture platform;
Vector2 plt = new Vector2(0, 0);

и загрузим картинку при старте:

platform = new Texture("platform.png");

Теперь заменим блок input, где мы управляли скоростью шарика так, чтобы управлять горизонтальной скоростью платформы:

// input
if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
    plt.y += 1;
}
if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
    plt.y -= 1;
}

По аналогии с шариком, установим ограничитель, чтобы ускорение платформы не было слишком большим:

// braking platform
if (plt.y > 7) {
    plt.y = 7;
}
if (plt.y < -7) {
    plt.y = -7;
}

Вычислим новые координаты платформы. Мы также можем добавить в расчет некоторое трение, которое вычисляется как 1/10 * 95/10 - это придаст платформе естественности в движениях.

// update coords platform
plt.x = plt.x + 2 * plt.y;
plt.y *= 1f / 10f * 9.5;

И еще добавим торможение платформы об левую и правую стены

// stop platform at the border
if (plt.x < 0) {
    plt.x = 0;
    plt.y = 0;
}
if (plt.x > max.x - platform.getWidth()) {
    plt.x = max.x - platform.getWidth();
    plt.y = 0;
}

Добавим строчку, которая выводит платформу в render:

batch.draw(platform, plt.x, 0);

Столкновение шарика с платформой

Наша платформа имеет определенную высоту. Если вертикальная координата шарика находится ниже этой высоты, значит шарик имеет шанс быть упущенным. Мы можем проверить, находится ли платформа под шариком, и если да - отбить шарик, изменив его вектор ускорения.

// platform-ball collision
if (pos.y < platform.getHeight()) {
    // шарик ниже платформы
    if ((pos.x > plt.x) && (pos.x+img.getWidth() < plt.x + platform.getWidth())) {
        // платформа под шариком - расчитаем угол отскока
        // инвертируем вектор вертикальной скорости
        acc.y *= -1;
        // вычислим центр шарика
        float ballCenter = pos.x + img.getWidth() / 2;
        // вычислим центр платформы
        float platformCenter = plt.x + platform.getWidth() / 2;
        // расстояние между центрами
        float distance = ballCenter - platformCenter;
        // горизонтальная скорость зависит от дистанции
        acc.x = distance / 20;
        pos.y = platform.getHeight();
    } else {
        // игрок промахнулся - игре конец
        // todo..
    }
}
Яндекс.Метрика
Home