さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
1発 自分の弾が 敵の飛行機に ぶつかっただけで ずっと 敵の飛行機が敵の飛行機を覆う光で覆われる現象について考察してみましょう
1発 自分の弾が 敵の飛行機に ぶつかっただけで ずっと 敵の飛行機が敵の飛行機を覆う光で覆われる現象について考察してみましょう
マックス「ぐぬぬぅ」
solarplexuss「じゃあ
敵の飛行機に自分の弾が1発当たって
自分の弾が消滅してゲーム画面から見えなくなっても
ずっと自分の弾が敵の飛行機に
ヒットし続けているような状態になっているということなの?」
ソーラー「そのとおり そうなんだよ」
solarplexuss「あ
🌞(*´▽`*)🌞それも問題だけど🌞(*´▽`*)🌞
よくみたら
敵の飛行機に自分の弾が当たった時
敵の飛行機が
敵の飛行機を覆う光で覆われて消える
点滅するよう設定していたはずなのに
1発
自分の弾が
敵の飛行機に
ぶつかっただけで
ずっと
敵の飛行機が敵の飛行機を覆う光で
おおわれていない?
なんでそうなるのか?
それに関しても
自分の弾と敵の飛行機がぶつかった時
if ((jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)) {}
の条件式
(jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)
が
常に
真の値1を持つことになるので
ブロック内の命令文
👇
jibunnotama[j].life = 0;
tekinohikouki[i].life = tekinohikouki[i].life - 1;
//👆🌞自分の弾と敵の飛行機が衝突すると自分の弾は消滅しtekinohikouki[i].lifeに格納されている値は1減ることになります tekinohikouki[i].lifeに格納されている値が0になると敵の飛行機は消滅することになります
tekinohikoukiwooouhikari.x = tekinohikouki[i].x;
tekinohikoukiwooouhikari.y = tekinohikouki[i].y;
//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます
tekinohikoukiwooouhikari.life = 1;
if (tekinohikouki[i].life == 0) {
bakuhatunohonoo[i].x = tekinohikouki[i].x;
bakuhatunohonoo[i].y = tekinohikouki[i].y;
bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています
}
👆
が
ずっと実行されることが関係してるんじゃない?
tekinohikoukiwooouhikari.x = tekinohikouki[i].x;
tekinohikoukiwooouhikari.y = tekinohikouki[i].y;
//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます
tekinohikoukiwooouhikari.life = 1;
が実行されて
tekinohikoukiwooouhikari.lifeに1が代入されると
敵の飛行機を覆う光が表示される準備が整うんでしょう
そして
tekinohikoukiwooouhikari.lifeに1が代入されているので
続く命令文
if (tekinohikoukiwooouhikari.life > 0) {
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています
}
//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません
for (int i = 0; i < 10; i++) {
if (bakuhatunohonoo[i].life > 0) {
DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);
//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞
bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;
//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています
bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;
}
//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます
//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません
}
の
if (tekinohikoukiwooouhikari.life > 0) {}
の条件式
tekinohikoukiwooouhikari.life > 0
が
真の値1を持つことになるので
ブロック{}内の命令文
👇
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています
}
//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません
for (int i = 0; i < 10; i++) {
if (bakuhatunohonoo[i].life > 0) {
DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);
//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞
bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;
//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています
bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;
}
//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます
//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません
👆
が実行されることになるよね
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
が実行されると
敵の飛行機を覆う光が表示されるけど
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
が
実行されるので
tekinohikoukiwooouhikari.lifeに格納される値は0になる
tekinohikoukiwooouhikari.lifeに格納される値が0になると
敵の飛行機を覆う光は
表示されなくなるはず・・・
敵の飛行機に自分の弾があたったとき
1瞬だけ
敵の飛行機を覆う光が表示されるはず・・・
なんだけど
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
が
実行されるので
tekinohikoukiwooouhikari.lifeに格納される値は0になったとしても
if ((jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)) {}
の条件式
(jibunnotama[j].x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnotama[j].x + 15) && (jibunnotama[j].y < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnotama[j].y + 5)
は
常に
真の値1を持つことになるので
ブロック内の命令文
👇
jibunnotama[j].life = 0;
tekinohikouki[i].life = tekinohikouki[i].life - 1;
//👆🌞自分の弾と敵の飛行機が衝突すると自分の弾は消滅しtekinohikouki[i].lifeに格納されている値は1減ることになります tekinohikouki[i].lifeに格納されている値が0になると敵の飛行機は消滅することになります
tekinohikoukiwooouhikari.x = tekinohikouki[i].x;
tekinohikoukiwooouhikari.y = tekinohikouki[i].y;
//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます
tekinohikoukiwooouhikari.life = 1;//💖またtekinohikoukiwooouhikari.lifeに1が代入されることになります
if (tekinohikouki[i].life == 0) {
bakuhatunohonoo[i].x = tekinohikouki[i].x;
bakuhatunohonoo[i].y = tekinohikouki[i].y;
bakuhatunohonoo[i].life = 128 + 128 * GetRand(9); //🌞🌞🌞 bakuhatunohonoo[i].lifeに0以上の値を代入しました bakuhatunohonoo[0].life, bakuhatunohonoo[1].life, bakuhatunohonoo[2].life, bakuhatunohonoo[3].life, bakuhatunohonoo[4].life, bakuhatunohonoo[5].life, bakuhatunohonoo[6].life, bakuhatunohonoo[7].life, bakuhatunohonoo[8].life, bakuhatunohonoo[9].lifeにランダムに異なる値を代入することにより爆発する時間をランダムに変化させています
}
👆
が
間髪いれず
すぐに実行されることになる
そして
tekinohikoukiwooouhikari.x = tekinohikouki[i].x;
tekinohikoukiwooouhikari.y = tekinohikouki[i].y;
//🌞🌞🌞自分の弾と敵の飛行機がぶつかると敵の飛行機の位置座標がtekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.yに代入されます
tekinohikoukiwooouhikari.life = 1;
が実行されるので
tekinohikoukiwooouhikari.lifeに1が代入されると
敵の飛行機を覆う光が表示される準備が整うことになるよね
となると
tekinohikoukiwooouhikari.lifeに1が代入されているので
続く命令文
if (tekinohikoukiwooouhikari.life > 0) {
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています
}
//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません
for (int i = 0; i < 10; i++) {
if (bakuhatunohonoo[i].life > 0) {
DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);
//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞
bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;
//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています
bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;
}
//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます
//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません
}
の
if (tekinohikoukiwooouhikari.life > 0) {}
の条件式
tekinohikoukiwooouhikari.life > 0
が
真の値1を持つことになるので
ブロック{}内の命令文
SetDrawBlendMode(DX_BLENDMODE_ALPHA, 200);
//👆🌞🌞🌞描画ブレンドモードがアルファブレンドになっています
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
// 👆🌞🌞🌞描画ブレンドモードをノーブレンドにして描画ブレンドモードを解除しています
}
//👆🌞🌞🌞敵の飛行機を覆う光の画像が描かれます tekinohikoukiwooouhikari.lifeに格納されている値が0になると敵の飛行機を覆う光の画像が描かれることはありません
for (int i = 0; i < 10; i++) {
if (bakuhatunohonoo[i].life > 0) {
DrawGraph(bakuhatunohonoo[i].x, bakuhatunohonoo[i].y, bakuhatunohonoo[i].graphichandle[(bakuhatunohonoo[i].graphicnumber / 32) % 7], TRUE);
//👆🌞🌞🌞 🌞🌞🌞 🌞🌞bakuhatunohonoo[i].graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞
bakuhatunohonoo[i].graphicnumber = bakuhatunohonoo[i].graphicnumber + 1;
//👆🌞🌞🌞爆発の炎がアニメーションするよう設定が行われています
bakuhatunohonoo[i].life = bakuhatunohonoo[i].life - 1;
}
//👆 bakuhatunohonoo[i].lifeに格納されている値が1なら爆発の炎の画像を描きます
//👆 bakuhatunohonoo[i].lifeに格納されている値が0なら爆発の炎の画像が描かれることはありません
が実行される
で
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
が実行されるので
敵の飛行機を覆う光が表示される
つまり
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
が
実行されて
tekinohikoukiwooouhikari.lifeに格納される値が0になったとしても
すぐに
tekinohikoukiwooouhikari.lifeに1が代入され
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
が実行されるので
また
敵の飛行機を覆う光が表示される
そのあと
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
が
実行されて
tekinohikoukiwooouhikari.lifeに格納される値が0になったとしても
すぐに
tekinohikoukiwooouhikari.lifeに1が代入され
また
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
が実行されて
敵の飛行機を覆う光が表示される
そのあと
tekinohikoukiwooouhikari.life = tekinohikoukiwooouhikari.life - 1;
が
実行されて
tekinohikoukiwooouhikari.lifeに格納される値が0になったとしても
すぐに
tekinohikoukiwooouhikari.lifeに1が代入され
また
DrawGraph(tekinohikoukiwooouhikari.x, tekinohikoukiwooouhikari.y, tekinohikoukiwooouhikari.graphichandle[0], TRUE);
が実行されて
敵の飛行機を覆う光が表示される
・
・
・
・
・
がずっと繰り返されることになるので
ずっと
敵の飛行機を覆う光が表示されることになるんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます