カーソル移動

自分は、上キーを押したらカーソルが1つ上に移動して、一番上で上キーを押したら一番下に行くようなプログラムはを組むことがよくあります。
つまり、プログラムで書くと、

int min = 1;  //最小の値
int num = 5;  //選択肢の数
if( isKeyPush( KEY_UP ) ){
    cursor--;
    if( cursor < min ) cursor = min + num - 1;
}

こんな感じになります。
また、下キーについても同じような処理を追加してやると、

int min = 1;  //最小の値
int num = 5;  //選択肢の数
if( isKeyPush( KEY_UP ) ){
    cursor--;
    if( cursor < min ) cursor = min + num - 1;
}
if( isKeyPush( KEY_DOWN ) ){
    cursor++;
    if( cursor >= min + num ) cursor = min;
}

こんな感じになります。


で、ちょっとプログラムをかじった人だと、下キーを押したときの処理は、%演算子を使って書くと思います。

if( isKeyPush( KEY_DOWN ) ){
    cursor = ((cursor - min + 1) % num) + min;
}

これで下キーを押したときの処理は上手くいくのですが、これ、上キーを押したときの処理を、減算を使ってやろうとすると、余りの計算が上手くいかないのですね。
そうやって失敗した人は結構いるのでは(いないかも……)。


上キーを押したときの処理は、次のようにやればいいのです。

if( isKeyPush( KEY_UP ) ){
    cursor = ((cursor - min + num - 1) % num ) + min;
}

下キーの処理との違いは、+1がnum-1になっているところです。
num-1を足してnumで割った余りを求めることによって、デクリメントして最小値より小さくなったときに最大値にするという処理と同じになります。


自分はこれを見つけたとき、かなり感動したんですが、こんなの当たり前ですかそうですか(´・ェ・`) ショボン