ボタン同時押しの設計

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
FUNK
記事: 25
登録日時: 11年前

ボタン同時押しの設計

#1

投稿記事 by FUNK » 11年前

今現在製作しているゲームにボタンの同時押しを実装しているのですが、
現在の実装では同時押しの判定がかなりシビアだと感じています。
フレームレートは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:ボムを使う

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

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

以上、よろしくお願いします。
Boogaloo is funk feelin'.

だんごさん
記事: 273
登録日時: 12年前

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

#2

投稿記事 by だんごさん » 11年前

キーが押されたフレーム数をカウントし、一定まで行くと判定開始する仕様はどうでしょうか?

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

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

FUNK
記事: 25
登録日時: 11年前

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

#3

投稿記事 by FUNK » 11年前

返信ありがとうございます。

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

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

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 11年前

最低でも最初のキーは3フレームとか待つようにして判定すれば、他のモーションが出る心配は無いと思います。

本家さんの「格闘ゲームコマンド入力基本」も参考にしてださい。
「DXライブラリ置き場 サンプルプログラム」
http://homepage2.nifty.com/natupaji/DxL ... m.html#N18
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#5

投稿記事 by ISLe » 11年前

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

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

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

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

FUNK
記事: 25
登録日時: 11年前

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

#6

投稿記事 by FUNK » 11年前

返信ありがとうございます。

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

ご教授ありがとうございました。
Boogaloo is funk feelin'.

閉鎖

“C言語何でも質問掲示板” へ戻る