上下左右に敵の飛行機が移動するようにしてみよう 敵の飛行機の移動パターンを2次元配列で管理してみよう

solarplexuss「なるほど


敵の飛行機が動かない場合の仕組みは


そうなっているのか」



ソーラー「そうだね


他にも


いろんなパターンで


敵の飛行機をうごかすことができるんだ


今度は


上下左右に敵の飛行機が移動するようにしてみよう


いや そうだ!


下上左右にしよう」


solarplexuss「おおう 今度は上下左右に移動😊 グレードアップだね


と思ったら


下上左右?」


ソーラー「具体的には


敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す




敵の飛行機が


それをずっと繰り返すようにしようよ」



マックス「な〜んだ


簡単そう〜だな・・・か???


これは・・・


一体どうやるんだ」



ソーラー「


敵の飛行機の移動パターンは


繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット


で表されます




敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す場合



敵の飛行機の移動パターンは



第一項を繰り返し回数

第二項をx軸方向の移動ドット

第三項をy軸方向の移動ドット


とすると


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


で表されます


{2,0,4}


だと


x軸方向に0ドット移動

y軸方向に4ドット移動

2回繰り返すことを表しています


ただし


ゲーム画面の座標設定では


以下のようにxy軸が設定されているので

👇


https://solalion.blogspot.com/2022/01/blog-post_17.html


y軸方向に4ドット移動すると


ゲーム画面の下の方に


敵の飛行機が移動することになります」


マックス「ほうほう


ゲーム画面の座標設定では


y軸方向に4ドット移動すると


ゲーム画面の下の方に


敵の飛行機が移動することになるか


忘れやすいポイントだな


うむう



{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}





敵の飛行機の移動パターンの


繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット



{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


で表現することにより


よりわかりやすく具体的に把握したわけだ」


ソーラー「この移動パターン


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


に沿って


敵の飛行機を


うごかしたいんだ」


solarplexuss「敵の飛行機の移動パターンが


はっきりわかってないと


どう敵の飛行機を動かしたらいいかわかりにくいからね」


ソーラー「とりあえず


この


敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}



プログラムで取り扱うために


敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}



2次元配列を用いて管理します」


solarplexuss「なんで


ここで2次元配列???」


ソーラー「


例えば


敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}





int tekinohikoukiidoupattern[4][3]={{2,0,4},{2,0,-4},{3,-4,0},{3,4,0}};


を実行して


2次元配列tekinohikoukiidoupattern[4][3]を作製し


その配列変数に


tekinohikoukiidoupattern[0][0]=2💖;


tekinohikoukiidoupattern[0][1]=0;


tekinohikoukiidoupattern[0][2]=4;


//👆🌞ここまで{2💖,0,4}下方向に2💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[1][0]=2💖;


tekinohikoukiidoupattern[1][1]=0;


tekinohikoukiidoupattern[1][2]=-4;


//👆🌞ここまで{2💖,0,-4} 上方向に2💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[2][0]=3💖;


tekinohikoukiidoupattern[2][1]=-4;


tekinohikoukiidoupattern[2][2]=0;


//👆🌞ここまで{3💖,-4,0} 左方向に3💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[3][0]=3💖;


tekinohikoukiidoupattern[3][1]=-4;


tekinohikoukiidoupattern[3][2]=0;



と格納


もしくは直接


int tekinohikoukiidoupattern[4][3];


tekinohikoukiidoupattern[0][0]=2💖;


tekinohikoukiidoupattern[0][1]=0;


tekinohikoukiidoupattern[0][2]=4;


//👆🌞ここまで{2💖,0,4}下方向に2💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[1][0]=2💖;


tekinohikoukiidoupattern[1][1]=0;


tekinohikoukiidoupattern[1][2]=-4;


//👆🌞ここまで{2💖,0,-4} 上方向に2💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[2][0]=3💖;


tekinohikoukiidoupattern[2][1]=-4;


tekinohikoukiidoupattern[2][2]=0;


//👆🌞ここまで{3💖,-4,0} 左方向に3💖回4ドット移動パターンを配列変数に格納しています


tekinohikoukiidoupattern[3][0]=3💖;


tekinohikoukiidoupattern[3][1]=-4;


tekinohikoukiidoupattern[3][2]=0;


//👆🌞ここまで{3💖,4,0} 右方向に3💖回4ドット移動パターンを配列変数に格納しています



のように


2次元配列tekinohikoukiidoupattern[4][3]を作製し格納することになります


2次元配列tekinohikoukiidoupattern[4][3]に格納しておけば



tekinohikoukiidoupattern[m][n]の


m (0<=m<=3)

n (0<=n<=2)



指定することによって



敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


のうち


好きなデータを取り出すことができるようになるんだ


今のように2次元配列tekinohikoukiidoupattern[4][3]に


敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


______________________


{2,0,4}👈0行

{2,0,-4} 👈1行

{3,-4,0} 👈2行

{3,4,0} 👈3行

👆👆👆

0列1列2列

______________________


を格納した場合


tekinohikoukiidoupattern[m][n]


(mの値は行

nの値は列

に対応しています)



mの値が0(0行)


nの値が0(0列)



tekinohikoukiidoupattern[0][0]


には


{2,0,4} 👈0行


0列


2が代入されることになります



mの値が1(1行)


nの値が0(0列)



tekinohikoukiidoupattern[1][0]


には


{2,0,-4} 👈1行


0列

2



代入されることになります



mの値が2(2行)


nの値が2(2列)



tekinohikoukiidoupattern[2][2]


には


{3,-4,0} 👈2行


2列

0



代入されることになります



int tekinohikoukiidoupattern[4][3]={{2,0,4},{2,0,-4},{3,-4,0},{3,4,0}};


を実行して


2次元配列tekinohikoukiidoupattern[4][3]に


敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


を格納した場合


すなわち


tekinohikoukiidoupattern[0][0]=2;


tekinohikoukiidoupattern[0][1]=0;


tekinohikoukiidoupattern[0][2]=4;


tekinohikoukiidoupattern[1][0]=2;


tekinohikoukiidoupattern[1][1]=0;


tekinohikoukiidoupattern[1][2]=-4;


tekinohikoukiidoupattern[2][0]=3;


tekinohikoukiidoupattern[2][1]=4;


tekinohikoukiidoupattern[2][2]=0;


tekinohikoukiidoupattern[3][0]=3;


tekinohikoukiidoupattern[3][1]=-4;


tekinohikoukiidoupattern[3][2]=0;


のように


2次元配列tekinohikoukiidoupattern[4][3]に



敵の飛行機の移動パターンの

繰り返し回数

x軸方向の移動ドット

y軸方向の移動ドット

のデータ


{2,0,4}

{2,0,-4}

{3,-4,0}

{3,4,0}


を格納した場合は図示すると以下のような状態になっています

👇


https://solalion.blogspot.com/2022/01/blog-post_15.html



solarplexuss「ふーむ tekinohikoukiidoupattern[m][n]の


mが行でnが列なんだね


mもnも0からはじまるんだね」



ソーラー「そうなんだ


敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す


また元に戻って


敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す



それをずっと繰り返すということは



具体的には




tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[0][1](=0) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[0][2](=4) ;




tekinohikoukiidoupattern[0][0](=2)回繰り返し


そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[1][1](=0) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[1][2](=-4) ;




tekinohikoukiidoupattern[1][0](=2)回繰り返し



そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[2][1](=-4) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[2][2](=0) ;




tekinohikoukiidoupattern[2][0](=3)回繰り返し



そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[3][1](=4) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[3][2](=0) ;




tekinohikoukiidoupattern[3][0](=3)回繰り返し


また元に戻って


tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[0][1](=0) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[0][2](=4) ;




tekinohikoukiidoupattern[0][0](=2)回繰り返し


そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[1][1](=0) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[1][2](=-4) ;




tekinohikoukiidoupattern[1][0](=2)回繰り返し



そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[2][1](=-4) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[2][2](=0) ;




tekinohikoukiidoupattern[2][0](=3)回繰り返し



そのあと



tekinohikouki[i].x= tekinohikouki[i].x+ tekinohikoukiidoupattern[3][1](=4) ;


tekinohikouki[i].y= tekinohikouki[i].y+ tekinohikoukiidoupattern[3][2](=0) ;




tekinohikoukiidoupattern[3][0](=3)回繰り返す



それをずっと繰り返すということなんだ


ここでの


             😊ポイントは2つあるんだよ😊


🍑1つ目のポイント🍑は


ある特定の敵の移動パターン


の繰り返し実行が終わったら


つまり


繰り返し回数が0になったら


次の敵の移動パターンに移るところです


{2🍑,0,4}の移動パターンを2回繰り返すと

{2,0,-4}の移動パターンに移り(繰り返し回数は2🍑回です)


{2🍑,0,-4}の移動パターンを2回繰り返すと

{3,-4,0}の移動パターンに移り(繰り返し回数は2🍑回です)


{3🍑,-4,0} の移動パターンを3回繰り返すと

{3,4,0} の移動パターンに移り(繰り返し回数は3🍑回です)


{3🍑,4,0} の移動パターンを3回繰り返すと


(繰り返し回数は3🍑回です)


また

{2🍑,4,0} の移動パターンに戻っています




🍎2つ目のポイント🍎は


全部のパターンを実行し終えたら


また最初から


全部のパターンが実行されるところなんです


🍑1つ目のポイント🍑は


もっと具体的には


繰り返し回数をあらわす⭐︎m行0列⭐︎の値を表す


tekinohikoukiidoupattern[m][0]の値を


ある変数に格納しておいて


繰り返しが行われるごとに


変数に格納された値を減らしていき


変数に格納された値が0になったら


m=m+1;


を実行して


mの値を1増やして


繰り返し回数をあらわす⭐︎m+1行0列⭐︎の値を表す


tekinohikoukiidoupattern[m+1][0]の値を


ある変数に格納しておいて


繰り返しが行われるごとに


変数に格納された値を減らしていき


変数に格納された値が0になったら


m=m+1;


を実行して


mの値を1増やして


次の行の敵の移動パターンに移るということであらわされ



🍎2つ目のポイント🍎は


具体的には


繰り返し回数をあらわす⭐︎3行0列⭐︎の値を表す


tekinohikoukiidoupattern[3][0]の値を


ある変数に格納しておいて


繰り返しが行われるごとに


変数に格納された値を減らしていき


変数に格納された値が0になったら


また


m=0;


を実行して


mの値を0


に戻すということで表現できます



だから



敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す


また元に戻って


敵の飛行機が


下方向に4ドット移動を2回繰り返し


そのあと


上方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す

それをずっと繰り返す


それをプログラムで表現するには


まず


int m = 0;


int repeat = tekinohikoukiidoupattern[0][0];


を実行して


int型の変数


m

repeat


を作製し初期化します


tekinohikoukiidoupattern[m][n] の


m

n

0

0

の場合


下方向に4ドット移動を2回繰り返す


一番最初の移動パターン{2🍑,0,4}


の2が


tekinohikoukiidoupattern[0][0]


に代入されています


その


tekinohikoukiidoupattern[0][0]



repeat


に代入することになります


つまり


repeatには移動パターンの繰り返し回数が代入されることになります


敵の飛行機が


1回移動するたびに


repeat = repeat-1;


を実行して


repeatに格納されている値を1減らします


repeatに格納されている値が0になったら


m=m+1;


を実行して


mの値を1増加させ


上方向に4ドット移動を2回繰り返すときの2が代入されている


tekinohikoukiidoupattern[m][0] (すなわちtekinohikoukiidoupattern[1][0])



repeatに代入することになります


敵の飛行機が


1回移動するたびに


repeat = repeat-1;


を実行して


repeatに格納されている値を1減らします


repeatに格納されている値が0になったら


m=m+1;


を実行して


mの値を1増加させ



左方向に4ドット移動を3回繰り返すときの3が代入されている


tekinohikoukiidoupattern[m][0] (すなわちtekinohikoukiidoupattern[2][0])



repeatに代入することになります



敵の飛行機が


1回移動するたびに


repeat = repeat-1;


を実行して


repeatに格納されている値を1減らします


repeatに格納されている値が0になったら


m=m+1;


を実行して


mの値を1増加させ


mの値に3を代入することにより



右方向に4ドット移動を3回繰り返すときの3が代入されている


tekinohikoukiidoupattern[m][0] (すなわちtekinohikoukiidoupattern[3][0])



repeatに代入することになります


敵の飛行機が


1回移動するたびに


repeat = repeat-1;


を実行して


repeatに格納されている値を1減らします


repeatに格納されている値が0になったとき




mの値が行の最大数3だったなら


mの値を


0に戻して


再び


一番最初の移動パターンの


下方向に4ドット移動を2回繰り返すときの2が代入されている


tekinohikoukiidoupattern[m][0] (すなわちtekinohikoukiidoupattern[0][0])



repeat


に代入することにします



つまり以下のような感じで命令文を記述することにより


👇


int m = 0;


int repeat = tekinohikoukiidoupattern[0][0];

