PAD_INPUT_DOWN,PAD_INPUT_LEFT,PAD_INPUT_RIGHT,PAD_INPUT_UPに なぜ 2の倍数の 1,2,4,8 が 設定されているのでしょうか?

つづきです


solarplexuss「だから


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8



には


異なる


値が設定されているんだね」


ソーラー「そのとおり


そして


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


なぜ


1

2

4

8

16

32

64

128

256

512

1024

2048



設定されているのか


の理由が


もう1つ


あるんだよ


だって


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


という2の倍数の数値を割り当てなくても


単純に


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12



割り当てたらいいと思わない?


なんで


DXライブラリの作者は


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


を割り当てたのかな?」



solarplexuss「ほんとうだね」



マックス「ふ~む


もし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP



1

2

3

4

の値が割り当てられているなら


次のプログラムは

👇


#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, 450, GetColor(0, 255, 255), TRUE);


int key = GetJoypadInputState(DX_INPUT_KEY);



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) y = y - 4;



DrawGraph(x, y, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



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


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

}



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

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

👇

https://www.youtube.com/watch?v=pg0Vfoivs0E


👆


また違う実行結果になるんじゃないか?


もし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP



1

2

3

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) y = y - 4;



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

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

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

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


となるだろう


となると


十字キーの↓ボタンを押すとGetJoypadInputState(DX_INPUT_KEY)

には戻り値として1が返り


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには1が代入されることになったとき


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

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

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

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



if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;


となり


&演算 (1 & 1)

00000000000000000000000000000001

00000000000000000000000000000001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり



&演算 (1 & 2)

00000000000000000000000000000001

00000000000000000000000000000010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 3)

00000000000000000000000000000001

00000000000000000000000000000101

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり


&演算 (1 & 4)

00000000000000000000000000000001

00000000000000000000000000000100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になるので



if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;



if (1) y = y + 4;

if (0) x = x - 4;

if (1) x = x + 4;

if (0) y = y - 4;


となるので


y = y + 4;

x = x + 4;


の2つの命令文が


実行されることになる


y = y + 4;


が実行されると


飛行機の位置は4ドット下に移動し


さらに


x = x + 4;


が実行されるので


飛行機の位置は4ドット右に移動することになる


結局


飛行機は右斜め下に移動することになる


十字キーの↓ボタンを押したのに


飛行機は右斜め下に移動することになるわけだ」



solarplexuss「あれ? なんか おかしい結果になったね」



マックス「おおっ 興にのってきた🐹


ならば


もし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12


が設定されている状態で


次のようなプログラムが実行されたらどうなるんだ

👇


#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, 450, GetColor(0, 255, 255), TRUE);


int key = GetJoypadInputState(DX_INPUT_KEY);



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



DrawGraph(x, y, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();



};



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


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

}


マックス「もし



十字キーの↓ボタンを押すとGetJoypadInputState(DX_INPUT_KEY)

には戻り値として1が返り


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには1が代入されることになったとき


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12


が設定されている状態では


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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 6) TYPE2型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 8) TYPE4型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 10) TYPE6型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;

if (1 & 12) TYPE8型の弾を発射する命令文;



となる


if (1 & 1)

if (1 & 2)

if (1 & 3)

if (1 & 4)

if (1 & 5)

if (1 & 6)

if (1 & 7)

if (1 & 8)

if (1 & 9)

if (1 & 10)

if (1 & 11)

if (1 & 12)


1

2

3

4

5

6

7

8

9

10

11

12


は2進数で


00000000000000000000000000000001

00000000000000000000000000000010

00000000000000000000000000000011

00000000000000000000000000000100

00000000000000000000000000000101

00000000000000000000000000000110

00000000000000000000000000000111

00000000000000000000000000001000

00000000000000000000000000001001

00000000000000000000000000001010

00000000000000000000000000001011

00000000000000000000000000001100


だろう


なので


&演算 (1 & 1)

00000000000000000000000000000001

00000000000000000000000000000001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり



&演算 (1 & 2)

00000000000000000000000000000001

00000000000000000000000000000010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 3)

00000000000000000000000000000001

00000000000000000000000000000101

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり


&演算 (1 & 4)

00000000000000000000000000000001

00000000000000000000000000000100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 5)

00000000000000000000000000000001

00000000000000000000000000000101

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000101

より

1になり



&演算 (1 & 6)

00000000000000000000000000000001

00000000000000000000000000000110

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 7)

00000000000000000000000000000001

00000000000000000000000000000111

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり


&演算 (1 & 8)

00000000000000000000000000000001

00000000000000000000000000001000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 9)

00000000000000000000000000000001

00000000000000000000000000001001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり



&演算 (1 & 10)

00000000000000000000000000000001

00000000000000000000000000001010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 11)

00000000000000000000000000000001

00000000000000000000000000001011

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり


&演算 (1 & 12)

00000000000000000000000000000001

00000000000000000000000000001100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり



if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 6) TYPE2型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 8) TYPE4型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 10) TYPE6型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;

if (1 & 12) TYPE8型の弾を発射する命令文;




if (1) y = y + 4;

if (0) x = x - 4;

if (1) x = x + 4;

if (0) y = y - 4;

if (1) TYPE1型の弾を発射する命令文;

if (0) TYPE2型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;

if (0) TYPE8型の弾を発射する命令文;


となるので


if (1) y = y + 4;

if (1) x = x + 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;



y = y + 4;

x = x + 4;

TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;


の6つの命令文が


実行されることになる


solarplezuss「ええっと?」


マックス「もう一回繰り返すと


if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 6) TYPE2型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 8) TYPE4型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 10) TYPE6型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;

if (1 & 12) TYPE8型の弾を発射する命令文;


if (1 & 1)

if (1 & 2)

if (1 & 3)

if (1 & 4)

if (1 & 5)

if (1 & 6)

if (1 & 7)

if (1 & 8)

if (1 & 9)

if (1 & 10)

if (1 & 11)

if (1 & 12)

1

2

3

4

5

6

7

8

9

10

11

12


は2進数で


00000000000000000000000000000001👈1

00000000000000000000000000000010👈2

00000000000000000000000000000011👈3

00000000000000000000000000000100👈4

00000000000000000000000000000101👈5

00000000000000000000000000000110👈6

00000000000000000000000000000111👈7

00000000000000000000000000001000👈8

00000000000000000000000000001001👈9

00000000000000000000000000001010👈10

00000000000000000000000000001011👈11

00000000000000000000000000001100👈12


だろう



十字キーの↓ボタンを押すとGetJoypadInputState(DX_INPUT_KEY)

には戻り値として1が返り


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには戻り値1が代入されることになったとき


keyに代入された1



2進数であらわしたとき1の位が1となっている


1💖(00000000000000000000000000000001💖)


3💖(00000000000000000000000000000011💖)


5💖(00000000000000000000000000000101💖)


7💖(00000000000000000000000000000111💖)


9💖(00000000000000000000000000001001💖)


11💖(00000000000000000000000000001011💖)


の&演算


if (1 & 1)

if (1 & 3)

if (1 & 5)

if (1 & 7)

if (1 & 9)

if (1 & 11)



if (1)

if (1)

if (1)

if (1)

if (1)

if (1)


となるので



if (1 & 1) y = y + 4;

if (1 & 3) x = x + 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;



if (1) y = y + 4;

if (1) x = x + 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;


となり


y = y + 4;

x = x + 4;

TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;



全部実行されることになるわけだ


むうう


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12


を設定するのは


DXライブラリの作者もヤバいと思うわけだ




結局


if (1 & 1) y = y + 4;

if (1 & 3) x = x + 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;



if (1) y = y + 4;

if (1) x = x + 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;


となるので


y = y + 4;

x = x + 4;

TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;


が実行されることになる




y = y + 4;


が実行されると

飛行機の位置は4ドット下に移動し


さらに


x = x + 4;


が実行されるので


飛行機の位置は4ドット右に移動することになる


つまり


飛行機は右斜め下に移動することになる


ついでに


TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;


も実行されるので


TYPE1型の弾

TYPE3型の弾

TYPE5型の弾

TYPE7型の弾


も発射される



つまり



十字キーの↓ボタンを押しただけで


飛行機は右斜め下に移動し


さらに


TYPE1型の弾

TYPE3型の弾

TYPE5型の弾

TYPE7型の弾


も発射されるわけだ・・・



って


なんかすごくないか?


十字キーの↓ボタンを押しただけで、


飛行機は右斜め下に移動し


さらに


TYPE1型の弾

TYPE3型の弾

TYPE5型の弾

TYPE7型の弾


も発射されるんだぞ?」


solarplexuss「もし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12



設定されていたなら



十字キーの↓ボタンを押しているだけなのに


なぜか


飛行機が右斜め下に移動し


4種類の弾を発射することになるなんて・・・


ス・テ・キ・・・」



マックス「


まあ


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12


が設定されているのが明らかにまずいな


公式な設定である


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048



設定されていたなら


そんなことは起こらないんだろう



公式通り


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048



設定されている状態で


今のプログラム

👇


#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, 450, GetColor(0, 255, 255), TRUE);


int key = GetJoypadInputState(DX_INPUT_KEY);



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



DrawGraph(x, y, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


}


};



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


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

}




👆

が実行されたらどうなるかをかんがえてみるか?」



solarplexuss「プログラムを実行したら結果がすぐわかるような・・・」




マックス「奥ゆかしさがたりないな


ここは暇だから考察してみるんだ!」


solarplexuss「暇なの!?」



マックス「


もし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


が設定されている状態で


十字キーの↓ボタンを押すとGetJoypadInputState(DX_INPUT_KEY)

には戻り値として1が返り


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには1が代入されることになったとき


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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 4) x = x + 4;

if (1 & 8) y = y - 4;

if (1 & 16) TYPE1型の弾を発射する命令文;

if (1 & 32) TYPE2型の弾を発射する命令文;

if (1 & 64) TYPE3型の弾を発射する命令文;

if (1 & 128) TYPE4型の弾を発射する命令文;

if (1 & 256) TYPE5型の弾を発射する命令文;

if (1 & 512) TYPE6型の弾を発射する命令文;

if (1 & 1024) TYPE7型の弾を発射する命令文;

if (1 & 2048) TYPE8型の弾を発射する命令文;



となるだろう


if (1 & 1)

if (1 & 2)

if (1 & 4)

if (1 & 8)

if (1 & 16)

if (1 & 32)

if (1 & 64)

if (1 & 128)

if (1 & 256)

if (1 & 512)

if (1 & 1024)

if (1 & 2048)



どうなるかだよなあ



1

2

4

8

16

32

64

128

256

512

1024

2048


は2進数で


00000000000000000000000000000001

00000000000000000000000000000010

00000000000000000000000000000100

00000000000000000000000000001000

00000000000000000000000000010000

00000000000000000000000000100000

00000000000000000000000001000000

00000000000000000000000010000000

00000000000000000000000100000000

00000000000000000000001000000000

00000000000000000000010000000000

00000000000000000000100000000000


だろう




&演算 (1 & 1)

00000000000000000000000000000001

00000000000000000000000000000001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

1になり



&演算 (1 & 2)

00000000000000000000000000000001

00000000000000000000000000000010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 4)

00000000000000000000000000000001

00000000000000000000000000000100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000001

より

0になり


&演算 (1 & 8)

00000000000000000000000000000001

00000000000000000000000000001000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 16)

00000000000000000000000000000001

00000000000000000000000000010000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000010000

より

0になり



&演算 (1 & 32)

00000000000000000000000000000001

00000000000000000000000000100000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 64)

00000000000000000000000000000001

00000000000000000000000001000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 128)

00000000000000000000000000000001

00000000000000000000000010000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 256)

00000000000000000000000000000001

00000000000000000000000100000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり



&演算 (1 & 512)

00000000000000000000000000000001

00000000000000000000001000000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 1024)

00000000000000000000000000000001

00000000000000000000010000000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


&演算 (1 & 2048)

00000000000000000000000000000001

00000000000000000000100000000000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になるので


if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 4) x = x + 4;

if (1 & 8) y = y - 4;

if (1 & 16) TYPE1型の弾を発射する命令文;

if (1 & 32) TYPE2型の弾を発射する命令文;

if (1 & 64) TYPE3型の弾を発射する命令文;

if (1 & 128) TYPE4型の弾を発射する命令文;

if (1 & 256) TYPE5型の弾を発射する命令文;

if (1 & 512) TYPE6型の弾を発射する命令文;

if (1 & 1024) TYPE7型の弾を発射する命令文;

if (1 & 2048) TYPE8型の弾を発射する命令文;



if (1) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (0) y = y - 4;

if (0) TYPE1型の弾を発射する命令文;

if (0) TYPE2型の弾を発射する命令文;

if (0) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE7型の弾を発射する命令文;

if (0) TYPE8型の弾を発射する命令文;


となるので


if (1) y = y + 4;


y = y + 4;


だけが実行される


y = y + 4;


が実行されると


飛行機の位置は4ドット下に移動することになる



つまり


十字キーの↓ボタンを押したら


ちゃんと


飛行機は下に移動するわけだ


ついでに(笑)なぜか


TYPE1型の弾

TYPE3型の弾

TYPE5型の弾

TYPE7型の弾


が発射されるなんていう


不手際がおこることもないってわけだ



って


これが普通だろう


ようは


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


つまり


00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000100👈PAD_INPUT_RIGHT

00000000000000000000000000001000👈PAD_INPUT_UP

00000000000000000000000000010000👈PAD_INPUT_1

00000000000000000000000000100000👈PAD_INPUT_2

00000000000000000000000001000000👈PAD_INPUT_3

00000000000000000000000010000000👈PAD_INPUT_4

00000000000000000000000100000000👈PAD_INPUT_5

00000000000000000000001000000000👈PAD_INPUT_6

00000000000000000000010000000000👈PAD_INPUT_7

00000000000000000000100000000000👈PAD_INPUT_8


のように


          💖2進数のどっかの位に💖


        💖他の2進数と被らないように💖


      💖1つだけ1がはいっているようにすれば💖


いいんだろう


solarplexuss「微妙にわかりませ~ん」



マックス「



PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


つまり


00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000100👈PAD_INPUT_RIGHT

00000000000000000000000000001000👈PAD_INPUT_UP

00000000000000000000000000010000👈PAD_INPUT_1

00000000000000000000000000100000👈PAD_INPUT_2

00000000000000000000000001000000👈PAD_INPUT_3

00000000000000000000000010000000👈PAD_INPUT_4

00000000000000000000000100000000👈PAD_INPUT_5

00000000000000000000001000000000👈PAD_INPUT_6

00000000000000000000010000000000👈PAD_INPUT_7

00000000000000000000100000000000👈PAD_INPUT_8


のように


          💖2進数のどっかの位に💖


        💖他の2進数と被らないように💖


      💖1つだけ1がはいっているようにすれば💖




例えば


         十字キーの↑キーをおして


keyに戻り値として8が返ったとき


keyに代入された8と 8をあらわすPAD_INPUT_UPの&演算


key & PAD_INPUT_UPだけが


8となるので


key & PAD_INPUT_UP以外の&演算

👇

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT

key & PAD_INPUT_1

key & PAD_INPUT_2

key & PAD_INPUT_3

key & PAD_INPUT_4

key & PAD_INPUT_5

key & PAD_INPUT_6

key & PAD_INPUT_7

key & PAD_INPUT_8

すべて0になります



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (8) y = y - 4;

if (0) TYPE1型の弾を発射する命令文;

if (0) TYPE2型の弾を発射する命令文;

if (0) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE7型の弾を発射する命令文;

if (0) TYPE8型の弾を発射する命令文;


となり


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


if (8) y = y - 4;



if (1) y = y - 4;


となり


y = y - 4;


だけが


実行されるわけだ



だから


         十字キーの↑キーをおしたとき


飛行機は上に4ドット移動する


他に弾が発射されるなんてことはないわけだ





Wボタンをおして


keyに戻り値として2048が返ったときは


keyに代入された2048

2048をあらわすPAD_INPUT_8の


&演算


key & PAD_INPUT_8


だけが


2048の値を持つので


key & PAD_INPUT_8以外の&演算

👇

key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT

key & PAD_INPUT_UP

key & PAD_INPUT_1

key & PAD_INPUT_2

key & PAD_INPUT_3

key & PAD_INPUT_4

key & PAD_INPUT_5

key & PAD_INPUT_6

key & PAD_INPUT_7

すべて0の値をもちます


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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (0) y = y - 4;

if (0) TYPE1型の弾を発射する命令文;

if (0) TYPE2型の弾を発射する命令文;

if (0) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE7型の弾を発射する命令文;

if (2048) TYPE8型の弾を発射する命令文;


となる



if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



if (2048) TYPE8型の弾を発射する命令文;


イコール


if (1) TYPE8型の弾を発射する命令文;


となり


TYPE8型の弾を発射する命令文;


だけが


実行されるわけだ


これがもし


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12

設定されていたら


ちょっといいかえると


イコール


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8



00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000011👈PAD_INPUT_RIGHT

00000000000000000000000000000100👈PAD_INPUT_UP

00000000000000000000000000000101👈PAD_INPUT_1

00000000000000000000000000000110👈PAD_INPUT_2

00000000000000000000000000000111👈PAD_INPUT_3

00000000000000000000000000001000👈PAD_INPUT_4

00000000000000000000000000001001👈PAD_INPUT_5

00000000000000000000000000001010👈PAD_INPUT_6

00000000000000000000000000001011👈PAD_INPUT_7

00000000000000000000000000001100👈PAD_INPUT_8



が設定されていたら



十字キーの↓ボタンを押すとGetJoypadInputState(DX_INPUT_KEY)

には戻り値として1が返り


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには1が代入されることになったとき


すなわち


keyには

2進数

00000000000000000000000000000001


が代入されることになったとき



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




if (1 & 1) y = y + 4;

if (1 & 2) x = x - 4;

if (1 & 3) x = x + 4;

if (1 & 4) y = y - 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 6) TYPE2型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 8) TYPE4型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 10) TYPE6型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;

if (1 & 12) TYPE8型の弾を発射する命令文;



となるだろう



&演算


1 & 1

1 & 2

1 & 3

1 & 4

1 & 5

1 & 6

1 & 7

1 & 8

1 & 9

1 & 10

1 & 11

1 & 12


どうなるかだが




1

2

3

4

5

6

7

8

9

10

11

12


は2進数で


00000000000000000000000000000001👈1

00000000000000000000000000000010👈2

00000000000000000000000000000011👈3

00000000000000000000000000000100👈4

00000000000000000000000000000101👈5

00000000000000000000000000000110👈6

00000000000000000000000000000111👈7

00000000000000000000000000001000👈8

00000000000000000000000000001001👈9

00000000000000000000000000001010👈10

00000000000000000000000000001011👈11

00000000000000000000000000001100👈12


となるので



00000000000000000000000000000001👈1

00000000000000000000000000000010👈2

00000000000000000000000000000011👈3

00000000000000000000000000000100👈4

00000000000000000000000000000101👈5

00000000000000000000000000000110👈6

00000000000000000000000000000111👈7

00000000000000000000000000001000👈8

00000000000000000000000000001001👈9

00000000000000000000000000001010👈10

00000000000000000000000000001011👈11

00000000000000000000000000001100👈12


2進数の1の位に1が入っている


1💖(00000000000000000000000000000001💖)


3💖(00000000000000000000000000000011💖)


5💖(00000000000000000000000000000101💖)


7💖(00000000000000000000000000000111💖)


9💖(00000000000000000000000000001001💖)


11💖💖(00000000000000000000000000001011💖)


すなわち


1

3

5

7

9

11



keyに返された戻り値1との


&演算



if (1 & 1)

if (1 & 3)

if (1 & 5)

if (1 & 7)

if (1 & 9)

if (1 & 11)


だけが


すべて


if (1)

if (1)

if (1)

if (1)

if (1)

if (1)


となり



if (1 & 1) y = y + 4;

if (1 & 3) x = x + 4;

if (1 & 5) TYPE1型の弾を発射する命令文;

if (1 & 7) TYPE3型の弾を発射する命令文;

if (1 & 9) TYPE5型の弾を発射する命令文;

if (1 & 11) TYPE7型の弾を発射する命令文;



if (1) y = y + 4;

if (1) x = x + 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;


となるので


y = y + 4;

x = x + 4;

TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;



全部実行されることになるわけだ



2進数の1の位に1が入っていない



00000000000000000000000000000010👈2


00000000000000000000000000000100👈4


00000000000000000000000000000110👈6


00000000000000000000000000001000👈8


00000000000000000000000000001010👈10


00000000000000000000000000001100👈12


すなわち


2

4

6

8

10

12



keyに返された戻り値1との


&演算



if (1 & 2)

if (1 & 4)

if (1 & 6)

if (1 & 8)

if (1 & 10)

if (1 & 12)


すべて


if (0)

if (0)

if (0)

if (0)

if (0)

if (0)


となり


if (1 & 2) x = x - 4;

if (1 & 4) y = y - 4;

if (1 & 6) TYPE2型の弾を発射する命令文;

if (1 & 8) TYPE4型の弾を発射する命令文;

if (1 & 10) TYPE6型の弾を発射する命令文;

if (1 & 12) TYPE8型の弾を発射する命令文;




if (0) x = x - 4;

if (0) y = y - 4;

if (0) TYPE2型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE8型の弾を発射する命令文;


となるので


x = x - 4;

y = y - 4;

TYPE2型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;



実行されない


結局



十字キーの↓ボタンを押しただけで


y = y + 4;

x = x + 4;

TYPE1型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;


が実行されるので


飛行機

下に4ドット

右に4ドット

移動し

TYPE1型の弾

TYPE3型の弾

TYPE5型の弾

TYPE7型の弾


が発射されることになるわけだ


原因は


1

3

5

7

9

11



2進数表示したとき


1💖(00000000000000000000000000000001💖)


3💖(00000000000000000000000000000011💖)


5💖(00000000000000000000000000000101💖)


7💖(00000000000000000000000000000111💖)


9💖(00000000000000000000000000001001💖)


11💖(00000000000000000000000000001011💖)


のように



2進数の1の位に1がはいっているからだ


2進数の2進数の1の位に1がはいっている数値と


keyに返された戻り値1


すなわち


2進数表示で表すと


00000000000000000000000000000001



との


&演算


1 & 1

1 & 3

1 & 5

1 & 7

1 & 9

1 & 11



1

になってしまうからなあ



これを


防ぐには


2進数表示したとき1の位に1がはいっている数値は


1つだけにする必要がある


PAD_INPUT_DOWNに1を設定したら


1

3

5

7

9

11

のような


2進数表示したとき


1💖(00000000000000000000000000000001💖)


3💖(00000000000000000000000000000011💖)


5💖(00000000000000000000000000000101💖)


7💖(00000000000000000000000000000111💖)


9💖(00000000000000000000000000001001💖)


11💖💖(00000000000000000000000000001011💖)


のような


2進数の1の位に1がはいっている数値は


すでに数値1が設定された


PAD_INPUT_DOWN


以外の

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


設定することはできないってわけだ



次に


PAD_INPUT_LEFTに2を設定したなら


2

6

14

30

62

106

のような


2進数表示したとき



2💖(0000000000000000000000000000001💖0)


6💖(0000000000000000000000000000011💖0)


14💖💖(000000000000000000000000000111💖0)


30💖💖(000000000000000000000000001111💖0)


62💖💖(000000000000000000000000011111💖0)


106💖💖💖(00000000000000000000000111111💖0)


のように


2進数の10の位(2の2乗の位)に1がはいっている数値は


すでに数値1が設定された


PAD_INPUT_DOWN


すでに数値2が設定された


PAD_INPUT_LEFT


以外の


PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


設定することはできないってわけだ



だから


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


数値を割り当てる際には




1

2

4

8

16

32

64

128

256

512

1024

2048


のような数値を割り当てる


つまり



00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000100👈PAD_INPUT_RIGHT

00000000000000000000000000001000👈PAD_INPUT_UP

00000000000000000000000000010000👈PAD_INPUT_1

00000000000000000000000000100000👈PAD_INPUT_2

00000000000000000000000001000000👈PAD_INPUT_3

00000000000000000000000010000000👈PAD_INPUT_4

00000000000000000000000100000000👈PAD_INPUT_5

00000000000000000000001000000000👈PAD_INPUT_6

00000000000000000000010000000000👈PAD_INPUT_7

00000000000000000000100000000000👈PAD_INPUT_8


のように


          💖2進数のどっかの位に💖


        💖他の2進数と被らないように💖


      💖1つだけ1がはいっているようにする💖


ってわけだ」



solarplexuss「うう~んん」



マックス「ふははは どうだ? よくわかっただろう」



solarplexuss「うう~んん ちょっと微妙いかも・・・」




マックス「ぬああにぃぃ~」




マックス「ようは


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


でなく



PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12

設定されていたら


ちょっといいかえると


イコール


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8

2進数で表すと


00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000011👈PAD_INPUT_RIGHT

00000000000000000000000000000100👈PAD_INPUT_UP

00000000000000000000000000000101👈PAD_INPUT_1

00000000000000000000000000000110👈PAD_INPUT_2

00000000000000000000000000000111👈PAD_INPUT_3

00000000000000000000000000001000👈PAD_INPUT_4

00000000000000000000000000001001👈PAD_INPUT_5

00000000000000000000000000001010👈PAD_INPUT_6

00000000000000000000000000001011👈PAD_INPUT_7

00000000000000000000000000001100👈PAD_INPUT_8


のように



            💖2進数のどっかの位に1が入っていて💖


        💖他の2進数の同じ位にも1がはいっていたとするだろう💖




でだあ


コントローラーの右のボタンを押したら


飛行機が右にうごくようにしたいだろお」



solarplexuss「あ、は、はい」



マックス「


            😊コントローラーの右のボタンを押す!😊


すると


GetJoypadInputState(DX_INPUT_KEY)


には戻り値として


たとえば


4が返るだろう



int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには4が代入されることになる


すなわち


keyには4


2進数であらわされると


00000000000000000000000000000100


が代入されることになる


このとき




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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




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


だけが実行されればいいんだが


&演算



key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT

key & PAD_INPUT_UP

key & PAD_INPUT_1

key & PAD_INPUT_2

key & PAD_INPUT_3

key & PAD_INPUT_4

key & PAD_INPUT_5

key & PAD_INPUT_6

key & PAD_INPUT_7

key & PAD_INPUT_8



keyには4


2進数であらわされると


00000000000000000000000000000100


が代入され


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000011👈PAD_INPUT_RIGHT

00000000000000000000000000000100👈PAD_INPUT_UP

00000000000000000000000000000101👈PAD_INPUT_1

00000000000000000000000000000110👈PAD_INPUT_2

00000000000000000000000000000111👈PAD_INPUT_3

00000000000000000000000000001000👈PAD_INPUT_4

00000000000000000000000000001001👈PAD_INPUT_5

00000000000000000000000000001010👈PAD_INPUT_6

00000000000000000000000000001011👈PAD_INPUT_7

