ボスの実装 ~その1~
さて、尻尾の多関節アルゴリズムも出来ていよいよ実装と行きたいところですが、その前にやる事があります。
ボスの絵を描いていませんでした。
ボスは画面の半分近くある巨大な敵キャラとして扱います。
が、敵キャラとしての当たり判定はコアの部分だけにする予定です。
敵キャラとの当たり判定は円の接触判定で行っているので、複雑なボスの形に対応できません。
また、自機の攻撃が有効なのはコアの部分だけです。
そこで、ボスのコア以外の部分は背景として当たり判定を作ることにしました。
ボスは尻尾以外は動かないので、背景として処理する事が出来ると考えたわけです。

30分くらいかけて気合で描きました。
ぷよぷよも含めてこんなに真剣に描いたのは初めてです(笑)
ちなみにマウスでフリーハンドです(汗)
描いた絵を、Pixia上で背景に重ねてみて、正確な位置を決め、それに合わせて背景の当たり判定データを書いてゆきます。
さて、位置も決まったので、次回は実際のゲームに実装して多関節の尻尾無しで登場させてみましょう。
さて、尻尾の多関節アルゴリズムも出来ていよいよ実装と行きたいところですが、その前にやる事があります。
ボスの絵を描いていませんでした。
ボスは画面の半分近くある巨大な敵キャラとして扱います。
が、敵キャラとしての当たり判定はコアの部分だけにする予定です。
敵キャラとの当たり判定は円の接触判定で行っているので、複雑なボスの形に対応できません。
また、自機の攻撃が有効なのはコアの部分だけです。
そこで、ボスのコア以外の部分は背景として当たり判定を作ることにしました。
ボスは尻尾以外は動かないので、背景として処理する事が出来ると考えたわけです。
30分くらいかけて気合で描きました。
ぷよぷよも含めてこんなに真剣に描いたのは初めてです(笑)
ちなみにマウスでフリーハンドです(汗)
描いた絵を、Pixia上で背景に重ねてみて、正確な位置を決め、それに合わせて背景の当たり判定データを書いてゆきます。
さて、位置も決まったので、次回は実際のゲームに実装して多関節の尻尾無しで登場させてみましょう。
多関節アルゴリズム ~その2~
お久しぶりです(汗)
ちゃんと生きていますよ~。
だいぶ苦労しましたが、かなり当初の理想に近い動きをするアルゴリズムになってきました。