//👆🌞🌞🌞 repeatに最初のパターンの繰り返し回数2を代入します


if (repeat > 0) {


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


tekinohikouki[i].x = tekinohikouki[i].x + tekinohikoukiidoupattern[m][1];


tekinohikouki[i].y = tekinohikouki[i].y + tekinohikoukiidoupattern[m][2];

}



}


repeat = repeat - 1;

}


if (repeat == 0) {


if (m < 3) {


m = m + 1;


repeat = tekinohikoukiidoupattern[m][0];


}

}



if (repeat == 0) {


if (m == 3) {

m = 0;

repeat = tekinohikoukiidoupattern[m][0];


}


}


👆


mの値が再び0になれば


敵の飛行機が


上方向に4ドット移動を2回繰り返し


そのあと


下方向に4ドット移動を2回繰り返す


そのあと


左方向に4ドット移動を3回繰り返し


そのあと


右方向に4ドット移動を3回繰り返す


この1連のパターンを


再び


繰り返し実行することになります


それでは


敵の飛行機が


下上左右に移動するプログラムはこちらです


👇


#include "DxLib.h"


struct Character {

int x;

int y;

int graphichandle[7];

int graphicnumber;//👈🌞メンバ変数にgraphicnumber を追加しました

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関数です 裏画面に画像を描きます printfDxで表示される文字も裏画面に描かれることになります



struct Character jibunnohikouki;

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


jibunnohikouki.x = 0;


jibunnohikouki.y = 0;


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


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


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


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


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


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


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


jibunnohikouki.life = 1;//👈🌞🌞🌞ここがポイントです🌞🌞🌞




jibunnohikouki.graphicnumber = 0;

//👆 jibunnohikouki.graphicnumberは😋自分の飛行機😋のアニメーションパターンをとりあつかっています


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

//👆 構造体変数jibunnohikoukiは😋自分の飛行機😋のデータをとりあつかっています



struct Character tekinohikouki[10];

//👆🌞敵の飛行機を10体登場させています


for (int i = 0; i < 10; i++) {


tekinohikouki[i].x = 605;


tekinohikouki[i].y = 35 * i;


tekinohikouki[i].graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機1.8.bmp");


tekinohikouki[i].graphichandle[1] = LoadGraph("画像データ\\赤い敵の飛行機1.3.bmp");


tekinohikouki[i].graphichandle[2] = LoadGraph("画像データ\\赤い敵の飛行機2.3.bmp");


tekinohikouki[i].graphichandle[3] = LoadGraph("画像データ\\赤い敵の飛行機3.3.bmp");


tekinohikouki[i].graphichandle[4] = LoadGraph("画像データ\\赤い敵の飛行機4.3.bmp");


tekinohikouki[i].graphichandle[5] = LoadGraph("画像データ\\赤い敵の飛行機5.3.bmp");


tekinohikouki[i].graphichandle[6] = LoadGraph("画像データ\\赤い敵の飛行機6.5.bmp");




tekinohikouki[i].graphicnumber = 128 * GetRand(6);


//👆 tekinohikouki[i].graphicnumberは😋敵の飛行機😋のアニメーションパターンをとりあつかっています


//👆ここです🌞🌞🌞ここでtekinohikouki[i].graphicnumberにランダムに0,128,256,384,512,640,768の値が代入されることになります




tekinohikouki[i].life = 100;//👈🌞🌞🌞敵の飛行機に自分の弾が100発当たると破壊されるようにしました




}



struct Character jibunnotama[2];

//🌞👆自分の弾を2つ作成しています

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


jibunnotama[i].x = 0;

jibunnotama[i].y = 0;


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


jibunnotama[i].life = 0;


}


struct Character bakuhatunohonoo[10];

//👆🌞構造体変数bakuhatuhonoo[0], bakuhatuhonoo[1]…bakuhatuhonoo[9]を作成し爆発の炎のデータを取り扱います


for (int i = 0; i < 10; i++) {


bakuhatunohonoo[i].x = 0;


bakuhatunohonoo[i].y = 0;


bakuhatunohonoo[i].graphichandle[0] = LoadGraph("画像データ\\爆発の炎.bmp");


bakuhatunohonoo[i].graphichandle[1] = LoadGraph("画像データ\\爆発の炎1.bmp");


bakuhatunohonoo[i].graphichandle[2] = LoadGraph("画像データ\\爆発の炎2.bmp");


bakuhatunohonoo[i].graphichandle[3] = LoadGraph("画像データ\\爆発の炎3.bmp");


bakuhatunohonoo[i].graphichandle[4] = LoadGraph("画像データ\\爆発の炎4.bmp");


bakuhatunohonoo[i].graphichandle[5] = LoadGraph("画像データ\\爆発の炎5.bmp");


bakuhatunohonoo[i].graphichandle[6] = LoadGraph("画像データ\\爆発の炎6.bmp");



bakuhatunohonoo[i].life = 0;//🌞🌞🌞 bakuhatunohonoo.lifeを初期化しています



bakuhatunohonoo[i].graphicnumber = 0; //🌞🌞🌞爆発の炎ごとにgraphicnumberを用意して初期化しています


}



struct Character tekinohikoukiwooouhikari;


tekinohikoukiwooouhikari.x = 0;


tekinohikoukiwooouhikari.y = 0;


tekinohikoukiwooouhikari.graphichandle[0] = LoadGraph("画像データ\\赤い敵の飛行機を覆う光.bmp");




tekinohikoukiwooouhikari.life = 0;




struct Character jibunnohikoukinobakuhatunohonoo;

//👆🌞構造体変数jibunnohikoukinobakuhatunohonooを作成し自分の飛行機の爆発の炎のデータを取り扱います




jibunnohikoukinobakuhatunohonoo.x = 0;


jibunnohikoukinobakuhatunohonoo.y = 0;


jibunnohikoukinobakuhatunohonoo.graphichandle[0] = LoadGraph("画像データ\\自分の飛行機の爆発の炎.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[1] = LoadGraph("画像データ\\自分の飛行機の爆発の炎1.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[2] = LoadGraph("画像データ\\自分の飛行機の爆発の炎2.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[3] = LoadGraph("画像データ\\自分の飛行機の爆発の炎3.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[4] = LoadGraph("画像データ\\自分の飛行機の爆発の炎4.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[5] = LoadGraph("画像データ\\自分の飛行機の爆発の炎5.bmp");


jibunnohikoukinobakuhatunohonoo.graphichandle[6] = LoadGraph("画像データ\\自分の飛行機の爆発の炎6.bmp");



jibunnohikoukinobakuhatunohonoo.life = 0;//🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeを初期化しています



jibunnohikoukinobakuhatunohonoo.graphicnumber = 0; //🌞🌞🌞自分の飛行機の爆発の炎のgraphicnumberを用意して初期化しています



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



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



int tekinohikoukiidoupattern[4][3] = { {400,0,1},{400,0,-1},{400,-1,0},{400,1,0} };


int m = 0;


int repeat = tekinohikoukiidoupattern[0][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 (jibunnohikouki.life == 1) {


if (4 <= jibunnohikouki.y && jibunnohikouki.y <= 460) {

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

}



if (0 <= jibunnohikouki.y && jibunnohikouki.y <= 456) {


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

}


if (4 <= jibunnohikouki.x && jibunnohikouki.x <= 605) {


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

}


if (0 <= jibunnohikouki.x && jibunnohikouki.x <= 601) {


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

}


}


if (jibunnohikouki.life == 1) {


DrawGraph(jibunnohikouki.x, jibunnohikouki.y, jibunnohikouki.graphichandle[(jibunnohikouki.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞🌞 jibunnohikouki.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞


jibunnohikouki.graphicnumber = jibunnohikouki.graphicnumber + 1;


}


//👆 jibunnohikouki.lifeに格納されている値が1なら自分の飛行機の画像を描きます

//👆jibunnohikouki.lifeに格納されている値が0なら自分の飛行機の画像が描かれることはありません


if (repeat > 0) {


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


tekinohikouki[i].x = tekinohikouki[i].x + tekinohikoukiidoupattern[m][1];


tekinohikouki[i].y = tekinohikouki[i].y + tekinohikoukiidoupattern[m][2];

}



}


repeat = repeat - 1;

}


if (repeat == 0) {


if (m < 3) {


m = m + 1;


repeat = tekinohikoukiidoupattern[m][0];


}

}



if (repeat == 0) {


if (m == 3) {

m = 0;

repeat = tekinohikoukiidoupattern[m][0];


}


}




for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {



DrawGraph(tekinohikouki[i].x, tekinohikouki[i].y, tekinohikouki[i].graphichandle[(tekinohikouki[i].graphicnumber) / 128 % 7], TRUE);


tekinohikouki[i].graphicnumber = tekinohikouki[i].graphicnumber + 1;


//🌞🌞🌞 (tekinohikouki[i].graphicnumber)を128で割っているので通常のアニメーション速度の128分の1の速度で画像が切り替わります

//👆🌞🌞🌞ここです すでにtekinohikouki[i].graphicnumberには0,128,256,384,512,640,768の値のうちの1つが代入されているので敵の飛行機, 敵の飛行機1・・・敵の飛行機9はそれぞれ異なるタイミングでアニメーションすることになります


}


}




for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


if ((jibunnohikouki.x < tekinohikouki[i].x + 35) && (tekinohikouki[i].x < jibunnohikouki.x + 35) && (jibunnohikouki.y + 7 < tekinohikouki[i].y + 20) && (tekinohikouki[i].y < jibunnohikouki.y + 20)) {


jibunnohikouki.life = 0;


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にランダムに異なる値を代入することにより爆発する時間をランダムに変化させています




jibunnohikoukinobakuhatunohonoo.x = jibunnohikouki.x;


jibunnohikoukinobakuhatunohonoo.y = jibunnohikouki.y;


jibunnohikoukinobakuhatunohonoo.life = 128 + 128 * GetRand(9); //🌞🌞🌞 jibunnohikoukinobakuhatunohonoo.lifeに0以上の値を代入しました jibunnohikoukinobakuhatunohonoo.lifeにランダムに異なる値を代入することにより自分の飛行機が爆発する時間をランダムに変化させています



}

}


}


for (int i = 0; i < 10; i++) {


if (tekinohikouki[i].life > 0) {


for (int j = 0; j < 2; j++) {


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].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にランダムに異なる値を代入することにより爆発する時間をランダムに変化させています


}

}


}

}


}



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 (jibunnohikoukinobakuhatunohonoo.life > 0) {


DrawGraph(jibunnohikoukinobakuhatunohonoo.x, jibunnohikoukinobakuhatunohonoo.y, jibunnohikoukinobakuhatunohonoo.graphichandle[(jibunnohikoukinobakuhatunohonoo.graphicnumber / 32) % 7], TRUE);


//👆🌞🌞🌞 🌞🌞🌞 🌞🌞 jibunnohikoukinobakuhatunohonoo.graphicnumberを32で割っているので32分の1のアニメーション速度です🌞🌞🌞 🌞🌞🌞 🌞🌞🌞

jibunnohikoukinobakuhatunohonoo.graphicnumber = jibunnohikoukinobakuhatunohonoo.graphicnumber + 1;

//👆🌞🌞🌞自分の飛行機の爆発の炎がアニメーションするよう設定が行われています



jibunnohikoukinobakuhatunohonoo.life = jibunnohikoukinobakuhatunohonoo.life - 1;



}


