连续数据和搜索

时间:2019-01-12 17:35:11

标签: c++ continuous

我想为我的游戏提供一种处理动画的新方法。目前,我在开关盒和嵌套开关盒中分别使用两个变量_physics_State_direction_State损害对象动画状态。我想摆脱这种使用开关盒的方法。

switch (_physics_State)
{
    case OBJECT_PHYSICS_STATE_GROUNDED: 
        switch(_direction_State)
        {
            case OBJECT_DIRECTION_UP: _animation_State = ANIMATION_STATE_YS_IDLE_UP; break;
            case OBJECT_DIRECTION_UP_RIGHT: _animation_State = ANIMATION_STATE_YS_IDLE_UP_RIGHT; break;
            case OBJECT_DIRECTION_UP_LEFT: _animation_State = ANIMATION_STATE_YS_IDLE_UP_LEFT; break;
            case OBJECT_DIRECTION_RIGHT: _animation_State = ANIMATION_STATE_YS_IDLE_RIGHT; break;
            case OBJECT_DIRECTION_RIGHT_DOWN: _animation_State = ANIMATION_STATE_YS_IDLE_RIGHT_DOWN; break;
            case OBJECT_DIRECTION_DOWN: _animation_State = ANIMATION_STATE_YS_IDLE_DOWN; break;
            case OBJECT_DIRECTION_DOWN_LEFT: _animation_State = ANIMATION_STATE_YS_IDLE_DOWN_LEFT; break;
            case OBJECT_DIRECTION_LEFT: _animation_State = ANIMATION_STATE_YS_IDLE_LEFT; break;     
            default: _animation_State = ANIMATION_STATE_YS_IDLE_DOWN; break;
        }
    break;
}

我提出了通过按特定顺序读取变量并将其存储在哈希图中来生成字符串的解决方案。除最后一个变量_speed之外,这似乎奏效。 _speed是连续的而不是离散的,并且可能具有一定范围的值,这些值仍将使对象达到相同的动画状态。我不能简单地将速度存储为一个简单的值。您将如何处理这种连续数据,使我可以用离散数据进行搜索?

std::string animation_state_string_results = "" 
    + std::to_string(_physics_State) 
    + "-" + std::to_string(_direction_State);
    + "-" + std::to_string(G_button_Press_Value);
    + "-" + std::to_string(_speed);

1 个答案:

答案 0 :(得分:0)

将“连续”数量转换为粗糙的“标签”非常容易。通常的想法是将范围划分为多个区间。然后使用 binary search 的变体来标识包含查询值的时间间隔。存储已知不大于输入的最大值和最小已知值的索引。请注意,您可以考虑使用 n 值来分隔 n +1个间隔(其中两个是半无限的)。如果这适合您的数据,则必须初始化一个或两个边界索引以将索引超出最外面的值。

您可以在连续变量上进行预处理,也可以存储(对于 other 变量的每个适当组合)一个数据结构,该数据结构包含与值平行的区间边界用于每个间隔。

同时,不要通过组装字符串来制作复合键-您最终会做一些愚蠢的事情,例如稍后重新解析它。而是使用tuple(或自定义类)。然后,您确实需要提供一个哈希函数,但这并不困难(并且存在libraries使其变得微不足道)。