ページ 11

ボタン同時押しの設計

Posted: 2013年2月03日(日) 23:58
by FUNK
今現在製作しているゲームにボタンの同時押しを実装しているのですが、
現在の実装では同時押しの判定がかなりシビアだと感じています。
フレームレートは60FPSなので、1/60秒のズレも無く同時押しをしないと、
同時押しの判定が出来ない作りになっているからだと思います。

例えば、

・Aキーを押下 → モーション1を行う
・Sキーを押下 → モーション2を行う
・A、Sキーを同時押下 → モーション3を行う

というアルゴリズムを擬似言語で表すと以下の様に書いております。

コード:

if( モーションしていない )
{
	if( Aキーが押されている )
	{
		if( Sキーが押されている )
			モーション3を行う
		else
			モーション1を行う
	}
	else if( Sキーが押されている )
	{
		モーション2を行う
	}
}
そこで、他の60FPSのゲームをプレイしてみると、
同時押しの判定のシビアさが低い気がします。
なんとなくですが、同時押しに3~5フレームくらいのずれがあっても同時押しと判定している様な感じです。

つまり、上記の例で言いますと、

【1フレーム目】Aキーが押されたのでモーション1を行う
【3フレーム目】Sキーが押されたので、モーション1の途中だがモーション3に切り替える

という処理を行っている気がしているのです。
しかし、この様な処理を行っているのならば目的のモーションの前に一瞬違うモーションを行うことに違和感を感じます。
例えばシューティングゲームであれば、

モーション1:弾を発射する
モーション3:ボムを使う

だと、ボムを使いたい時に、「弾が一発発射される → ボムを使う」という意図しないことが起きるのではないかという懸念があるからです。

もし、同時押しのシビアさを軽減する為の設計として、
上記の様ではなく「わずかに同時押しがずれたとしても、同時押しのモーションのみを出せる」方法があるのでしょうか。

以上、よろしくお願いします。

Re: ボタン同時押しの設計

Posted: 2013年2月04日(月) 00:14
by だんごさん
キーが押されたフレーム数をカウントし、一定まで行くと判定開始する仕様はどうでしょうか?

つまり、Aが押された時にカウント開始し、10フレームまで行ったらボムを使うかなんかするということです。その10フレームの間にSが押されたら同時押し判定にすることもできます。
ほんの数秒にも満たない短い時間ですから、少々遅れてモーションが始まっても気にならないと思います。その分、モーションが遅れて見えないギリギリのカウント数を見つける必要と、同時押しができる範囲を見つけないといけませんけどね…

最善の方法か分かりませんが役に立てれば幸いです。

Re: ボタン同時押しの設計

Posted: 2013年2月04日(月) 13:29
by FUNK
返信ありがとうございます。

やはりその様な方法しかないのでしょうか?
それだと最初の方で言っていた、

>モーション1:弾を発射する
>モーション3:ボムを使う

>だと、ボムを使いたい時に、「弾が一発発射される → ボムを使う」という意図しないことが起きるのではないかという懸念があるからです。

というような事になってしまうので、もっといい方法があるのかなと思っていました。

他のシビアではない様に感じるゲームでは、同時押しをわざとずらして押しても、一瞬他のモーションが出ているように見えないのですが、
それはただ単に一瞬なので、他のモーションが目に入らないだけなのでしょうか?

Re: ボタン同時押しの設計

Posted: 2013年2月04日(月) 13:38
by softya(ソフト屋)
最低でも最初のキーは3フレームとか待つようにして判定すれば、他のモーションが出る心配は無いと思います。

本家さんの「格闘ゲームコマンド入力基本」も参考にしてださい。
「DXライブラリ置き場 サンプルプログラム」
http://homepage2.nifty.com/natupaji/DxL ... m.html#N18

Re: ボタン同時押しの設計

Posted: 2013年2月04日(月) 16:40
by ISLe
FUNK さんが書きました:【1フレーム目】Aキーが押されたのでモーション1を行う
【3フレーム目】Sキーが押されたので、モーション1の途中だがモーション3に切り替える

という処理を行っている気がしているのです。
しかし、この様な処理を行っているのならば目的のモーションの前に一瞬違うモーションを行うことに違和感を感じます。
プログラムでどうにかするのであれば、
【1フレーム目】A,Sキーのいずれかあるいは両方が押されたらカウント開始
【3フレーム目】Aキーのみが押されていたらモーション1を開始。Sキーのみ押されていたらモーション2を開始。A,Sキー両方押されていたらモーション3を開始。
とすれば良いのではないでしょうか。

モーションのほうで出始めを揃えれば、FUNKさんのおっしゃる方法で違和感も遅延もなくせます。

シューティングなら押したと同時に弾が出ないと困るでしょう。
出ても気にならないでしょうけど。

Re: ボタン同時押しの設計

Posted: 2013年2月05日(火) 14:09
by FUNK
返信ありがとうございます。

教えてもらった通り、何フレームか待って判断するようにしたいと思います。
どれくらい待つかは調整&プレイ確認を繰り返して、違和感が無いフレームを見極めたいと思います。

ご教授ありがとうございました。