鞭のようにしなりながら動きます。
簡単に解説しときますね。
今回僕が思いついたのは上昇方向のエネルギーを関節から関節へ伝えてゆく方法です。
まず、各関節は上昇方向のエネルギーを変数として持っています。
で、その値が0より大きければ上昇方向に関節を曲げます。
また、その値が0で、かつ地面のラインより高い位置に座標があれば落下方向に関節を曲げます。
これが基本となるアルゴリズムです。
プログラムがスタートすると、一番付け根側の関節にエネルギー値が与えられます。
アルゴリズムに従って、一番付け根側の関節は上昇方向に曲がり始めます。
このとき1回上昇させる毎にエネルギーは減少します。
で、あらかじめ設定した限界角度まで曲がると、ひとつ末端側の関節にエネルギーを渡します。
すると、今度は隣の関節が上昇を始め、エネルギーの無くなった付け根側の関節は落下し始めます。
これをエネルギーがなくなるまで繰り返すわけです。
これで、波のように関節をエネルギーが伝わり、うねる様な動きが実現できます。
あとは、いくつかの値を変えて理想に近づくように調整します。
ポイントになる値は、上昇・下降の速度、上昇・下降それぞれの限界角度、最初に与えるエネルギーの大きさの5つです。
文章にすると簡単ですが、この方法を思いつくのと、実際に動くプログラムにするのに予想以上に時間がかかってしまいました。
まだまだヒヨッコですなあ・・・。
多関節プログラムを作っている初心者の人には参考になるかも知れないので、実行ファイルをソーステキスト同梱でアップしておきます。
http://multip.net/view/G1IMbae9VU
プログラムを終了するにはESCキーを押して、その後何かキーを押してください。
とりあえず骨組みを作って、テスト中に発生する問題をそのつど場当たり的に解決するコードを追加して行ったので、ソースはかなり汚いと思うし非効率かと思います。
まず、動くものを目指したので勘弁してください。
これから最適化と動きの微調整をして、本編に移植します。
前の方の記事で三角関数のむやみな使用を否定しまくっておいてアレですが、三角関数使いまくっているので、お世辞にも軽いアルゴリズムとは言えないでしょう(笑)
まあ、多関節は各関節間の距離を半径とする円運動ですから、その座標を得るために三角関数は必須だったってことで・・・。
お久しぶりです(汗)
ちゃんと生きていますよ~。
だいぶ苦労しましたが、かなり当初の理想に近い動きをするアルゴリズムになってきました。
鞭のようにしなりながら動きます。
簡単に解説しときますね。
今回僕が思いついたのは上昇方向のエネルギーを関節から関節へ伝えてゆく方法です。
まず、各関節は上昇方向のエネルギーを変数として持っています。
で、その値が0より大きければ上昇方向に関節を曲げます。
また、その値が0で、かつ地面のラインより高い位置に座標があれば落下方向に関節を曲げます。
これが基本となるアルゴリズムです。
プログラムがスタートすると、一番付け根側の関節にエネルギー値が与えられます。
アルゴリズムに従って、一番付け根側の関節は上昇方向に曲がり始めます。
このとき1回上昇させる毎にエネルギーは減少します。
で、あらかじめ設定した限界角度まで曲がると、ひとつ末端側の関節にエネルギーを渡します。
すると、今度は隣の関節が上昇を始め、エネルギーの無くなった付け根側の関節は落下し始めます。
これをエネルギーがなくなるまで繰り返すわけです。
これで、波のように関節をエネルギーが伝わり、うねる様な動きが実現できます。
あとは、いくつかの値を変えて理想に近づくように調整します。
ポイントになる値は、上昇・下降の速度、上昇・下降それぞれの限界角度、最初に与えるエネルギーの大きさの5つです。
文章にすると簡単ですが、この方法を思いつくのと、実際に動くプログラムにするのに予想以上に時間がかかってしまいました。
まだまだヒヨッコですなあ・・・。
多関節プログラムを作っている初心者の人には参考になるかも知れないので、実行ファイルをソーステキスト同梱でアップしておきます。
http://multip.net/view/G1IMbae9VU
プログラムを終了するにはESCキーを押して、その後何かキーを押してください。
とりあえず骨組みを作って、テスト中に発生する問題をそのつど場当たり的に解決するコードを追加して行ったので、ソースはかなり汚いと思うし非効率かと思います。
まず、動くものを目指したので勘弁してください。
これから最適化と動きの微調整をして、本編に移植します。
前の方の記事で三角関数のむやみな使用を否定しまくっておいてアレですが、三角関数使いまくっているので、お世辞にも軽いアルゴリズムとは言えないでしょう(笑)
まあ、多関節は各関節間の距離を半径とする円運動ですから、その座標を得るために三角関数は必須だったってことで・・・。
多関節アルゴリズム ~その1~
最近はボスの尻尾をどうやって動かすかで頭がいっぱいです。
色々調べたり、思考を重ねて、なんとなくこんな感じで動くかなと言う方法が浮かんだので、開発環境にテスト用の別プロジェクトを立ち上げました。
ここで実験を繰り返し、まともに動くようになったらそのまま本体のプロジェクトに移植するつもりです。
とりあえず関節一つ一つがもつデータを収納する変数を構造体でくくって、配列にして使います。
付け根側から一つとなりの関節との角度を末端に向かって決定していくと、各関節の座標が割り出せます。
関節間の距離を r とすると、各関節の座標は
X = r × cosθ + (ひとつ手前の関節のX座標)
Y = r × sinθ + (ひとつ手前の関節のY座標)
って感じで表せます。
r は変らない値です(今回の関節に伸縮の要素はないため)ので、各関節の位置は角度の値のみによってきまります。
つまりこの角度をどう動かすかが多関節のアルゴリズムとなります。
「多関節」で検索すると、インバース・キネマティクス( I・K )と言う概念がよく出てきます。
関節の末端を任意の位置に移動させる場合に、付け根側からではなく末端側から一つ一つの関節の角度を逆算的に求めてゆく方が、付け根側から計算するより簡単で効率的だという考え方です。
本気で勉強したわけじゃないんで浅い知識ですが、実際に絵を描いてみると感覚的につかめます。
ペダルに足を乗せて自転車を漕ぐ絵を描く事を想像してみてください。
股関節からまず腿の角度を決めて描き、次にひざの角度を決めてスネの部分を描き、足首を経て足を描いたとき、あらかじめ描いておいたペダルに自然な形で足を乗せるのは相当絵を描きなれている人じゃないと非常に難しいです。
やってみれば解ります。
そこで、まずペダルの上に足を描き、股関節の位置を見た上で足首と股関節から同じくらいの距離の「この辺かな」と思う位置に膝の点をとってすね部分を描き、あとは膝から股関節までを腿を描いてつなぎます。
こちらも普段絵を描いていない人には難しいかもしてませんが、股関節側から各関節の角度を決めて描いていくよりは遥かに簡単です。
描いてみれば解ります(笑)。
で、最初はこの I・K の概念を使って実装することを必死で考えたんですが、どうも今回の動きにI・Kは向いてなさそうと言う結論に達しました。
今回の多関節は、末端の位置が重要なのではなく動き方自体が重要だからです。
あくまで尻尾の付け根だけが動きに意思のある部分で、そこに加えられた運動エネルギーが末端方向へ各関節を伝わり、尻尾はしなって鞭のように振られる。
この動きの表現に I・K は向かないと思います。
(もちろん僕の勉強不足の可能性がありますが・・・)
I・Kはシューティングゲームにおいては末端が自機を追ってウネウネ動くような触手などの表現に向いています。
ですので、今回は物理的に自然に見える鞭の動きを目標にして、地道に付け根側から各関節の角度を計算する方法でアルゴリズムを作るつもりです。
もちろん真面目に物理計算をやるつもりはありません(笑)。
あくまで『まるで真面目に物理計算したかのように』見えればOKです。
とりあえず、一つ手前の関節との角度を1フレーム1度ずつ増やしていって、ぐるぐる巻きになる動きをテストで作ってみました。
ここから思った動きになるまでは、相当険しい道になりそうな気がします。

