Непрерывные данные и поиск - PullRequest
0 голосов
/ 12 января 2019

Я хочу сделать новый способ обработки анимации для моей игры. В настоящее время я ухудшаю состояние анимации объекта двумя переменными _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 голосов
/ 13 января 2019

Достаточно просто преобразовать «непрерывное» количество в грубую «метку». Обычная идея - разделить диапазон на интервалы; затем используйте вариант бинарный поиск , чтобы определить интервал, содержащий значение запроса. Сохраните индекс наибольшего значения, которое, как известно, не больше, чем входное значение, и наименьшего значения, которое, как известно, больше. Обратите внимание, что вы можете рассмотреть значения n для разделения n + 1 интервал (два из которых являются полубесконечными); если это подходит для ваших данных, вы должны инициализировать один или оба ограничивающих индекса для индексов за пределами крайних значений.

Вы можете сделать это в качестве шага предварительной обработки непрерывной переменной или сохранить (для каждой подходящей комбинации других переменных) структуру данных, которая содержит границы интервалов параллельно со значениями для используйте для каждого интервала.

Между тем, не создавайте составной ключ, собирая строку, - в конечном итоге вы будете делать глупые вещи, такие как повторный анализ его позже. Вместо этого используйте tuple (или пользовательский класс). Затем вам нужно предоставить хеш-функцию, но это не сложно (и существует библиотек , чтобы сделать ее тривиальной).

...