画像(logo)

HOME/[C言語DXライブラリ]STGの作り方 目次/二十一日目 ボスの動きを追加

広告

[C言語 DXライブラリ STGの作り方]
二十一日目 ボスの動きを追加

広告

↓発売日:2018年09月22日↓

たった1日で基本が身に付く! C言語 超入門

新品価格
¥2,225から
(2018/10/8 23:10時点)

目次へ戻る

ボスの動きを追加

今回はボスの動きを追加していきます。

浮遊

まずはゆらゆらと空間に浮遊しているような動きを作ってみましょう。

「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」カウント区切りで繰り返す

みたいな動きとなっております。

それでは一つ一つ説明したいと思います。

1・上空から下りてくる

if (gamecount < boss[i].gamecount_point[0] + 260){
	boss[i].y--;
	boss[i].var[1]--;
}

ただ下りてくるだけなのでなんて事ない部分ですが「boss[i].var[1]--」と一見余分な変数もデクリメントしてますね。

これはボスそれぞれが今回の場合は画面中央にいるわけではないので、ボス自身の位置を知るための変数となっております。

2・ゆらゆらと空間に浮遊

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」値を加えているのが確認できますね。

このやり方で自分の好きな位置でゆらゆらさせる事ができます。

3・プレイヤー方向への角度を取得

if (gamecount == boss[i].gamecount_point[1] + 550){
	boss[i].angle = atan2(p1.y, p1.x);							
}

言葉通りです。

プレイヤー狙いショットの時に学んだ「atan2」を使ってプレイヤー方向への角度を取得します。

4・プレイヤー方向へ4ピクセルの移動速度で体当たり

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」カウント分の時間移動させます。

この移動時間は次の戻りの時間双方で調整しないときちんと初期位置に戻ってくれないので注意です。

5・2ピクセルの移動速度で元に戻る

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倍にしてあげます。

これできちんと元の位置に戻る事ができます。

6・ボスの位置を最初の位置に補正

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]」も元に戻してあげます。

7・再びゆらゆら

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;
}

説明はいらないですね。

再びゆらゆらします。

8・以上の動きを「900」カウント区切りで繰り返す

if (gamecount == boss[i].gamecount_point[1] + 900){
	boss[i].gamecount_point[1] += 900;
}

そして以上の動きを繰り返すべくカウントを再設定してあげればラスボスの動きも完成です。

画像(cdxs_21_1)

ラスボス!

ここまでの中間ソースになります。

中間ソース20

次回はいよいよ最終日、敵をゲームの流れにそって配置したいと思います。

次回

最終日 ゲームの流れにそって敵を配置

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓発売日:2016年02月29日↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

新品価格
¥2,462から
(2018/10/8 23:25時点)

↓発売日:2018年06月22日↓

スッキリわかるC言語入門

新品価格
¥2,916から
(2018/10/8 23:15時点)

↓発売日:2018年03月09日↓

C言語本格入門 ~基礎知識からコンピュータの本質まで

新品価格
¥3,218から
(2018/10/8 23:16時点)

↓発売日:2017年06月14日↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2018/10/8 23:17時点)

↓発売日:2018年05月21日↓

作って身につく C言語入門

新品価格
¥2,462から
(2018/10/8 23:18時点)

↓発売日:2017年12月07日↓

新・標準プログラマーズライブラリ C言語 ポインタ完全制覇

新品価格
¥2,678から
(2018/10/8 23:19時点)

↓発売日:2017年02月08日↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2018/10/8 23:20時点)

↓発売日:2017年09月26日↓

かんたん C言語 [改訂2版] (プログラミングの教科書)

新品価格
¥2,916から
(2018/10/8 23:22時点)