右下が付け根です。
びよーんと丸まってきて・・・

くしゃくしゃに小さくなってしまいます。
角移動量が180度を超えると、こんどは開いて伸びてスタート位置の直線状態へ向かいます。
最近はボスの尻尾をどうやって動かすかで頭がいっぱいです。
色々調べたり、思考を重ねて、なんとなくこんな感じで動くかなと言う方法が浮かんだので、開発環境にテスト用の別プロジェクトを立ち上げました。
ここで実験を繰り返し、まともに動くようになったらそのまま本体のプロジェクトに移植するつもりです。
とりあえず関節一つ一つがもつデータを収納する変数を構造体でくくって、配列にして使います。
付け根側から一つとなりの関節との角度を末端に向かって決定していくと、各関節の座標が割り出せます。
関節間の距離を r とすると、各関節の座標は
X = r × cosθ + (ひとつ手前の関節のX座標)
Y = r × sinθ + (ひとつ手前の関節のY座標)
って感じで表せます。
r は変らない値です(今回の関節に伸縮の要素はないため)ので、各関節の位置は角度の値のみによってきまります。
つまりこの角度をどう動かすかが多関節のアルゴリズムとなります。
「多関節」で検索すると、インバース・キネマティクス( I・K )と言う概念がよく出てきます。
関節の末端を任意の位置に移動させる場合に、付け根側からではなく末端側から一つ一つの関節の角度を逆算的に求めてゆく方が、付け根側から計算するより簡単で効率的だという考え方です。
本気で勉強したわけじゃないんで浅い知識ですが、実際に絵を描いてみると感覚的につかめます。
ペダルに足を乗せて自転車を漕ぐ絵を描く事を想像してみてください。
股関節からまず腿の角度を決めて描き、次にひざの角度を決めてスネの部分を描き、足首を経て足を描いたとき、あらかじめ描いておいたペダルに自然な形で足を乗せるのは相当絵を描きなれている人じゃないと非常に難しいです。
やってみれば解ります。
そこで、まずペダルの上に足を描き、股関節の位置を見た上で足首と股関節から同じくらいの距離の「この辺かな」と思う位置に膝の点をとってすね部分を描き、あとは膝から股関節までを腿を描いてつなぎます。
こちらも普段絵を描いていない人には難しいかもしてませんが、股関節側から各関節の角度を決めて描いていくよりは遥かに簡単です。
描いてみれば解ります(笑)。
で、最初はこの I・K の概念を使って実装することを必死で考えたんですが、どうも今回の動きにI・Kは向いてなさそうと言う結論に達しました。
今回の多関節は、末端の位置が重要なのではなく動き方自体が重要だからです。
あくまで尻尾の付け根だけが動きに意思のある部分で、そこに加えられた運動エネルギーが末端方向へ各関節を伝わり、尻尾はしなって鞭のように振られる。
この動きの表現に I・K は向かないと思います。
(もちろん僕の勉強不足の可能性がありますが・・・)
I・Kはシューティングゲームにおいては末端が自機を追ってウネウネ動くような触手などの表現に向いています。
ですので、今回は物理的に自然に見える鞭の動きを目標にして、地道に付け根側から各関節の角度を計算する方法でアルゴリズムを作るつもりです。
もちろん真面目に物理計算をやるつもりはありません(笑)。
あくまで『まるで真面目に物理計算したかのように』見えればOKです。
とりあえず、一つ手前の関節との角度を1フレーム1度ずつ増やしていって、ぐるぐる巻きになる動きをテストで作ってみました。
ここから思った動きになるまでは、相当険しい道になりそうな気がします。
右下が付け根です。
びよーんと丸まってきて・・・
くしゃくしゃに小さくなってしまいます。
角移動量が180度を超えると、こんどは開いて伸びてスタート位置の直線状態へ向かいます。
誘導ミサイルを撃ってくるロボット2機を動きを調整しながら実装しました。

なかなか激しい攻撃です(汗)
さて、だいぶ予定より遅れましたが、これでボスの手前まで実装が完了しました。
一度現在の状況をアップしておきます。
いつも通りzipファイルなので解凍してからフォルダ内のexeファイルをダブルクリックして遊んでください。
プログラムソースと操作方法はテキストファイルで同梱しています。
http://multip.net/view/63b5cpQ4A0
プログラムは1000行を超えましたが、この程度の規模なら、C言語でもわけわからなくなることはありませんね。
まだまだ、規模の大きいものもいけそうです。
C++移行はずっと先のことですかねえ・・・。
さあ、ボスのプログラム頑張るか!
絵もけっこう大変だし、なにせ多関節風に動く尻尾のアルゴリズムがまったく解りません(笑)
ま、そのぶんチャレンジし甲斐がありますね。
なかなか激しい攻撃です(汗)
さて、だいぶ予定より遅れましたが、これでボスの手前まで実装が完了しました。
一度現在の状況をアップしておきます。
いつも通りzipファイルなので解凍してからフォルダ内のexeファイルをダブルクリックして遊んでください。
プログラムソースと操作方法はテキストファイルで同梱しています。
http://multip.net/view/63b5cpQ4A0
プログラムは1000行を超えましたが、この程度の規模なら、C言語でもわけわからなくなることはありませんね。
まだまだ、規模の大きいものもいけそうです。
C++移行はずっと先のことですかねえ・・・。
さあ、ボスのプログラム頑張るか!
絵もけっこう大変だし、なにせ多関節風に動く尻尾のアルゴリズムがまったく解りません(笑)
ま、そのぶんチャレンジし甲斐がありますね。
- ABOUT
やってやれないことはないっ!たぶん・・・
- カレンダー
04 | 2025/05 | 06 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 最新コメント
[11/09 CALL MY NAME]
[11/09 erin]
[08/18 うずランド]
[07/11 うずランド]
[06/23 うずランド]
- プロフィール
HN:
Call my name
年齢:
50
性別:
男性
誕生日:
1974/05/22
職業:
スロ屋店員
趣味:
いろいろ
自己紹介:
やる気だけはあるつもりです。
はい。
はい。
- ブログ内検索
- カウンター
- アクセス解析