Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.1 ) |
- 名前:名無し 日時:2020/10/14 00:07
普通のゲームパッドならすべてのボタンの同時押しくらいはハードウェア的に対応してるはずです。
(キーボードだと同時押しする数に上限あったりしますが…。)
キー入力はビットのフラグを立てた戻り値を使うのが一般的なんで、ビット演算を覚えると比較的簡単に取得できます。
ビット演算について→ttp://www9.plala.or.jp/sgwr-t/c/sec14.html
同時押し検知サンプル
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモードに変更
SetGraphMode(1280, 720, 32);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1; // エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK);// 描画先画面を裏画面にセット
int Key;
// ループ
while (ProcessMessage()==0)
{
ClearDrawScreen();// 画面を初期化する
Key = GetJoypadInputState(DX_INPUT_KEY_PAD1);// キー入力取得
DrawFormatString(0, 0, 0xfffffff, "GetJoypadInputStateの戻り値=%d", Key);//GetJoypadInputStateの戻り値
//特定のキーだけ押されているか調べる場合(他のキーが押されてたら検知しない)
if (Key == (PAD_INPUT_LEFT | PAD_INPUT_2 | PAD_INPUT_6)) {
DrawString(0, 16, "[PAD_INPUT_LEFT]と[PAD_INPUT_2]と[PAD_INPUT_6]だけが同時に押されました。(他のキーが押されていない)", 0xffffff);
}
//特定のキーが押されているか調べる場合(他のキーが押されていても検知する)
if ((Key & (PAD_INPUT_LEFT | PAD_INPUT_2 | PAD_INPUT_6)) == (PAD_INPUT_LEFT | PAD_INPUT_2 | PAD_INPUT_6)) {
DrawString(0, 32, "[PAD_INPUT_LEFT]と[PAD_INPUT_2]と[PAD_INPUT_6]が同時に押されました。(他のキーが押されている可能性もある)", 0xffffff);
}
ScreenFlip();// 裏画面の内容を表画面に反映させる
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.2 ) |
- 名前:クロエ 日時:2020/10/14 10:40
「言われた」というのは誰に言われたのですか?
>やはり、数フレームをずらしながら同時ではなく、素早く順番に3つのボタンを押すしかないのでしょうか。
こう思うのなら、なぜそれをしなかったのですか?
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.3 ) |
- 名前:マーク42 日時:2020/10/20 19:42
どうもありがとうございます。
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.4 ) |
- 名前:マーク42 日時:2020/10/24 01:32
名無し様、ちなみにビット演算が同時押しを再現するコツとのことですが、
そのビット演算をするように組んでいるプログラムの部分はどこでしょうか?
//特定のキーだけ押されているか調べる場合(他のキーが押されてたら検知しない)
if (Key == (PAD_INPUT_LEFT | PAD_INPUT_2 | PAD_INPUT_6)) {
DrawString(0, 16, "[PAD_INPUT_LEFT]と[PAD_INPUT_2]と[PAD_INPUT_6]だけが同時に押されました。(他のキーが押されていない)", 0xffffff);
}
の部分でしょうか?
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.5 ) |
- 名前:クロエ 日時:2020/10/27 10:45
コツとはどこにも書かれていませんよね。
どちらが簡単かは人によります。
「ビット演算について」を読んで分からなかったのなら返って遠回りです。
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.6 ) |
- 名前:usao 日時:2020/10/27 11:07
余計なお世話かもしれませんが,
現時点では「(ご自身の環境において)同時入力が可能なのか否か?」という確認を取りたいのでしょうから,
まずはあなたにとって最もシンプルで疑問の余地の無いコードで試すべきではありませんか?
どんなに{洒落た,かっこいい,文字数の少ない,何かしら効率のよい,etc}な書き方をしたところで
ご自身の環境で動作しないならば意味がないわけですから,
現段階で,あなたが少しでも不安を覚えるような記述テクニックに振り回される必要はないでしょう.
GetJoypadInputState とかいう関数のリファレンスを見るに
> 入力状態は int型 データとして返り、 次に示すパッドの入力マスクを戻り値とAND演算をして結果が0でなければそのボタンが押されている事を示します。
とだけ書かれているようですから,
このリファレンスを読んだ限りにおいては
int PadState = GetJoypadInputState( DX_INPUT_PAD1 );
とかして取得した結果を用いてボタンが押されているのかどうかを調べる方法としては,
if( (PadState & PAD_INPUT_1) != 0 ){/*ボタン1が押されている*/}
と書くのが最も素直かと思います.
であれば同時押しの判定は
if( ((PadState & PAD_INPUT_1) != 0) && ((PadState & PAD_INPUT_2) != 0) ){/*ボタン1とボタン2が押されている*/}
と書くのが最も自然でしょう.
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.7 ) |
- 名前:名無し 日時:2020/10/27 19:46
>>ちなみにビット演算が同時押しを再現するコツとのことですが、
「同時押しを再現するコツ」ってのが意味わかりません。
そんな事書いてないですよね?
何か間違った認識してると思いますよ。
GetJoypadInputState関数の戻り値から押されたボタンを調べるのに、ビット演算を使うのが普通だって事です。
複数押しもビット演算使った方が処理が楽になるってだけです。
>>そのビット演算をするように組んでいるプログラムの部分はどこでしょうか?
if文の中にある 「|」や「&」といった記号がビット演算子です。
ビット演算子には他にも「^」や「~」等があります。
それがわからないという事はリンク先を読んで理解できなかったという事ですか?
それともリンク先を読んですらいないんですかね?
まあ理解できなかったら、一応別の方法もあります。
代わりにGetJoypadInputState関数は使えばビット演算無しでできます。
但しその場合、DINPUT_JOYSTATE構造体を使う事になります。
ビット演算使わずDINPUT_JOYSTATE構造体を使う方がコード複雑になりますし、
キーボードとゲームパットの入力が一つの処理で出来なくなります。
とりあえず、ビット演算かDINPUT_JOYSTATE構造体のどちらか理解しないとゲームパッドの複雑な入力判定は難しいです。
押してるの調べるだけならusaoさんのやり方で大丈夫です。(まあ、これで使ってる「&」もビット演算なんですが…)
ただ、usaoさんのやり方で他のキーが押されていないのかを調べるのは、他のボタンを一個ずつ調べる事になるので結構面倒になります。
//キー入力判定にビット演算を使わないやり方(GetJoypadDirectInputState関数を使ったサンプル)
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモードに変更
SetGraphMode(1280, 720, 32);
if (DxLib_Init() == -1) // DXライブラリ初期化処理
{
return -1;// エラーが起きたら直ちに終了
}
SetDrawScreen(DX_SCREEN_BACK);// 描画先画面を裏画面にセット
DINPUT_JOYSTATE dj;//DINPUT_JOYSTATE構造体宣言
// ループ
while (!ProcessMessage())
{
ClearDrawScreen();// 画面を初期化する
GetJoypadDirectInputState(DX_INPUT_KEY_PAD1,&dj);;// PAD1入力取得
//キー入力状態描画(ここはキー入力状態を表示してるだけなんで本題とは関係ないです)
DrawFormatString(0, 0, 0xfffffff, "方向キーX=%5d,Y=%5d(アナログ入力時のPOVキーは未対応)", dj.X, dj.Y);
for (int i = 0; i < 32; i++) {
DrawFormatString((i % 8) * 160, i / 8 * 16 + 16, 0xffffff, "ボタン%2d[%3s]", i + 1, (dj.Buttons[i]) ? "ON" : "OFF");
}
//特定のキーが押されているか調べる(他のキーが押されていても検知する)
if ((dj.X < -256) && ((dj.Buttons[1] + dj.Buttons[5]) == 256)) {
DrawString(0, 80, "PAD1の左とボタン2とボタン6が同時に押されました。(他のキーが押されている可能性もある)", 0xffffff);
//特定のキー以外が押されていないか調べる
int BAdd = 0;
for (int i = 0; i<32;i++) {
BAdd += dj.Buttons[i];
}
if ((dj.Y > -256) && (dj.Y < 256) && (BAdd == 256)) {
DrawString(0, 96, "PAD1の左とボタン2とボタン6だけが同時に押されました。(他のキーが押されていない)", 0xffffff);
}
}
ScreenFlip();// 裏画面の内容を表画面に反映させる
}
DxLib_End(); // DXライブラリ使用の終了処理
return 0; // ソフトの終了
}
|
Re: DXライブラリにおいて、同時押し入力で必殺技を作りたいです。 ( No.8 ) |
- 名前:usao 日時:2020/10/27 20:49
No4の雰囲気が既に「同時押しを判定するためにはその提示されたコードのような書き方が必須」的な誤解を生じつつあるようにも見え,
この流れだと,
ビットマスクに関しての話が一通り理解されない限り,
「3つ同時押しが本当にできるのかできねぇのか」の確認に進まなさそう(※)なので釘を刺してみた.
「とりあえず同時押しができることは確認できましたけど,
提示いただいたコードの書き方は……」
とかいう形に話が進んでいるならばよいが,この人の場合,
「とりあえず同時押しができることは確認できましたけど」の部分が未来永劫抜け落ちたままになり得そうなので.
不要ならば単に無視されたい.
(※):まぁ「普通なら」そういう順序になったところで何も問題ないのだろうけど.
|