広告
↓発売日:2018年09月22日↓
新品価格 |
今回はボスの動きを追加していきます。
まずはゆらゆらと空間に浮遊しているような動きを作ってみましょう。
「my_move_boss()」の「case 2」をご覧ください。
if (boss[i].init_flag == 0){ boss[i].x = 0; boss[i].y = 260; boss[i].var[0] = 0; boss[i].gamecount_point[0] = gamecount; boss[i].init_flag = 1; } else{ if (gamecount < boss[i].gamecount_point[0] + 260){ boss[i].y--; } if (gamecount > boss[i].gamecount_point[0] + 260){ boss[i].y = sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; } }
動きの部分だけを抜き出しました。
if (gamecount > boss[i].gamecount_point[0] + 260){ boss[i].y = sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; }
この部分がゆらゆらと空間に浮遊しているような動きを作り出している部分です。
特に難しい事はしておらず、以前学んだ「Sin」の基本的な使い方で「-10 ~ +10」ピクセルの間を行き来させているだけになります。
これでゆらゆらと空間に浮遊しているような動きができました。
「my_move_boss()」の「case 3」についてはただ円形に移動しているだけなので説明は省略させて頂きます。
それではいよいよラスボスの動きを作っていきたいと思います。
「my_move_boss()」の「case 4」になります。
if (boss[i].init_flag == 0){ boss[i].x = boss[i].first_x; boss[i].y = boss[i].first_y; boss[i].angle = 0; boss[i].var[0] = 0; boss[i].var[1] = boss[i].first_y; boss[i].gamecount_point[0] = gamecount; boss[i].gamecount_point[1] = gamecount + 260; boss[i].init_flag = 1; } else{ if (gamecount < boss[i].gamecount_point[0] + 260){ boss[i].y--; boss[i].var[1]--; } if (gamecount > boss[i].gamecount_point[1] && gamecount < boss[i].gamecount_point[1] + 550){ boss[i].y = boss[i].var[1] + sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; } if (gamecount == boss[i].gamecount_point[1] + 550){ boss[i].angle = atan2(p1.y, p1.x); } if (gamecount > boss[i].gamecount_point[1] + 550 && gamecount < boss[i].gamecount_point[1] + 600){ boss[i].x += cos(boss[i].angle) * 4; boss[i].y += sin(boss[i].angle) * 4; } if (gamecount > boss[i].gamecount_point[1] + 600 && gamecount < boss[i].gamecount_point[1] + 700){ boss[i].x -= cos(boss[i].angle) * 2; boss[i].y -= sin(boss[i].angle) * 2; } if (gamecount == boss[i].gamecount_point[1] + 700){ boss[i].x = boss[i].first_x; boss[i].y = boss[i].first_y - 260; boss[i].var[0] = 0; } if (gamecount > boss[i].gamecount_point[1] + 700 && gamecount < boss[i].gamecount_point[1] + 900){ boss[i].y = boss[i].var[1] + sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; } if (gamecount == boss[i].gamecount_point[1] + 900){ boss[i].gamecount_point[1] += 900; } }
毎度毎度の長ったらしくてややこしいですが、言葉で説明すると
1・上空から下りてくる
2・ゆらゆらと空間に浮遊
3・プレイヤー方向への角度を取得
4・プレイヤー方向へ4ピクセルの移動速度で体当たり
5・2ピクセルの移動速度で元に戻る
6・ボスの位置を最初の位置に補正
7・再びゆらゆら
8・以上の動きを「900」カウント区切りで繰り返す
みたいな動きとなっております。
それでは一つ一つ説明したいと思います。
if (gamecount < boss[i].gamecount_point[0] + 260){ boss[i].y--; boss[i].var[1]--; }
ただ下りてくるだけなのでなんて事ない部分ですが「boss[i].var[1]--」と一見余分な変数もデクリメントしてますね。
これはボスそれぞれが今回の場合は画面中央にいるわけではないので、ボス自身の位置を知るための変数となっております。
if (gamecount > boss[i].gamecount_point[1] && gamecount < boss[i].gamecount_point[1] + 550){ boss[i].y = boss[i].var[1] + sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; }
最初にやったゆらゆらですね!
「Sin」を含んだ一行に注目するとさきほどの「boss[i].var[1]」の位置にさらに「Sin」値を加えているのが確認できますね。
このやり方で自分の好きな位置でゆらゆらさせる事ができます。
if (gamecount == boss[i].gamecount_point[1] + 550){ boss[i].angle = atan2(p1.y, p1.x); }
言葉通りです。
プレイヤー狙いショットの時に学んだ「atan2」を使ってプレイヤー方向への角度を取得します。
if (gamecount > boss[i].gamecount_point[1] + 550 && gamecount < boss[i].gamecount_point[1] + 600){ boss[i].x += cos(boss[i].angle) * 4; boss[i].y += sin(boss[i].angle) * 4; }
先ほど取得した角度方向へ4ピクセルの移動速度で体当たりします。
今回は「gamecount」を「50」カウント分の時間移動させます。
この移動時間は次の戻りの時間双方で調整しないときちんと初期位置に戻ってくれないので注意です。
if (gamecount > boss[i].gamecount_point[1] + 600 && gamecount < boss[i].gamecount_point[1] + 700){ boss[i].x -= cos(boss[i].angle) * 2; boss[i].y -= sin(boss[i].angle) * 2; }
戻りの部分です。
行きは4ピクセル、帰りは2ピクセルの移動になるので時間も単純に行きは50カウント、帰りは100カウントと2倍にしてあげます。
これできちんと元の位置に戻る事ができます。
if (gamecount == boss[i].gamecount_point[1] + 700){ boss[i].x = boss[i].first_x; boss[i].y = boss[i].first_y - 260; boss[i].var[0] = 0; }
これはそれぞれの動きが厳密ではないのでそのままだと少しずつボスの位置がずれていってしまうのでそれを防止すべく無理やり元の位置に戻す事にしました。
ついでに「boss[i].var[0]」も元に戻してあげます。
if (gamecount > boss[i].gamecount_point[1] + 700 && gamecount < boss[i].gamecount_point[1] + 900){ boss[i].y = boss[i].var[1] + sin(boss[i].var[0] * (DX_PI / 180)) * 10; boss[i].var[0] += 2; }
説明はいらないですね。
再びゆらゆらします。
if (gamecount == boss[i].gamecount_point[1] + 900){ boss[i].gamecount_point[1] += 900; }
そして以上の動きを繰り返すべくカウントを再設定してあげればラスボスの動きも完成です。
ラスボス!
ここまでの中間ソースになります。
次回はいよいよ最終日、敵をゲームの流れにそって配置したいと思います。
広告
↓発売日:2016年02月29日↓
12歳からはじめる ゼロからのC言語 ゲームプログラミング教室 新品価格 |
↓発売日:2018年06月22日↓
新品価格 |
↓発売日:2018年03月09日↓
新品価格 |
↓発売日:2017年06月14日↓
新品価格 |
↓発売日:2018年05月21日↓
新品価格 |
↓発売日:2017年12月07日↓
新品価格 |
↓発売日:2017年02月08日↓
新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ) 新品価格 |
↓発売日:2017年09月26日↓
新品価格 |