考えられるコードパスをより慎重に制御するだけで、この問題を解決できると思います。たとえば、プレーヤーのライフ数が1を下回ったかどうかを確認する場合、すべてのフレームではなく、プレーヤーがライフを失ったときにのみ確認してください。
void subtractPlayerLife() {
// Generic life losing stuff, such as mLives -= 1
if (mLives < 1) {
// Do specific stuff.
}
}
これは、subtractPlayerLife
特定の場合にのみ呼び出されることを想定しています。これは、おそらくすべてのフレームをチェックする必要がある条件(衝突など)に起因する可能性があります。
コードの実行方法を慎重に制御することで、静的なブール値などの厄介な解決策を回避し、1つのフレームで実行されるコードの量をビット単位で削減できます。
リファクタリングが不可能と思われるものがあり、実際に一度だけチェックする必要がある場合は、状態(などenum
)または静的ブール値を使用します。自分で静的変数を宣言しないようにするには、次のトリックを使用できます。
#define ONE_TIME_IF(condition, statement) \
static bool once##__LINE__##__FILE__; \
if(!once##__LINE__##__FILE__ && condition) \
{ \
once##__LINE__##__FILE__ = true; \
statement \
}
次のコードが作成されます。
while (true) {
ONE_TIME_IF(1 > 0,
printf("something\n");
printf("something else\n");
)
}
印刷するsomething
とsomething else
、一度だけ。見栄えの良いコードは得られませんが、機能します。また、おそらく一意の変数名をより適切に保証することによって、それを改善する方法があると確信しています。#define
ただし、これは実行時に一度だけ機能します。リセットする方法はなく、保存する方法もありません。
トリックにも関わらず、最初にコードフローをより適切に制御し、これ#define
を最後の手段として、またはデバッグ目的でのみ使用することを強くお勧めします。