ドラクエのプレイ時間は150を超えました。まだまだ遊びます!

*
今回はアナログスティックの入力について少し話をしたいと思います。
就職作品などでコントローラーの入力を取ってきてゲームに使用したりすると思います。

最近だとXbox360のコントローラをPCに差せばすぐ使えるので、お手軽ですよね。
アナログスティックの値は、中心からの位置が返ってきます。

スティックを触っていない状態でも中心部分では小さな値が入ってしまいます。
これはハード的にどうしようもない部分なので、
中心から一定距離は反応させないようにする必要があります。

このときに、やってしまいがちな判定として、次のようなものがあります。
if( abs(x) < deadValue ) {こう記述してしまうと、中心部分はいいのですが、赤い部分の細かい値も消されてしまうため、黒い軸上へと補正されてしまいます。
x = 0;
}
if( abs(y) < deadValue ) {
y = 0;
}

これはもったいない!

というわけで、補正する場合は次のような式がいいですね。
if( (abs(x) < deadValue) && (abs(y) < deadValue) ) {こうすれば赤い部分のみ、値が0に補正されます。
x = 0;
y = 0;
}


もちろん、中心からの距離を求める方がより綺麗に円形で補正できますよ。

少し変わった方法として、距離をn乗させるという手法もあります。
中心からの最大距離を1として、その値をn乗すると次の図のような形になります。

青い線がアナログスティックから取得した値です。それをn乗した値が下の青以外の線です。
(左の灰色部分は、先ほどの灰色の円と同じく、0に補正する範囲です)
こうしておけば中心付近の値がほぼ0になりますので、0に補正する処理が不要となります。
中心でもすごく細かい値が入るので、何か細かい操作をさせたいときに有効です。
また、0に補正する処理が無くなるため、急に入力が入った感じなどを消すことが出来ます。
よりアナログ的な入力ができるわけです。

nの値をどの辺に落ち着けるかは、実際のゲームを触りつつ、調整していくのがいいと思います。
いかがでしたでしょうか。少しは役に立ちましたか?
少しの工夫でゲームの操作感が良くなったりすることは多いと思います。
広い視野でいろんな創意工夫ができるよう、がんばっていきたいと思います!