00000000000000000000000000001100👈PAD_INPUT_8


が代入されているため


&演算



key & PAD_INPUT_DOWN

key & PAD_INPUT_LEFT

key & PAD_INPUT_RIGHT

key & PAD_INPUT_UP

key & PAD_INPUT_1

key & PAD_INPUT_2

key & PAD_INPUT_3

key & PAD_INPUT_4

key & PAD_INPUT_5

key & PAD_INPUT_6

key & PAD_INPUT_7

key & PAD_INPUT_8



0

0

0

4

4

4

4

0

0

0

0

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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (4) y = y - 4;

if (4) TYPE1型の弾を発射する命令文;

if (4) TYPE2型の弾を発射する命令文;

if (4) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE7型の弾を発射する命令文;

if (4) TYPE8型の弾を発射する命令文;


イコール


if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (1) y = y - 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE2型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (0) TYPE4型の弾を発射する命令文;

if (0) TYPE5型の弾を発射する命令文;

if (0) TYPE6型の弾を発射する命令文;

if (0) TYPE7型の弾を発射する命令文;

if (1) TYPE8型の弾を発射する命令文;


となり


y = y - 4;

TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


が実行されることになる


そう


右ボタンを押しただけで


飛行機が右に移動すると同時に



TYPE1型の弾

TYPE2型の弾

TYPE3型の弾

TYPE8型の弾


までが


発射されてしまうというわけだ


だから



PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048


のような数値を割り当てる


つまり



00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000100👈PAD_INPUT_RIGHT

00000000000000000000000000001000👈PAD_INPUT_UP

00000000000000000000000000010000👈PAD_INPUT_1

00000000000000000000000000100000👈PAD_INPUT_2

00000000000000000000000001000000👈PAD_INPUT_3

00000000000000000000000010000000👈PAD_INPUT_4

00000000000000000000000100000000👈PAD_INPUT_5

00000000000000000000001000000000👈PAD_INPUT_6

00000000000000000000010000000000👈PAD_INPUT_7

00000000000000000000100000000000👈PAD_INPUT_8


のように


          💖2進数のどっかの位に💖


        💖他の2進数と被らないように💖


      💖1つだけ1がはいっているようにする💖


ってわけだ」





solarplexuss「おおう わかったかも」







&演算の仕組みをもっと深く観察するための


コーナーです



PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

4

8

16

32

64

128

256

512

1024

2048

でなく



1

2

3

4

5

6

7

8

9

10

11

12

設定されていたら


つまり


イコール


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


2進数であらわすと


00000000000000000000000000000001👈PAD_INPUT_DOWN

00000000000000000000000000000010👈PAD_INPUT_LEFT

00000000000000000000000000000011👈PAD_INPUT_RIGHT

00000000000000000000000000000100👈PAD_INPUT_UP

00000000000000000000000000000101👈PAD_INPUT_1

00000000000000000000000000000110👈PAD_INPUT_2

00000000000000000000000000000111👈PAD_INPUT_3

00000000000000000000000000001000👈PAD_INPUT_4

00000000000000000000000000001001👈PAD_INPUT_5

00000000000000000000000000001010👈PAD_INPUT_6

00000000000000000000000000001011👈PAD_INPUT_7

00000000000000000000000000001100👈PAD_INPUT_8



が設定されていたら


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されたとき


Wボタンが押されていて


GetJoypadInputState(DX_INPUT_KEY)


には戻り値として12が返り


(DXライブラリの作者の立場に立つならば


PAD_INPUT_8の値を


12にしたならば


if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;


が実行されるように


if (key & PAD_INPUT_8)が


if (12 & 12)

イコール

if (1)


となるように



Wボタンを押した状態で


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されたときの


GetJoypadInputState(DX_INPUT_KEY)


に返される戻り値を12にすることになります)





int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されていることにより


keyには12が代入されることになったとき


すなわち


keyには

2進数

00000000000000000000000000001100


が代入されたとき



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;




if (12 & 1) y = y + 4;

if (12 & 2) x = x - 4;

if (12 & 3) x = x + 4;

if (12 & 4) y = y - 4;

if (12 & 5) TYPE1型の弾を発射する命令文;

if (12 & 6) TYPE2型の弾を発射する命令文;

if (12 & 7) TYPE3型の弾を発射する命令文;

if (12 & 8) TYPE4型の弾を発射する命令文;

if (12 & 9) TYPE5型の弾を発射する命令文;

if (12 & 10) TYPE6型の弾を発射する命令文;

if (12 & 11) TYPE7型の弾を発射する命令文;

if (12 & 12) TYPE8型の弾を発射する命令文;



となります


このとき


if (12 & 1)

if (12 & 2)

if (12 & 3)

if (12 & 4)

if (12 & 5)

if (12 & 6)

if (12 & 7)

if (12 & 8)

if (12 & 9)

if (12 & 10)

if (12 & 11)

if (12 & 12)



どのような値をもつことになるかがポイントになってきます




1

2

3

4

5

6

7

8

9

10

11

12


は2進数で


00000000000000000000000000000001👈1

00000000000000000000000000000010👈2

00000000000000000000000000000011👈3

00000000000000000000000000000100👈4

00000000000000000000000000000101👈5

00000000000000000000000000000110👈6

00000000000000000000000000000111👈7

00000000000000000000000000001000👈8

00000000000000000000000000001001👈9

00000000000000000000000000001010👈10

00000000000000000000000000001011👈11

00000000000000000000000000001100👈12


となり


12



2進数であらわすと


00000000000000000000000000001100👈12


となることより


&演算


12 & 1

00000000000000000000000000001100

00000000000000000000000000000001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


12 & 2

00000000000000000000000000001100

00000000000000000000000000000010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


12 & 3

00000000000000000000000000001100

00000000000000000000000000000011

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000000

より

0になり


12 & 4

00000000000000000000000000001100

00000000000000000000000000000100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000100

より

4になり


12 & 5

00000000000000000000000000001100

00000000000000000000000000000101

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000100

より

4になり



12 & 6

00000000000000000000000000001100

00000000000000000000000000000110

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000100

より

4になり


12 & 7

00000000000000000000000000001100

00000000000000000000000000000111

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000000100

より

4になり


12 & 8

00000000000000000000000000001100

00000000000000000000000000001000

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000001000

より

8になり


12 & 9

00000000000000000000000000001100

00000000000000000000000000001001

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000001000

より

8になり


12 & 10

00000000000000000000000000001100

00000000000000000000000000001010

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000001000

より

8になり


12 & 11

00000000000000000000000000001100

00000000000000000000000000001011

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000001000

より

8になり



12 & 12

00000000000000000000000000001100

00000000000000000000000000001100

↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡↡

00000000000000000000000000001100

より

12になるので



if (12 & 1) y = y + 4;

if (12 & 2) x = x - 4;

if (12 & 3) x = x + 4;

if (12 & 4) y = y - 4;

if (12 & 5) TYPE1型の弾を発射する命令文;

if (12 & 6) TYPE2型の弾を発射する命令文;

if (12 & 7) TYPE3型の弾を発射する命令文;

if (12 & 8) TYPE4型の弾を発射する命令文;

if (12 & 9) TYPE5型の弾を発射する命令文;

if (12 & 10) TYPE6型の弾を発射する命令文;

if (12 & 11) TYPE7型の弾を発射する命令文;

if (12 & 12) TYPE8型の弾を発射する命令文;




if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (4) y = y - 4;

if (4) TYPE1型の弾を発射する命令文;

if (4) TYPE2型の弾を発射する命令文;

if (4) TYPE3型の弾を発射する命令文;

if (8) TYPE4型の弾を発射する命令文;

if (8) TYPE5型の弾を発射する命令文;

if (8) TYPE6型の弾を発射する命令文;

if (8) TYPE7型の弾を発射する命令文;

if (12) TYPE8型の弾を発射する命令文;


イコール


if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (1) y = y - 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE2型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE4型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE6型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;

if (1) TYPE8型の弾を発射する命令文;


となり


y = y - 4;

TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


が実行されることになります


すなわち


Wボタンを押しているのに


なぜか


飛行機は4ドット上に移動し


なぜか


TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


が発射されることになります



うふふ




この仕組みを何かの演出に使ったら面白いなと思いました



もともとのDXライブラリの設定では


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8

には


1

2

4

8

16

32

64

128

256

512

1024

2048

が設定されており


自分で


PAD_INPUT_DOWN

PAD_INPUT_LEFT

PAD_INPUT_RIGHT

PAD_INPUT_UP

PAD_INPUT_1

PAD_INPUT_2

PAD_INPUT_3

PAD_INPUT_4

PAD_INPUT_5

PAD_INPUT_6

PAD_INPUT_7

PAD_INPUT_8


1

2

3

4

5

6

7

8

9

10

11

12


を設定するなんてことはできないけど


そうできなくても


工夫すれば


全タイプの弾を


1つのボタンを押すだけで


発射できるようになるんじゃないかな?とおもったのですよん


それって


すごく面白いとおもわない?


いや😊 普通?


PAD_INPUT_8=2048


でしょう


だから


          😊Wボタンを押して😊


int key = GetJoypadInputState(DX_INPUT_KEY);


の実行により


GetJoypadInputState(DX_INPUT_KEY)に2048が代入されたとき



飛行機は動かずに



TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


全タイプの弾が発射されるようにするには


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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



if (key & PAD_INPUT_DOWN)

if (key & PAD_INPUT_LEFT)

if (key & PAD_INPUT_RIGHT)

if (key & PAD_INPUT_UP)



if (0)

if (0)

if (0)

if (0)


if (key & PAD_INPUT_DOWN)

if (key & PAD_INPUT_LEFT)

if (key & PAD_INPUT_RIGHT)

if (key & PAD_INPUT_UP)

if (key & PAD_INPUT_1)

if (key & PAD_INPUT_2)

if (key & PAD_INPUT_3)

if (key & PAD_INPUT_4)

if (key & PAD_INPUT_5)

if (key & PAD_INPUT_6)

if (key & PAD_INPUT_7)

if (key & PAD_INPUT_8)


if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)


になればいいんでしょう


if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;

if (0) y = y - 4;

if (1) TYPE1型の弾を発射する命令文;

if (1) TYPE2型の弾を発射する命令文;

if (1) TYPE3型の弾を発射する命令文;

if (1) TYPE4型の弾を発射する命令文;

if (1) TYPE5型の弾を発射する命令文;

if (1) TYPE6型の弾を発射する命令文;

if (1) TYPE7型の弾を発射する命令文;

if (1) TYPE8型の弾を発射する命令文;


になればいいってわけだね


そうすれば


TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


が実行されるわけだよね


そのためには


keyに4080


2進数

00000000000000000000111111110000


が代入される必要があります


keyに4080


が代入されれば


if (key & PAD_INPUT_DOWN)

if (key & PAD_INPUT_LEFT)

if (key & PAD_INPUT_RIGHT)

if (key & PAD_INPUT_UP)

if (key & PAD_INPUT_1)

