GetJoypadInputState関数の引数にDX_INPUT_PAD1を用いれば ジョイパッド1のどのボタンから入力されているかどうかを 判断する(識別する)ことができま~す

solarplexuss「ふ~ん♪ ふふ~ん♬」


ソーラー「GetJoypadInputState関数の引数にDX_INPUT_PAD1を用いれば


ジョイパッド1のどのボタンから入力されているかどうかを


判断する(識別する)ことができま~す」


solarplexuss「おおお・・・ わかったかも(*^。^*)」


マックス「ところでだな


DXライブラリ置き場リファレンスページの


GetJoypadInputState関数の説明では


GetJoypadInputState関数の取れる引数は

👇


引数 InputType : 入力状態を取得するパッドの識別子


      🐦DX_INPUT_KEY_PAD1  : キー入力とパッド1

        DX_INPUT_PAD1    : パッド1

        DX_INPUT_PAD2    : パッド2

        DX_INPUT_PAD3    : パッド3

        DX_INPUT_PAD4    : パッド4

      🐤DX_INPUT_KEY     : キー入力


👆

となっているが


      🐤DX_INPUT_KEY     : キー入力


ってどういうことなんだ?



GetJoypadInputState関数は


ジョイパッドのどのボタンから入力されているかどうかを


判断する(識別する)ことができるんだろう?


だが


GetJoypadInputState関数の取れる引数に



DX_INPUT_KEY     : キー入力


って


引数があるということは


もしや・・・


ジョイパッドのどのボタンから入力されているかどうかを


判断する(識別する)ことができる


GetJoypadInputState関数の引数に


DX_INPUT_KEY


を用いれば


キーボードのどのボタンから入力されているかどうかを


判断する(識別する)ことができるってことか?


GetJoypadInputState関数はジョイパッドに対応した関数なのに?」



ソーラー「そうなんです


そのとおり!


GetJoypadInputState関数の引数に🐤DX_INPUT_KEY🐤を用いれば


キーボードのどのボタンから入力されているかどうかを


判断する(識別する)ことができます



GetJoypadInputState関数の引数に🐬DX_INPUT_PAD1🐬を用いれば


ジョイパッド1のどのボタンから入力されているかどうかを


判断する(識別する)ことができます




そして


GetJoypadInputState関数の引数に


       💖DX_INPUT_KEY_PAD1💖


を用いれば


キーボードのどのボタンから入力されているかどうかを


判断する(識別する)ことができるだけでなく


             🌞🌞🌞同時に🌞🌞🌞


ジョイパッド1のどのボタンから入力されているかも


判断できるんです


DX_INPUT_KEY_PAD1



         😊KEYはキーボード😊


😊PAD1はジョイパッド1😊


を表しており


GetJoypadInputState関数の引数に


DX_INPUT_KEY_PAD1が用いられた


GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行された場合


キーボードからの入力

ジョイパッド1からの入力

両方の入力に応じた戻り値が


GetJoypadInputState(DX_INPUT_KEY_PAD1)


に返されることになります



つまり


GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されるまえに


キーボードから何かのボタンが入力されている状態で


GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


キーボードのその何かのボタンの入力に対応した数値が返されることになります


何もキーボードのボタンが押されていない場合は


戻り値として0が返されることになります



もしくは


GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されるまえに


ジョイパッド1から何かのボタンが入力されている状態で


GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


ジョイパッド1の何かのボタンの入力に対応した数値が返されることになります


何もジョイパッド1のボタンが押されていない場合は


戻り値として0が返されることになります」



