48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
#include "speed.hpp"
|
|
#include <algorithm>
|
|
#include <cmath>
|
|
|
|
static float current_speed = 0.0f;
|
|
static float max_speed = 40.0f;
|
|
static float accel_rate = 2.0f;
|
|
static float decel_rate = 5.0f;
|
|
|
|
void speed_strategy_reset()
|
|
{
|
|
current_speed = 0.0f;
|
|
}
|
|
|
|
float calc_base_speed(const TrackInfo& info)
|
|
{
|
|
float target = max_speed * 0.7f; // 默认中速
|
|
|
|
switch (info.scene)
|
|
{
|
|
case TRACK_STRAIGHT:
|
|
target = max_speed;
|
|
break;
|
|
case TRACK_GENTLE_CURVE:
|
|
target = max_speed * 0.6f;
|
|
break;
|
|
case TRACK_SHARP_CURVE:
|
|
target = max_speed * 0.35f;
|
|
break;
|
|
case TRACK_LOST_LINE:
|
|
target = max_speed * 0.2f;
|
|
break;
|
|
case TRACK_CROSS:
|
|
target = max_speed * 0.5f;
|
|
break;
|
|
}
|
|
|
|
if (std::fabs(info.deviation) > 0.6f)
|
|
target *= 0.6f;
|
|
|
|
float diff = target - current_speed;
|
|
float rate = (diff > 0) ? accel_rate : decel_rate;
|
|
current_speed += rate * (diff > 0 ? 1 : -1) * 0.01f;
|
|
current_speed = std::clamp(current_speed, 0.0f, max_speed);
|
|
|
|
return current_speed;
|
|
}
|