DXライブラリでPS4のコントローラは使えますか?
調べたところps3は使えるそうなのですps4においては出てきませんでした。
if (Key[KEY_INPUT_RIGHT] == 1) if (Key[KEY_INPUT_LEFT] == 1) if (Key[KEY_INPUT_UP] == 1) if (Key[KEY_INPUT_DOWN] == 1)
や
ps特有の丸、×、四角、三角の関数はあるのでしょうか。
編集後
Pad = GetJoypadInputState(DX_INPUT_KEY_PAD1); //入力状態をPadに格納
if (Pad & PAD_INPUT_RIGHT && playerX < 2) {
playerMove = 1; playerX++; playerImage = playerGHandle[2]; nomove = 1;
}
のようにできたのですが、一マスずつ動きません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
一マスずつ動きません。
コレ↓と同じことをしなさい。
C++
1// キーの入力状態を更新する 2int gpUpdateKey() { 3 char tmpKey[256]; // 現在のキーの入力状態を格納する 4 GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る 5 for (int i = 0; i < 256; i++) { 6 if (tmpKey[i] != 0) { // i番のキーコードに対応するキーが押されていたら 7 Key[i]++; // 加算 8 } 9 else { // 押されていなければ 10 Key[i] = 0; // 0にする 11 } 12 } 13 return 0; 14}
投稿2019/12/05 11:33
総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/05 12:28
2019/12/05 13:04
2019/12/05 15:36
2019/12/05 18:17 編集
2019/12/05 22:13
2019/12/05 22:35 編集
2019/12/05 22:35
2019/12/05 22:55 編集
2019/12/05 23:08 編集
2019/12/05 23:11 編集
2019/12/05 23:37 編集
2019/12/06 01:24
2019/12/06 01:26
2019/12/06 02:47
2019/12/06 03:58
2019/12/06 05:38 編集
2019/12/06 04:42
2019/12/06 04:54
2019/12/06 12:26
2019/12/06 12:32 編集
2019/12/06 12:36 編集
2019/12/06 12:56
2019/12/06 13:15
2019/12/06 13:18
0
ベストアンサー
他回答のコメント欄内のコードに対する話なので,回答として書くのが適切かわかりませんが…
int InputType = 0;
GetJoypadInputState(InputType); //入力状態をPadに格納;
GetJoypadInputState()の使い方をググると,とりあえず以下のことがわかります.
- どのパッドの状態を取得したいのかを引数で指定する.引数に与えるべき値は,DX_INPUT_PAD1とかDX_INPUT_PAD2とかである.
- 入力状態はこの関数の戻り値として得られる
まず,1.について,引用したあなたのコードでは引数に0という値を与えていますが,その理由は何なのか説明できますか?
DX_INPUT_PAD1とかDX_INPUT_PAD2とかを指定せよという説明がリファレンスで成されているので,それらを与えておけば良いのではないでしょうか.
つぎに,2.について.
あなたはパッドの入力状態を得るためにこのGetJoypadInputState()なる関数を使っているのですから,この関数から返された情報に基づいて処理を行うべきでしょう.
情報は上記のように戻り値として得られる仕様だとされていますから,少なくとも戻り値を用いるコードを書くべきでしょう.
そういったことをきちんとリファレンスなりから読み解かなければ,いつまでたってもまともに動作するコードを実装することはできませんよ.
で,ボタンを押すと一気にたくさん動いてしまうことに関してですが,
まず,そうなる理由は大丈夫でしょうか?
「ボタンが押されていたら動く」という処理がループしているとき,
人間がボタンを押してから離すまでにかかる時間内に,この処理が複数回走るとそうなるわけですね.
ループは秒間30回とか60回とかの勢いで回っているのでしょうから,
人間の感覚ではボタンをちょいと押したつもりでも「高速でループしている処理側から見ると,ボタンは長いことずっと押され続けている」という状況になるわけです.
対処方法としては,
【「今現在のパッドの状態を調べてみたらボタンが押されているが,前回しらべたときには押されていなかった」場合に動く】とすれば良いでしょう.
つまり,少なくとも,
- 今回のパッド状態の調査結果
- 前回のパッド状態の調査結果
の2つの情報を(何かしらの方法で)管理して,ボタン押下の判断が必要な時には,管理されている情報を見て判断を行わねばならないということです.
このことを,ものすごく素直に実装すれば,例えば以下のような形の実装を行うでしょう.
//まず,変数として, //「前回」と「今回」のパッド状態調査結果(GetJoypadInputState()の戻り値)を覚えておく場所 //を(適切な場所に)用意する int PrevPadState = 0; //適切な初期値は0かなきっと int CurrPadState = 0; //適切な初期値は0かなきっと //現在のパッドの状態をGetJoypadInputState()を用いて調査し, //2つの変数{ PrevPadState ,CurrPadState }を更新する作業を担う関数. //この関数をメインループから毎回呼ぶ感じ. void UpdatePadState() { //「前回」情報を更新 PrevPadState = CurrPadState; //「今回」情報を更新 CurrPadState = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); //引数はこれで良いのかな? } //実際どんなコードなのかはわからんけど,メインループで毎度↑の関数UpdatePadState()を呼ぶ int main() { ... //初期処理 while( true ) //メインループのつもり { UpdatePadState(); //パッド状態の調査 ... //その他の処理 } ... //後処理 return 0; } // //以下はどこか(PrevPadStateとCurrPadStateの値を参照できる場所)での処理 // //パッドの「右」ボタンが「今」押されたかどうか判定するとき if( ( PrevPadState & PAD_INPUT_RIGHT ) == 0 //前回は押されていなくて && //且つ ( CurrPadState & PAD_INPUT_RIGHT ) != 0 //今回は押されている ) {//「右」は今押された //「右」が押されたときの処理 }
(もちろん,↑の「右」ボタンの判定処理を他のボタン群にもひたすら同じように書くのはだるいので,実際は関数化するなりなんなりしていくわけですが.)
投稿2019/12/06 02:13
総合スコア11985
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 13:30
2019/12/08 08:59
2019/12/09 01:22 編集
2019/12/09 12:40 編集
2019/12/10 01:24
2019/12/10 01:41
2019/12/10 01:50
2019/12/10 01:57
2019/12/10 02:20
2019/12/10 02:25
0
面白そうだったので PS3 コントローラー接続の確認を兼ねてテストプログラムを作ってみました。
どうしようか迷ったのですが解決したようなので、gpUpdateKey()方式で簡単に実装できることを証明(?)するために、ここに書いておきます。
c++
1#include <DxLib.h> 2 3int Pad[32]; 4 5int gpUpdatePad() 6{ 7 int padStat = GetJoypadInputState(DX_INPUT_KEY_PAD1); //入力状態を padStat に格納 8 for (int i = 0; i < 28; i++) { //ボタン28個分ループ 9 if (padStat & (1 << i)) { //ボタンiの入力フラグが立っていたら 10 Pad[i]++; //加算 11 } else { //入力がなければ 12 Pad[i] = 0; //0 にする 13 } 14 } 15 16 return 0; 17} 18 19int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) 20{ 21 ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定 22 23 int x = 320; 24 int y = 240; 25 const int PAD_DOWN = 0; 26 const int PAD_LEFT = 1; 27 const int PAD_RIGHT = 2; 28 const int PAD_UP = 3; 29 30 const int KEY_ESC = 12; 31 32 // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア ) 33 while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { 34 gpUpdatePad(); 35 if (Pad[PAD_LEFT]) { 36 if (x > 4) 37 x -= 4; 38 } 39 if (Pad[PAD_RIGHT]) { 40 if (x < 622) 41 x += 4; 42 } 43 if (Pad[PAD_UP]) { 44 if (y > 4) 45 y -= 4; 46 } 47 if (Pad[PAD_DOWN]) { 48 if (y < 464) 49 y += 4; 50 } 51 DrawFormatString(x, y, GetColor(255,255,0), "●"); 52 53 if (Pad[KEY_ESC]) break; 54 } 55 56 DxLib_End(); 57 return 0; 58}
コントローラーのステータスはビットデータなので、そこを理解していればキー入力からの変更は容易ですね。
ここを参考にするといいです。
投稿2019/12/06 13:03
総合スコア986
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 13:04 編集
2019/12/06 13:10
2019/12/06 13:18
2019/12/06 13:22
2019/12/06 13:32
2019/12/06 13:37 編集
2019/12/06 13:35 編集
2019/12/06 14:00
2019/12/06 14:10
2019/12/06 14:22
2019/12/06 15:33
2019/12/06 20:50
2019/12/06 23:24
2019/12/06 23:29
2019/12/07 00:37
2019/12/09 01:47
2019/12/09 03:51 編集
2019/12/09 04:15
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。