solarplexuss「あ~😊 それ わかる わかる~(*´▽`*)


シューテイングゲームで遊んでいるとき


ジョイパッドから


自機の飛行機を


操作することもできれば


キーボードから


自機の飛行機を


操作することもできるよね」


マックス「そういや そうだ」


ソーラー「それでは


早速


GetJoypadInputState関数が用いられたプログラムを実行してみましょう」


そのプログラムはこちらです


👇


#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


int x = 0;


int y = 0;



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです


👇

https://youtu.be/UePaU-jOeKc




マックス「ううんん???????????????


な、なんていうか・・・これは・・・正しいプログラムなのか?」


solarplexuss「ええっとぉ?


このプログラム・・・


な、なんだかわかりそうでわかりにくい・・・


よくわからない・・・


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


まず


int key


の実行により


int型の変数keyが作製されるのはわかる



もし


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されるまえに


ジョイパッド1から何かのボタンが入力されている状態で


GetJoypadInputState(DX_INPUT_KEY_PAD1)


が実行されると


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


ジョイパッド1の何かのボタンに対応した数値が返されることになるよね


だから


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


の実行により


int型の変数keyには


GetJoypadInputState(DX_INPUT_KEY_PAD1)に返された戻り値が


代入されることになるよね


で・・・


よくわからないのが


続くこの命令文だよね

👇


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


👆

この

if()文の()内の


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


ってなに?」


マックス「ううう」


solarplexuss「マックスがうめいている・・・」


マックス「うまいなあ この饅頭」


solarplexuss「!


何食べてるの?」



ソーラー「みなさ~ん


👇

key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT

👆


これって何だと思います?」


マックス「う~ん


なんか分かりにくいなあ


とくにこの



ってなんだ?」


solarplexuss「まさか


key & PAD_INPUT_UP



何かの1つの単語なのかな」


ぶーにゃん「にゃんこも なんのことか わかんにゃ~い」


マックス「そうだろう そうだろう


突然


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


がでてきてもなあ


・・・


だが


大体の意味はわかる


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行される前に


その1


ジョイパッド1の十字キー(キーボード)の↑ボタンが押されていたら


if (key & PAD_INPUT_UP) y = y - 4;


の()内の


key & PAD_INPUT_UPの値は1となり


if(1)が成立するので


y = y - 4;


が実行され


飛行機は今いる位置から4ドット上に移動することになるんじゃないか?


(ご注意 yの値が小さくなればなるほど飛行機は画面の上の方に表示されることになります)



その2


ジョイパッドの十字キー(キーボード)の↓ボタンが押されていたら


if (key & PAD_INPUT_DOWN) y = y + 4;


の()内の


key & PAD_INPUT_DOWNの値は1となり


if(1)が成立するので


y = y + 4;


が実行され


飛行機は今いる位置から4ドット下に移動することになるんだろう


(ご注意 yの値が大きくなればなるほど飛行機は画面の下のほうに表示されることになります)


その3


ジョイパッドの十字キー(キーボード)の←ボタンが押されていたら


if (key & PAD_INPUT_LEFT) x = x - 4;


の()内の


key & PAD_INPUT_LEFTの値は1となり


if(1)が成立するので


x = x - 4;


が実行され


飛行機は今いる位置から4ドット左に移動することになるんじゃないか?


その4


ジョイパッドの十字キー(キーボード)の右ボタンが押されていたら


if (key & PAD_INPUT_RIGHT) x = x + 4;


の()内の


key & PAD_INPUT_RIGHTの値は1となり


if(1)が成立するので


x = x + 4;


が実行され


飛行機は今いる位置から4ドット右に移動することになるんだろう」


solarplexuss「・・・なんと・・・


そういうことか・・・


ちょっと見ただけで もう そこまでわかったのお


すごいなあ よくわかったね


確かに


この命令文

👇


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;

👆


たぶんそういう仕組みの命令文なんだろうね


だけど


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


何なのかあ


よくわからないよね


いったい


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT



なんなんだろう?」


ソーラー「まず1つ目のポイントは


if()の()内で


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


が記述されているところかな



if()の()内で


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


が記述されているので


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


は条件式なんだね


だから


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


の取る値によって


if文が実行されるかされないかが決まってくるね


具体的には


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT


の取る値によって


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;



y = y - 4;

y = y + 4;

x = x - 4;

x = x + 4;


が実行されるかどうかが決まってくるね




そして


もう1つのポイントは


key & PAD_INPUT_UP

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT



用いられている&なんだよ」


solarplexuss「&???に注目するの?


key & PAD_INPUT_UP


って


1つの単語なんじゃないの?」


ソーラー「実は


key & PAD_INPUT_UP



keyとPAD_INPUT_UP



オペランド(被演算子)





オペレータ(演算子)なんです」


マックス「ど~いうこと 何の説明だ わから~ん」


ソーラー「ははっ


実は


key & PAD_INPUT_UP



1+2


と構造は同じです


key は1

&は+

PAD_INPUT_UPは2


に相当するんです」


solarplexuss「ほええ?」


ソーラー「&は


オペレータ(演算子)



AND演算を行うために用いられる演算子なんです


つまり


key & PAD_INPUT_UP



AND演算という計算が行われているんです」


solarplexuss「AND演算?」


ソーラー「


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されるまえに


🚄🚄🚄ジョイパッド1からの何かのボタンが入力されていると🚄🚄🚄


GetJoypadInputState(DX_INPUT_KEY_PAD1)


の実行の際


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


ジョイパッド1の何かのボタンに対応した数値が返されることになるよね


だから


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


の実行により


int型の変数keyにはGetJoypadInputState(DX_INPUT_KEY_PAD1)に返された戻り値(整数値)


代入されることになります


そう


keyには整数値が代入されているんです


そして


次は


key & PAD_INPUT_UP

PAD_INPUT_UP

に注目だね



PAD_INPUT_UP

には


もとから


(ジョイパッドの十字キー(キーボード)の右ボタンに対応する)


ある整数値が割り当てられています(代入されています)



つまり


key & PAD_INPUT_UP



整数値&整数値


をあらわしているんです


整数値&整数値



&演算子によって


整数値同士の


AND演算(計算)が行われているんです」



マックス「AND演算(計算)か・・・


いったいどういう仕組みなんだ」






  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る