Как замедлить расписание (рулетка) - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь сделать рулетку (вроде колеса Колесо Фортуны), которая плавно замедляется (быстрее всего она может проходить раз в 50 мс).

Сейчас у меня есть такая конфигурация, какэто:

  runs:
    - max-runs: 40
      default-tick-duration: 10
      runs:
        - first: 1
          last: 20
          tick-duration: 10
        - first: 20
          last: 30
          tick-duration: 15
        - first: 30
          last: 35
          tick-duration: 20
        - first: 35
          last: 37
          tick-duration: 25
        - first: 37
          last: 38
          tick-duration: 30
        - first: 38
          last: 39
          tick-duration: 35
        - first: 39
          last: 40
          tick-duration: 40

Это не совсем гладко, но можно сделать плавно, попробовав несколько конфигураций, и мне интересно, возможно ли это с помощью модификатора или чего-то еще.

Я почти уверен, что видел кое-что для этого на уроках математики, но не могу этого сделать.Идея состоит в том, чтобы иметь настраиваемое количество макс. Прогонов, например 40, и чем ближе оно к этому, тем медленнее становится (плавно) рулетка.

Язык, на котором я пишу это:Java, и это моя текущая задача / Runnable (которая выполняется каждые 50 мс):

package com.dbsoftwares.dangerwheel.wheel.hologram;

import com.dbsoftwares.dangerwheel.utils.objects.CircleColor;
import com.dbsoftwares.dangerwheel.utils.objects.WheelRun;
import com.dbsoftwares.dangerwheel.utils.objects.WheelRunData;
import com.dbsoftwares.dangerwheel.wheel.WheelCircle;
import com.dbsoftwares.dangerwheel.wheel.WheelManager;
import com.gmail.filoghost.holographicdisplays.api.Hologram;
import lombok.RequiredArgsConstructor;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.List;

@RequiredArgsConstructor
public class HologramWheelTask extends BukkitRunnable {

    private final WheelManager manager;
    private final Hologram hologram;
    private final WheelCircle circle;
    private final WheelRunData runData;
    private final int startIdx;

    private int ticks = 0;
    private int runs = 0;

    @Override
    public void run() {
        if (ticks < calculateRequiredTimeForRun()) {
            ticks++;
            return;
        }

        ticks = 0;
        runs++;

        // execute roulette tick

        if (runs >= runData.getMaxRuns()) {
            // roulette finished
            cancel();
        }
    }

    private int calculateRequiredTimeForRun() {
        final WheelRun data = runData.getRuns()
                .stream()
                .filter(run -> runs >= run.getFirst() && runs < run.getLast())
                .findFirst()
                .orElse(null);

        if (data == null) {
            return runData.getDefaultDuration();
        }
        return data.getTickDuration();
    }

    private String buildLine(final List<CircleColor> colors) {
        final StringBuilder line = new StringBuilder();

        colors.forEach(color -> line.append(color.getAsText()));

        return line.toString();
    }
}

1 Ответ

0 голосов
/ 29 июня 2019

Я думаю, что ваш подход неверен в установлении целевого числа оборотов.Хотя было бы возможно решить это, было бы легче начать с простой модели колеса.

Я не эксперт, но я считаю, что в трении будет два компонента, которыезамедление вращения колеса: постоянная величина статического трения, не зависящая от скорости вращения колеса, и переменная величина, зависящая от скорости вращения колеса.Обычно переменная величина будет пропорциональна квадрату скорости.

Таким образом, у вас будет формула:

friction = a + b*(v*v)

, где a и b - некоторые значения, которые вы можете настроить (вероятно, aдолжно быть намного больше, чем b), а v - это скорость вращения колеса в некоторых произвольных единицах.

Если ваша частота кадров достаточно высока, вы можете просто попытаться вычесть трение из скорости каждого кадра доскорость приближается к нулю, вы можете считать, что она остановлена.Поиграйте с a и b, пока он не будет хорошо выглядеть.

В противном случае вам придется выполнить интеграцию или интерполяцию, что не будет приятным, поэтому сначала попробуйте первый способ.

Если выдействительно заинтересованы в точной модели колеса рулетки (в абстрактных терминах, а не в виде кода), я предлагаю спросить об обмене стека физики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...