//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が1以上なら自分の飛行機の爆発の炎の画像を描きます

//👆 jibunnohikoukinobakuhatunohonoo.lifeに格納されている値が0なら自分の飛行機の爆発の炎の画像が描かれることはありません





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


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


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


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


tsix = jibunnotama[i].x;


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


jibunnotama[i].life = 1;


break;


}


}


count = 10;

}



if (count > 0) { count = count - 1; }




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


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

//🌞🌞🌞 jibunnotama[i].lifeに1が代入されていると自分の弾がゲーム画面に表示されることになります jibunnotama[i].lifeに0が代入されていると自分の弾がゲーム画面に表示されることはありません

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


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


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; // プログラムを終了します


}

👇

https://youtu.be/i_VG60eNi4A


solarplexuss「おもしろ〜い 敵の飛行機が同じ場所を


繰り返し移動しているぅ」


マックス「


なんとも滑らかに動くものだな


ここまでできるようになるとは・・・


ほんと いいものだな



solarplexuss「あれ?


このプログラム・・・


int tekinohikoukiidoupattern[4][3]={{2,0,4},{2,0,-4},{3,-4,0},{3,4,0}};


でなくて


int tekinohikoukiidoupattern[4][3] = { {400,0,1},{400,0,-1},{400,-1,0},{400,1,0} };



実行されてない?


これだと


敵の飛行機が


下方向に1ドット移動を400回繰り返し


そのあと


上方向に1ドット移動を400回繰り返す


そのあと


左方向に1ドット移動を400回繰り返し


そのあと


右方向に1ドット移動を400回繰り返す


これが


ずっと繰り返されていることになるよ


まあ それでもいいけどお」

















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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