Zボタンを押していると弾が1000連射されることになりますが1000連射されてから1000連射されるまでの間隔を一定になるようにしてみましょう

ソーラー「さあ今日はどうしてみよっかなあ


次は



Zボタンを押し続けていると


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


1000発の弾が発射され


さらに


一定の間をおいて


再び


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999



1000発の弾が発射されるようにしてみましょう




(注意 以前のエピソードでも実際には1000連射されることはありません)



もちろん


自機が


右端にいても


左端にいても


1000連射された弾と


次に発射される


1000連射される弾


間隔が


一定になるようにしてみます


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


のデータを取り扱うためには


1000個の


Character型の構造体変数が必要になります


そのために


Character型の配列宣言


struct Character jibunnotama[1000];



おこなって


Character型の構造体変数


jibunnotama[0]

jibunnotama[1]

jibunnotama[2]

jibunnotama[3]

jibunnotama[4]

jibunnotama[5]

jibunnotama[6]

jibunnotama[7]

jibunnotama[8]

jibunnotama[9]

jibunnotama[999]

を作製して



自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999

のデータを取り扱うようにしてみようよ」


マックス「ようは


さっきのエピソードの2連射プログラムを


1000連射プログラムに変更するだけなんだろう


なら


for (int i = 0; i < 2; i = i + 1) {}



2の部分も


for (int i = 0; i < 1000; i = i + 1) {}


のように


1000


にして

自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


のデータを取り扱うことになるよなあ」


ソーラー「そうなんでえす


それでは


Zボタンを押し続けていると


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


1000発の弾が発射され


さらに


一定の間をおいて



自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


1000発の弾が発射されるプログラムはこちらです



もちろん


自機が右端にいても


左端にいても


1000連射された弾と


次に発射される


1000連射される弾


間隔は


一定になっています


まあ ちょこっと2連射プログラムに手を加えただけなんだけど…


そうだ




前のエピソードの2連射プログラムの


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}


のブロック{}内の命令文

👇

jibunnotama[i].x = jibunnotama[i].x +10💖💖;


の部分を


今回は


jibunnotama[i].x = jibunnotama[i].x +1💖;


に変更してみましょう


すると


while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {}


のブロック{}内の命令文


jibunnotama[i].x = jibunnotama[i].x +1;


が実行されるごとに


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999



1ドットずつ移動することになります


つまり


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


の移動するスピードが遅くなるんだよ


自分の弾

自分の弾1

自分の弾2

自分の弾3

自分の弾4

自分の弾5

自分の弾6

自分の弾7

自分の弾8

自分の弾9

自分の弾999


の移動する様子がもっとはっきりわかるようになるんだ


jibunnotama[i].x = jibunnotama[i].x +10💖💖;


の部分を


jibunnotama[i].x = jibunnotama[i].x +1💖;


に変更したプログラムはこちらです

👇

#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle;

int life;

};

//👆🌞Characterの構造体宣言です




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}




SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です 裏画面に画像を描きます


struct Character jibunnohikouki;

//👆🌞jibunnohikoukiの構造体変数宣言です


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


jibunnohikouki.graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");

//👆🌞構造体変数jibunnohikoukiのメンバ変数の初期化を行っています

//👆😋飛行機😋のデータをとりあつかっています



struct Character jibunnotama[1000];


for (int i = 0; i < 1000; i = i + 1) {


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


jibunnotama[i].graphichandle = LoadGraph("画像データ\\自分の弾.bmp");


jibunnotama[i].life = 0;


}


int tsix;//🌞🌞🌞tsixには発射される弾の最初の位置のx座標が代入されることになります tは弾、sは最初、iは位置、xはx座標を表しています



int count = 0;//🌞🌞🌞ここでint型の変数countを作製し0で初期化しました




while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);




int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);


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

if (key & PAD_INPUT_DOWN) jibunnohikouki.y = jibunnohikouki.y + 4;

if (key & PAD_INPUT_LEFT) jibunnohikouki.x = jibunnohikouki.x - 4;

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




DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle, TRUE);


//👆飛行機の画像を描きます





if ((key & PAD_INPUT_A) && (count == 0)) {


for (int i = 0; i < 1000; i = i + 1) {


if (jibunnotama[i].life == 0) {


jibunnotama[i].x = jibunnohikouki.x + 35;


tsix = jibunnotama[i].x;


jibunnotama[i].y = jibunnohikouki.y + 20;


jibunnotama[i].life = 1;


break;


}


}


count = 1;//👈🌞🌞🌞改良点はここですね


}



if (count > 0) { count = count - 1; }//👈🌞🌞🌞改良点はここですね




for (int i = 0; i < 1000; i = i + 1) {


if (jibunnotama[i].life == 1) {


DrawGraph(jibunnotama[i].x, jibunnotama[i].y, jibunnotama[i].graphichandle, TRUE);


jibunnotama[i].x = jibunnotama[i].x + 1;


if (jibunnotama[i].x - tsix > 640)

//🌞🌞🌞発射された弾の位置のx座標が発射されたときの最初の弾の位置のx座標から640を超えて離れると条件式jibunnotama[i].x - tsix > 640は真の値1をとることになります

//🌞🌞🌞🌞🌞👆 tsixにはZボタンが押されたときの自分の弾のいる位置のx座標を記憶していたのでjibunnotama[i].xがZボタンが押されたときの自分の弾のいる位置から640ドット離れた時jibunnotama[i].x -tsix> 640は真の値1を持つことになります

jibunnotama[i].life = 0;


}


}



ScreenFlip();


ClearDrawScreen();


};



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


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


}



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

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

👇


https://www.youtube.com/watch?v=-V8zl_1_MmQ


solarplexuss「うわあ


発射される弾の数がものすごいね」


マックス「ただ ちょっと弾の発射される速度がおそいよなあ」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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