さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
PAD_INPUT_DOWN,PAD_INPUT_LEFT,PAD_INPUT_RIGHT,PAD_INPUT_UPに なぜ 2の倍数の 1,2,4,8 が 設定されているのでしょうか?
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となっている
の&演算
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
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進数表示したとき
のように
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進数表示したとき
・
・
・
のような
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進数の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; // プログラムを終了します
}
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます