连续数据和搜索
Continuous data and searching
我想为我的游戏制作一种处理动画的新方法。目前,我使用两个变量 _physics_State
和 _direction_State
来破坏对象动画状态,分别用于 switch case 和嵌套的 switch case。我想摆脱这种使用 switch cases 的方法。
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);
将“连续”数量转换为粗略“标签”非常容易。通常的想法是将范围划分为区间;然后使用 binary search 的变体来识别包含查询值的区间。存储已知不大于输入的最大值和已知大于输入的最小值的索引。请注意,您可以考虑 n 值来分隔 n+1 间隔(其中两个是半无限);如果这适合您的数据,则必须将一个或两个边界索引初始化为索引 beyond 最外层值。
您可以将其作为对连续变量的预处理步骤,或者您可以存储(对于 other 变量的每个适当组合)包含区间边界的数据结构与每个间隔使用的值并行。
同时,不要通过组合字符串来制作复合键——你最终会做一些愚蠢的事情,比如稍后重新解析它。相反,使用 tuple
(或自定义 class)。然后你必须提供一个哈希函数,但这并不困难(并且存在 libraries 使其变得微不足道)。
我想为我的游戏制作一种处理动画的新方法。目前,我使用两个变量 _physics_State
和 _direction_State
来破坏对象动画状态,分别用于 switch case 和嵌套的 switch case。我想摆脱这种使用 switch cases 的方法。
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);
将“连续”数量转换为粗略“标签”非常容易。通常的想法是将范围划分为区间;然后使用 binary search 的变体来识别包含查询值的区间。存储已知不大于输入的最大值和已知大于输入的最小值的索引。请注意,您可以考虑 n 值来分隔 n+1 间隔(其中两个是半无限);如果这适合您的数据,则必须将一个或两个边界索引初始化为索引 beyond 最外层值。
您可以将其作为对连续变量的预处理步骤,或者您可以存储(对于 other 变量的每个适当组合)包含区间边界的数据结构与每个间隔使用的值并行。
同时,不要通过组合字符串来制作复合键——你最终会做一些愚蠢的事情,比如稍后重新解析它。相反,使用 tuple
(或自定义 class)。然后你必须提供一个哈希函数,但这并不困难(并且存在 libraries 使其变得微不足道)。