1

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ます。私のコードは機能しますが、間違っているように感じます。もっと良い方法があるはずです。私の質問は次のとおりです。指定されたすべて
の条件が失敗した場合にのみブロックを実行し、1 つまたは複数が true の場合にこれらの条件のそれぞれに固有のブロックを実行する方法です。ネストされた演算子や多くの演算子を使用する必要はありません。if||

4

3 に答える 3

3

私はあなたがそのようにすることができると思います:

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ます。

前に 0 でない場合stateは、メネルダル ソリューションが機能する可能性があります。つまり、ブール値を使用します。

于 2014-06-17T13:01:22.320 に答える
2

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;

おそらくネストされたアプローチもありますが、それは非常に醜く、おそらくパフォーマンスが向上するわけではありません。

于 2014-06-17T13:35:26.790 に答える
2

コメントの断片から取られたように。おそらくこのようなものです(値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;

または、移動ブロックに似たコード ブロックがさらにある場合は、一時状態変数を作成し、それを同じように処理して、一時状態と元の状態をマージすることができます。

于 2014-06-17T13:45:47.953 に答える