if (key & PAD_INPUT_2)

if (key & PAD_INPUT_3)

if (key & PAD_INPUT_4)

if (key & PAD_INPUT_5)

if (key & PAD_INPUT_6)

if (key & PAD_INPUT_7)

if (key & PAD_INPUT_8)


イコール


if (4080 & PAD_INPUT_DOWN)

if (4080 & PAD_INPUT_LEFT)

if (4080 & PAD_INPUT_RIGHT)

if (4080 & PAD_INPUT_UP)

if (4080 & PAD_INPUT_1)

if (4080 & PAD_INPUT_2)

if (4080 & PAD_INPUT_3)

if (4080 & PAD_INPUT_4)

if (4080& PAD_INPUT_5)

if (4080 & PAD_INPUT_6)

if (4080 & PAD_INPUT_7)

if (4080 & PAD_INPUT_8)


イコール


if (4080 & 1)

if (4080 & 2)

if (4080 & 4)

if (4080 & 8)

if (4080 & 16)

if (4080 & 32)

if (4080 & 64)

if (4080 & 128)

if (4080 & 256)

if (4080 & 512)

if (4080 & 1024)

if (4080 & 2048)


イコール

if (0)

if (0)

if (0)

if (0)

if (16)

if (32)

if (64)

if (128)

if (256)

if (512)

if (1024)

if (2048)


イコール

if (0)

if (0)

if (0)

if (0)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)

if (1)


となるので


y = y + 4;

x = x - 4;

x = x + 4;

y = y - 4;


が実行されず


TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;

実行されることになります


ですので


飛行機は動かずに



TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


が発射されることになります




とはいうものの



Wボタンを押した状態で


int key = GetJoypadInputState(DX_INPUT_KEY);


が実行されると


GetJoypadInputState(DX_INPUT_KEY)には



PAD_INPUT_8に対応する(Wボタンに対応する)2048が戻り値として返されます



keyには2048が代入されますが


             🍓keyには4080が代入されなければ🍓


飛行機は動かずに



TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


全タイプの弾が発射されるようにすることにはできませんね



ですので



int key = GetJoypadInputState(DX_INPUT_KEY);


の実行の後に


keyには2048が代入されたとき


keyには4080が代入されるような


if{}文を実行することになります


👇


if(key==2048){


key=4080;


}



そして


if(key==2048){


key=4080;


}


記述したあとに


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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;


を記述すれば


Wボタンを押して


int key = GetJoypadInputState(DX_INPUT_KEY);


の実行により


GetJoypadInputState(DX_INPUT_KEY)に2048が代入されたとき



飛行機は動かずに



TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


全タイプの弾



発射されることになります



そのときのプログラムは以下のようになるかな

👇


#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, 450, GetColor(0, 255, 255), TRUE);


int key = GetJoypadInputState(DX_INPUT_KEY);



//👇🌞ここですね


if(key==2048){


key=4080;


}

//👆🌞ここですね



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;


if(key==PAD_INPUT_8){

//🌞PAD_INPUT_8は2048をあらわします

TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


}

DrawGraph(x, y, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


}


};


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


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

}





solarplexuss「おおう、 おおう」






他の方法で


Wボタンを押して


int key = GetJoypadInputState(DX_INPUT_KEY);


の実行により


GetJoypadInputState(DX_INPUT_KEY)に2048が代入されたとき


飛行機は動かずに


TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


全タイプの弾


が発射されるようにするには・・・・・



もっとわかりやすい方法はないかな・・・


そうだ!


PAD_INPUT_8=2048


でしょう


だから


Wボタンを押して


int key = GetJoypadInputState(DX_INPUT_KEY);


の実行により


keyに2048が代入されたとき



TYPE1型の弾



TYPE2型の弾



TYPE3型の弾



TYPE4型の弾



TYPE5型の弾



TYPE6型の弾



TYPE7型の弾



TYPE8型の弾


全タイプの弾



発射されるようにするには



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;

if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;



if (key & PAD_INPUT_8) TYPE8型の弾を発射する命令文;


の代わりに




if{}文を用いた

👇


if(key==PAD_INPUT_8){


//🌞PAD_INPUT_8は2048をあらわします


TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


}

👆


記述すればいいんだね


この方が簡単だね


だからプログラムは以下のようになるかな

👇


#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, 450, GetColor(0, 255, 255), TRUE);


int key = GetJoypadInputState(DX_INPUT_KEY);



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) y = y - 4;

if (key & PAD_INPUT_1) TYPE1型の弾を発射する命令文;

if (key & PAD_INPUT_2) TYPE2型の弾を発射する命令文;

if (key & PAD_INPUT_3) TYPE3型の弾を発射する命令文;

if (key & PAD_INPUT_4) TYPE4型の弾を発射する命令文;

if (key & PAD_INPUT_5) TYPE5型の弾を発射する命令文;

if (key & PAD_INPUT_6) TYPE6型の弾を発射する命令文;

if (key & PAD_INPUT_7) TYPE7型の弾を発射する命令文;


if(key==PAD_INPUT_8){

//🌞PAD_INPUT_8は2048をあらわします

TYPE1型の弾を発射する命令文;

TYPE2型の弾を発射する命令文;

TYPE3型の弾を発射する命令文;

TYPE4型の弾を発射する命令文;

TYPE5型の弾を発射する命令文;

TYPE6型の弾を発射する命令文;

TYPE7型の弾を発射する命令文;

TYPE8型の弾を発射する命令文;


}

DrawGraph(x, y, graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


}


};


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


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

}





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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