さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラムとbreak;を使わない新型プログラムを見比べてみましょう その1
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラムとbreak;を使わない新型プログラムを見比べてみましょう その1
ソーラー「ふうぅ
やった😊
敵の飛行機10体から敵の弾が2連射される
📀新しいタイプのプログラム💿
の開発に成功したね」
マックス「やったな
ただ
敵の飛行機10体から敵の弾が2連射される
新型のプログラム
を開発しなくても
敵の飛行機10体から敵の弾が2連射される
旧型のプログラム
で
よかったんじゃないか?
新型では何かいいことがあるのか?」
solarplexuss「うーん 🧐 確かに ・・・
旧型と新型の違い・・・か・・・
でも
まあ break;
を使わなくなったので
プログラムが読みやすくわかりやすく解説なったのはすごくいいところじゃない?
うちはそこが お・気・に・入・り💖」
ソーラー「
それでは
break;
を使った
敵の飛行機1体から敵の弾が2連射される
旧型プログラムと
break;
を使わない
敵の飛行機1体から敵の弾が2連射される
新型プログラム
を
見比べて違いを見てみましょう
まずは
break;
を使った
敵の飛行機1体から敵の弾が2連射される
旧型プログラムはこちらです
👇
//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです
if (tekinotama_count == 0)) {
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 0) {
tekinotama[i].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[i].x;
tekinotama[i].y = tekinohikouki[0].y + 10;
tekinotama[i].life = 1;
break;
}
}
tekinotama_count = 10;
}
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 1) {
//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾がゲーム画面に表示されることはありません
DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);
tekinotama[i].x = tekinotama[i].x - 10;
if (tekinotama_tsix - tekinotama[i].x > 640)
//🌞🌞🌞発射された敵の弾の位置のx座標が発射されたときの最初の敵の弾の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります
//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾が発射されたときの敵の弾のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾が発射されたときの敵の弾のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります
tekinotama[i].life = 0;
}
}
ソーラー「そして
break;
を使わない
敵の飛行機1体から敵の弾が2連射される
新型プログラムはこちらです
👇
//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される新型プログラムです
if (tekinotama[0].life == 0 && hassyasa
tekinotama[0].x = tekinohikouki[0].x - 10;
tekinotama[0].y = tekinohikouki[0].y + 10;
tekinotama_tsix[0] = tekinotama[0].x;
tekinotama[0].life = 1;
hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん
tekinotama_count[0] = 30;//👈2連射される敵の弾の最初の弾と次弾の間隔を調整することができます
}
if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }
if (tekinotama_count[0] == 0 && hassyasa
if (tekinotama[1].life == 0) {
tekinotama[1].x = tekinohikouki[0].x - 10;
tekinotama[1].y = tekinohikouki[0].y + 10;
tekinotama_tsix[1] = tekinotama[1].x;
tekinotama[1].life = 1;
hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん
tekinotama_count[1] = 30;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます
}
}
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
if (tekinotama_count[1] == 0 && hassyasa
hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん
}
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 1) {
//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません
DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);
tekinotama[i].x = tekinotama[i].x - 10;
if (tekinotama_tsix - tekinotama[i].x > 640)
//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります
//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります
tekinotama[i].life = 0;
}
}
マックス「ここの部分は
共通か
👇
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 1) {
//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません
DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);
tekinotama[i].x = tekinotama[i].x - 10;
if (tekinotama_tsix - tekinotama[i].x > 640)
//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります
//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります
tekinotama[i].life = 0;
}
}
となると
違いは
この旧型のこの部分と
👇
//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです
if (tekinotama_count == 0)) {
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 0) {
tekinotama[i].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[i].x;
tekinotama[i].y = tekinohikouki[0].y + 10;
tekinotama[i].life = 1;
break;
}
}
tekinotama_count = 10;
}
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
新型のここの部分ってわけだ
👇
//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される新型プログラムです
if (tekinotama[0].life == 0 && hassyasa
tekinotama[0].x = tekinohikouki[0].x - 10;
tekinotama[0].y = tekinohikouki[0].y + 10;
tekinotama_tsix[0] = tekinotama[0].x;
tekinotama[0].life = 1;
hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん
tekinotama_count[0] = 30;//👈2連射される敵の弾の最初の弾と次弾の間隔を調整することができます
}
if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }
if (tekinotama_count[0] == 0 && hassyasa
if (tekinotama[1].life == 0) {
tekinotama[1].x = tekinohikouki[0].x - 10;
tekinotama[1].y = tekinohikouki[0].y + 10;
tekinotama_tsix[1] = tekinotama[1].x;
tekinotama[1].life = 1;
hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん
tekinotama_count[1] = 30;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます
}
}
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
if (tekinotama_count[1] == 0 && hassyasa
hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん
}
ソーラー「新型プログラムでは
if (tekinotama[0].life == 0 && hassyasa
や
if (tekinotama_count[0] == 0 && hassyasa
のように
発射される弾が最初の弾か次弾かを指定するhassyasareru_tekinotama
が用いられているので
hassyasareru_tekinotamaに0が格納されているときは
2連射される敵の弾の最初の弾が
hassyasareru_tekinotamaに1が格納されているときは
2連射される敵の弾の次弾が
発射されることになります
この新型プログラムでは
必ず
2連射される敵の弾の最初の弾が発射されたら
次弾が発射され
次弾が発射されたら
最初の弾が発射されることになりますが
旧型プログラムでは
発射される弾が最初の弾か次弾かを指定するhassyasareru_tekinotama
が用いられていないので
2連射される敵の弾の最初の弾が発射されたあと
次弾が発射される前に
tekinotama_tsix - tekinotama[0].x > 640
が満たされ
tekinotama[0].life = 0;
が成立し
tekinotama_count に格納される値が0になったときに
再び
i=0の場合の
👇
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 0) {
tekinotama[i].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[i].x;
tekinotama[i].y = tekinohikouki[0].y + 10;
tekinotama[i].life = 1;
break;
}
}
tekinotama_count = 10;
}
が実行される
すなわち
if (tekinotama[0].life == 0) {
tekinotama[0].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[0].x;
tekinotama[0].y = tekinohikouki[0].y + 10;
tekinotama[0].life = 1;
}
tekinotama_count = 10;
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されて
最初の弾が発射され
次弾が発射されなくなることがあるんだ
だから
tekinotama_countに格納される値が0になる前に
tekinotama_tsix - tekinotama[0].x > 640
が成立して
tekinotama[0].life = 0;
が実行されないように
敵の弾の移動スピードに注意する必要があるんだね」
solarplexuss「??どーいうことぉん」
マックス「つまり
最初の弾が発射された後
最初の弾の移動スピードが
早すぎると
tekinotama_countに格納される値が0になる前に
tekinotama_tsix - tekinotama[0].x > 640
が成立し
tekinotama[0].life = 0;
が実行されて
次弾が発射される前に
また最初の弾が発射されてしまうわけだ
そこで
最初の弾の移動スピードを調整する必要が出てくるってわけだ
今のプログラムでは
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 1) {
//🌞🌞🌞 tekinotama[i].lifeに1が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることになります tekinotama[i].lifeに0が代入されていると敵の弾tekinotama[i]がゲーム画面に表示されることはありません
DrawGraph(tekinotama[i].x, tekinotama[i].y, tekinotama[i].graphichandle[0], TRUE);
tekinotama[i].x = t
if (tekinotama_tsix - tekinotama[i].x > 640)
//🌞🌞🌞発射された敵の弾tekinotama[i]の位置のx座標が発射されたときの最初の敵の弾tekinotama[i]の位置のx座標から🍑左へ🍑640を超えて離れると条件tekinotama_tsix - tekinotama[i].xは真の値1をとることになります
//🌞🌞🌞🌞🌞👆 tekinotama_tsixには敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置のx座標を記憶していたのでtekinotama[i].xが敵の弾tekinotama[i]が発射されたときの敵の弾tekinotama[i]のいる位置から640ドット離れた時tekinotama_tsix - tekinotama[i].x > 640は真の値1を持つことになります
tekinotama[i].life = 0;
}
}
の
tekinotama[i].x = t
の部分が
敵の弾の移動スピード(while{}文のブロック{}内の命令文が
1回繰り返し実行されるごとに移動するドット数)
を決定しているんだろう
tekinotama[i].x = tekinotama[i].x -
のように
次弾が発射される前に
また最初の弾が発射されてしまうようなことは起こらない
while{}文のブロック{}内の命令文が
1回繰り返し実行されるごとに
敵の弾の最初の弾(、次弾ともに)は
左へ
そして
もし
tekinotama_count に格納される値が
tekinotama_count = 10;
のように
10と設定されている場合は
while{}文のブロック{}内の命令文が
10回繰り返し実行されることによって
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が
10回繰り返し実行されて
tekinotama_countに格納される値が0になったとき
敵の弾の最初の弾は
-
つまり
tekinotama_tsix(敵の弾の最初の弾の発射されたときの位置)から左へ100ドット
しか移動していない
だから
tekinotama_tsix - tekinotama[0].x=100
となって
tekinotama_tsix - tekinotama[0].x > 640
が成立することもないので
tekinotama[0].life = 0;
が実行されるようなことはないわけだ
だから
最初の弾が発射されたあと
また
最初の弾が発射されることはないってわけだ」
solarplexuss「あああおおお??どーいうことぉん」
ソーラー「そう
旧型のプログラムでは
while{}文のブロック{}内の命令文が
1回繰り返し実行されるごとに
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されて
tekinotama_countに格納される値が1減っていくので
tekinotama_countに格納される値が0になるには
while{}文のブロック{}内の命令文が
10回繰り返し実行される必要があります
今の旧型プログラムでは
while{}文のブロック{}内の命令文が
10回繰り返し実行された場合
tekinotama[i].x = tekinotama[i].x -
が
10回繰り返し実行されるんだけど
そのとき
tekinotama[i].xに格納される値は100減るね
tekinotama[i].xに格納される値が減れば減るほど
敵の弾は左へ移動するんだよ
つまり
while{}文のブロック{}内の命令文が
10回繰り返し実行されて
tekinotama_count に格納される値が0になったときに
最初に発射された弾は
最初の位置tekinotama_tsixから100ドットしか左へ移動していないので
もちろん
while{}文のブロック{}内の命令文が
10回繰り返し実行されて
tekinotama_countに格納される値が0になったときに
tekinotama_tsix - tekinotama[0].x > 640
が成立することはないので
tekinotama[0].life = 0;
が
実行されることはありません
つまり
tekinotama[0].lifeに格納される値は0にならないんだ
ですので
tekinotama_count に格納される値が0になったときに
再び
以下の命令文
//👇🌞🌞🌞 敵の飛行機1体から敵の弾が2連射される旧型プログラムです
if (tekinotama_count == 0)) {
for (int i = 0; i < 2; i = i + 1) {
if (tekinotama[i].life == 0) {
tekinotama[i].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[i].x;
tekinotama[i].y = tekinohikouki[0].y + 10;
tekinotama[i].life = 1;
break;
}
}
tekinotama_count = 10;
}
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
の実行において
tekinotama[0].life に格納される値は0ではないので
i=0の場合の
👇
if (tekinotama[0].life == 0) {
tekinotama[0].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[0].x;
tekinotama[0].y = tekinohikouki[0].y + 10;
tekinotama[0].life = 1;
}
tekinotama_count = 10;
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されることはなくなる
つまり
最初の弾が発射された後
また
最初の弾が発射されるってことはなくなるんだ
ちゃんと
i=1の場合の
👇
if (tekinotama[1].life == 0) {
tekinotama[1].x = tekinohikouki[0].x-10;
//👆🌞🌞🌞敵の弾は敵の飛行機の左側に表示されることになります
tekinotama_tsix = tekinotama[1].x;
tekinotama[1].y = tekinohikouki[0].y + 10;
tekinotama[1].life = 1;
}
tekinotama_count = 10;
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されて
最初の弾が発射された後
次弾が発射されることになるね(*´▽`*)」
solarplexuss「ははあ・・・
なるほど」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます