【问题标题】:Continuous data and searching连续的数据和搜索
【发布时间】:2019-01-12 17:35:11
【问题描述】:

我想为我的游戏创建一种处理动画的新方法。目前,我使用两个变量_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);

【问题讨论】:

  • 不使用switch,为什么不使用表格(至少对于您发布的代码块)?我不确定我理解你对 _speed 变量的意思,所以我没有答案。
  • 阅读此“我想摆脱这种使用开关盒的方法。” “我想出了通过以特定顺序读取变量并将其存储在哈希映射中来生成字符串的解决方案。”这个问题是速度不是离散的。它就像一个单元。如果速度为 4 或 11,则这些数字之间的所有值的动画状态仍然相同。
  • 我不明白。没有办法将连续数据作为离散数据进行搜索。但你似乎明白这一点。所以你想要什么?如果速度是真的问题,你可以留在swtich case,但我只会std::map<direction_states, animation_states>并使用find。
  • 我没说我什么都懂。我只是问是否有办法搜索连续数据。我有四个不同的变量要处理。 “_speed”就是其中之一。我需要确认一个范围内的东西而不是一个值。

标签: c++ continuous


【解决方案1】:

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

您可以将其作为连续变量的预处理步骤,或者您可以存储(对于其他变量的每个适当组合)包含与值并行的区间边界的数据结构用于每个间隔。

同时,不要通过组合字符串来创建复合键——你最终会做一些愚蠢的事情,比如稍后重新解析它。相反,使用tuple(或自定义类)。然后你必须提供一个哈希函数,但这并不难(并且存在 libraries 使其变得微不足道)。

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2017-08-05
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多