さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラムとbreak;を使わない新型プログラムを見比べてみましょう その2
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラムとbreak;を使わない新型プログラムを見比べてみましょう その2
solarplexuss「
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラム
と
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使わない新型プログラム
の違いがわかったかもん!
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使う旧型プログラム
では
敵の飛行機1体から敵の弾が2連射されるとき
最初の弾
最初の弾
最初の弾
・
・
・
・
・
のように
最初の弾が
続けて発射される場合があるんだけど
敵の飛行機1体から敵の弾が2連射されるのにbreak;を使わない新型プログラム
では
敵の飛行機1体から敵の弾が2連射されるとき
最初の弾
次弾
最初の弾
次弾
最初の弾
次弾
・
・
・
・
・
というように
必ず
最初の弾が
発射されたら
次弾が
というように
交互に
最初の弾
と
次弾
が
発射されるんだね
さすがは新型といったところだね」
ソーラー「で
まだまだ
違いはあるよ
もう1度
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=tekinotama[0].x;
tekinotama[0].life = 1;
hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん
tekinotama_count[0] = 10;//👈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[1].life = 1;
hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん
tekinotama_count[1] = 10;//👈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=tekinotama[0].x;
tekinotama[0].life = 1;
hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん
tekinotama_count[0] = 10;//👈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[1].life = 1;
hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん
tekinotama_count[1] = 10;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます
}
}
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
if (tekinotama_count[1] == 0 && hassyasa
hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん
}
マックス「違いか・・・
ふ~む」
solarplexuss「旧型では
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
だけが実行されていて
新型では
if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }
と
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
が実行されている・・・
違いはそれだあ(*^▽^*)
なあんちゃって💖」
ソーラー「おお
正解です
違いは
その部分です」
solarplexuss「え~どおいうことぉ?」
ソーラー「
旧型では
最初の弾が発射されるとき
tekinotama_count = 10;
が実行されて
tekinotama_count に格納される値が
10になるね
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されるので
while{}文のブロック{}内の命令文が10回繰り返し実行されると
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が
10回繰り返し実行され
tekinotama_count に格納される値は0になるね
そのとき
最初に発射された弾が640ドット以上左へ移動していないと
tekinotama[0].life には1が格納されたままなので
tekinotama[0].life == 0
は成立せず
tekinotama[1].life == 0
が成立するので
次弾が発射されるね
そして
次弾が発射されるときも
tekinotama_count = 10;
が実行されて
tekinotama_count に格納される値が
10になるね
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が実行されるので
while{}文のブロック{}内の命令文が10回繰り返し実行されると
if (tekinotama_count > 0) { tekinotama_count = tekinotama_count - 1; }
が
10回繰り返し実行され
tekinotama_count に格納される値は0になるね
今度は
tekinotama_count に格納される値が0になったこの状態で
敵の最初の弾が640ドット以上左へ移動していた場合
条件式tekinotama_tsix - tekinotama[0].x > 640
が
真の値1をもつことになり
tekinotama[0].life = 0
が実行されて
またまた
最初の弾が発射されることになるね」
solarplexuss「うわあ なるほどぉ
そういう仕組みだったんだ」
ソーラー「
新型では
if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }
と
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
が実行されています
最初の弾tekinotama[0]が発射されるとき
tekinotama_count[0] = 10;
hassyasareru_tekinotama = 1;//💖💖💖👈ここだよ〜ん
が実行されて
tekinotama_count[0] に格納される値が
10になるね
while{}文のブロック{}内の命令文が10回繰り返し実行されると
if (tekinotama_count[0] > 0) { tekinotama_count[0] = tekinotama_count[0] - 1; }
が
10回繰り返し実行され
tekinotama_count[0] に格納される値は0になるね
tekinotama_count[0] に格納される値が0になると
if (tekinotama_count[0] == 0 && hassyasa
の条件式が満たされるので
次弾tekinotama[1]が発射されるね
そして
次弾tekinotama[1]が発射されるときは
ついでに
hassyasareru_tekinotama = 2; //💖💖💖👈ここだよ〜ん
tekinotama_count[1] = 10;//👈2連射される敵の弾の次弾と最初の弾の間隔を調整することができます
が実行されて
hassyasareru_tekinotamaに格納される値は2
tekinotama_count[1]に格納される値は
10になっているね
またまた
while{}文のブロック{}内の命令文が10回繰り返し実行されると
if (tekinotama_count[1] > 0) { tekinotama_count[1] = tekinotama_count[1] - 1; }
が
10回繰り返し実行され
tekinotama_count[1] に格納される値は0になるね
そうなると
今度は
hassyasareru_tekinotama に格納される値が2に
tekinotama_count[1]に格納される値が0になるね
そうなると
続く命令文
if (tekinotama_count[1] == 0 && hassyasa
hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん
}
の条件式
tekinotama_count[1] == 0 && hassyasa
は真の値1を持つことになるので
hassyasareru_tekinotama = 0; //💖💖💖👈ここだよ〜ん
が実行され
hassyasareru_tekinotamaに格納される値は0になるね
ここまでで
最初の弾と
次弾が
仲良く並んで発射されました
でも
敵の最初の弾tekinotama[0]が640ドット以上 左へ移動するまでは
最初の弾が再び発射されることはありません
マックス「よく見かける光景じゃのう
敵の弾が2連射されて
しばらくたった後
また
敵の弾が
2連射されるわけだ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます