如何让(轮盘赌)时间表放慢

How to make a (roulette) schedule slow down

我正在尝试制作一个平稳减速的轮盘赌(类似于命运之轮)(最快每 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();
    }
}

我认为您设置目标转数的方法是错误的。尽管可能会解决这个问题,但从一个简单的车轮模型开始会更容易。

我不是专家,但我相信有两个因素会导致车轮减速:与车轮速度无关的固定静摩擦力和取决于车轮速度的可变静摩擦力车轮的速度。通常情况下,变量与速度的平方成正比。

所以你会有一个公式:

friction = a + b*(v*v)

其中 a 和 b 是您可以调整的一些值(可能 a 需要比 b 大很多),v 是以任意单位表示的轮子旋转速度。

如果您的 frame-rate 足够快,您可以尝试从每帧的速度中减去摩擦,直到速度足够接近零,您可以认为它已停止。尝试 a 和 b 直到它看起来不错。

否则你将不得不做一些积分或插值,这不会令人愉快,所以先尝试第一种方法。

如果您真的对轮盘赌的准确模型感兴趣(抽象而言,而不是代码),我建议您询问物理堆栈交换。