先日の続き。
円軌道で描きながら、対象角度(まぁ自分だけど)に誘導する攻撃が出来たのだけど、
それとは別にベジェ曲線の軌道の攻撃を追加。
敵の誘導ショットの軌道、これでいいかなぁ
— 水星のそらのちゃん💫 (@Oo_sorano_oO) 2022年11月29日
ずっと軌道計算してるけど、誘導強すぎるからこういう軌道にならないはずだし、そろそろ飽きてきた pic.twitter.com/z8n5559DHs
ハート形に誘導しちゃう pic.twitter.com/oWhFnmY9Nz
— 水星のそらのちゃん💫 (@Oo_sorano_oO) 2022年12月1日
ベジェ曲線の誘導できた
— 水星のそらのちゃん💫 (@Oo_sorano_oO) 2022年12月1日
ちゃんと目的地まで着弾したら、事前の角度のまま直進するようにしたし完璧ィ❣
ktさんサンキュー pic.twitter.com/JNYN29uZ43
調べたらわずか10行ぐらいで実装できてしまった。
しかもちゃんと誘導するし…
えいやーで作る前に、しっかり調べておけば数時間で済んだのに、何日も掛けてしまった。
角度ちゃんと調整すると、頑張って描いた円軌道のコードとほぼ同じ軌道になってくれる。
ただ円軌道の方はリアルタイムでしつこく誘導するので、これはこれで残しておこう。
調べた結果として、レイシリーズのように、
誘導が終わってもその角度のまま直進するコードのサンプルなんかを置いておこう。
(そのままコピペして使える人がいるように)
---
※ベジェ曲線は0~1を基準に対象位置まで移動するので、このコード上では一旦tとして0.01単位にしています
対象位置までで良いならelse以降は不要なので、ifの中身の2行だけ(赤字のとこ)でOK
chara[num].basepx、chara[num].basepyは始点
px1、py1は中間点
target_x、target_yは対象位置
3次曲線なので、2次曲線や4次曲線にするときはpx2とかpy2を作って途中で追加してあげてね
---
double temp_x1, temp_x2, temp_y1, temp_y2;
double t *=0.01;
//目標へ移動中の場合
if (t < 1) {
chara[num].px = (1 - t) * (1 - t) * chara[num].basepx + 2 * (1 - t) * t * px1 + t * t * target_x;
chara[num].py = (1 - t) * (1 - t) * chara[num].basepy + 2 * (1 - t) * t * py1 + t * t * target_y;
}
//対象座標を越えてしまった場合は、直前の角度を求めて移動
else {
t = 0.99;
temp_x1 = (1 - t) * (1 - t) * chara[num].basepx + 2 * (1 - t) * t * px1 + t * t * target_x;
temp_y1 = (1 - t) * (1 - t) * chara[num].basepy + 2 * (1 - t) * t * py1 + t * t * target_y;
t = 1;
temp_x2 = (1 - t) * (1 - t) * chara[num].basepx + 2 * (1 - t) * t * px1 + t * t * target_x;
temp_y2 = (1 - t) * (1 - t) * chara[num].basepy + 2 * (1 - t) * t * py1 + t * t * target_y;
//ここから下は対象までの直前の角度を求めてキャラや移動先を設定してあげてね
chara[num].theta = atan2( (int)(temp_x2 - temp_x1), (int)(temp_y2 - temp_y1));
chara[num].px += cos(chara[num].theta * RADIAN) * chara[num].speed;
chara[num].py += sin(chara[num].theta * RADIAN) * chara[num].speed;
}
---
DXライブラリに↑みたいなものがないのでとりあえず作ったけど、
WindowsのAPIで既にベジェ曲線あるらしいし、この時代、ライブラリに普通に入ってそうな機能
なので、どれぐらいの人に需要があるかは微妙。