Как выполнить блок, только если все предыдущие условия были ложными, и выполнить определенный блок, если одно из них было истинным?

Я делаю небольшую игру на C ++, и мне интересно, как оптимизировать ветвление. Посмотрите на этот код:

if (
isUpPressed ||
isDownPressed ||
isLeftPressed ||
isRightPressed ||
isSpacePressed
) {
if (isUpPressed)
state |= State::MoveUp;
if (isDownPressed)
state |= State::MoveDown;
if (isLeftPressed)
state |= State::MoveLeft;
if (isRightPressed)
state |= State::MoveRight;
if (isSpacePressed)
state |= State::Jump);
} else
state = State::Still;

То, чего я хочу достичь, это: если нажаты вверх, вниз, влево, вправо или пробел, установите state на соответствующее значение. Если никто из этих условий было верно, установите состояние State::Still, Мой код работает, но кажется, что я делаю это неправильно. Должен быть лучший способ. Мой вопрос:
Как выполнить блок, только если все указанного условия не удалось выполнить и выполнить блок, специфичный для каждого из этих условий, если выполняется одно или несколько, без использования вложенных if и много || операторы как я?

1

Решение

Как взято из кусочков в комментариях. Возможно, что-то вроде этого (при условии, что ни одно из состояний движения не имеет значения 0)

State::Value state = State::Value(0);
if (isUpPressed)
state |= State::MoveUp;
if (isDownPressed)
state |= State::MoveDown;
if (isLeftPressed)
state |= State::MoveLeft;
if (isRightPressed)
state |= State::MoveRight;
if (isSpacePressed)
state |= State::Jump);

if(state == State::Value(0))
state = State::Still;

if(isOnFire)
state |= State::Fire;

В качестве альтернативы, если у вас есть больше блоков кода, похожих на блок движения, вы можете создать переменную временного состояния, обработать ее таким же образом и объединить временное состояние и исходное состояние.

2

Другие решения

Я думаю, что вы можете сделать это так:

state = State::Still;

if (isUpPressed)
state |= State::MoveUp;
if (isDownPressed)
state |= State::MoveDown;
if (isLeftPressed)
state |= State::MoveLeft;
if (isRightPressed)
state |= State::MoveRight;
if (isSpacePressed)
state |= State::Jump;

Таким образом, если ни одна клавиша не была нажата, state установлен в Still,

Если state не равен 0, менелдальное решение может работать, то есть использовать логическое значение.

3

Если State :: Still не равно 0, вы можете установить логическое значение в каждой ветви. Установка логического значения — это очень быстрая операция, поэтому она, вероятно, быстрее, чем ваш первый подход. Например

bool still=true;

if (isUpPressed)
still=false, state |= State::MoveUp;
if (isDownPressed)
still=false, state |= State::MoveDown;
if (isLeftPressed)
still=false, state |= State::MoveLeft;
if (isRightPressed)
still=false, state |= State::MoveRight;
if (isSpacePressed)
still=false, state |= State::Jump;
if(still)
state=State::Still;

Существует также, вероятно, вложенный подход, но он очень уродливый и, вероятно, не лучший по производительности.

2
По вопросам рекламы [email protected]