忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

沙羅曼蛇やグラディウスシリーズに出てくるテトランっぽい敵が作ってみたいと思い実装してみました。

アルゴリズムを検索してみてもあまり出てこなかったので忘備録として書いておきます。
考え方としては
1本目、腕の中心から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を2本目の中心座標とします。

2本目、1本目で計算した中心座標から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を3本目の中心座標とします。

3本目、2本目で計算した中心座標から決めた角度の腕の長さの円を描ける座標計算をします。その計算した座標を4本目の中心座標とします。
以下腕の長さだけ繰り返し。
要は普通に多関節の腕を作る感じです。
このまま回転させてもファンタジーゾーンのウインクロンみたいな感じで腕は真っすぐのままなのですが、ここで各腕に回転させる角度を一定の間隔で少しづつずらしてプラスするとテトランのようにウネウネする感じで回転してくれます。


ソースだとこんな感じ。
中心の腕が親、続く腕が子というイメージです。
**************************************************************
        Vector3 pos1 = transform.position;
//1本目の計算
        pos[0] = transform.GetChild(0).position;
        pos[0].x = pos1.x;//腕の中心座標
        pos[0].y = pos1.y;//腕の中心座標
        pos[0].z = -0.1f;
        rad[0] += 0.05f;
        ds[0] = 0.4f;
        ux[0] = Mathf.Cos(rad[0]) * ds[0] + pos[0].x;//次の腕の中心座標
        uy[0] = Mathf.Sin(rad[0]) * ds[0] + pos[0].y;//次の腕の中心座標
        transform.GetChild(0).rotation = Quaternion.Euler(0, 0, (rad[0] * Mathf.Rad2Deg));//回転表示
        transform.GetChild(0).position = pos[0];
//2本目の計算
        pos[1] = transform.GetChild(1).position;
        pos[1].x = ux[0];//腕の中心座標
        pos[1].y = uy[0];//腕の中心座標
        pos[1].z = -0.2f;
        rad[1] += 0.05f;
        ds[1] = 0.4f;
        ux[1] = Mathf.Cos(rad[1]) * ds[1] + pos[1].x;
        uy[1] = Mathf.Sin(rad[1]) * ds[1] + pos[1].y;
        transform.GetChild(1).rotation = Quaternion.Euler(0, 0, (rad[1] * Mathf.Rad2Deg));//回転表示
        transform.GetChild(1).position = pos[1];
//3本目の計算
        pos[2] = transform.GetChild(2).position;
        pos[2].x = ux[1];//腕の中心座標
        pos[2].y = uy[1];//腕の中心座標
        pos[2].z = -0.3f;
        rad[2] += 0.05f;
        ds[2] = 0.4f;
        ux[2] = Mathf.Cos(rad[2]) * ds[2] + pos[2].x;//次の腕の中心座標
        uy[2] = Mathf.Sin(rad[2]) * ds[2] + pos[2].y;//次の腕の中心座標
        transform.GetChild(2).rotation = Quaternion.Euler(0, 0, (rad[2] * Mathf.Rad2Deg));//回転表示
        transform.GetChild(2).position = pos[2];
以下腕の数だけ繰り返し・・・

キーボードQボタンを押すと腕がウネウネする。
        if (Input.GetKey(KeyCode.Q))
        {
            rad[0] += 0.06f;
            rad[1] += 0.04f;
            rad[2] += 0.02f;
            rad[3] += 0.0f;
        }
**************************************************************
初期設定時にradの値を0~6.28の間で設定すれば好きな向きに腕を伸ばす事が出来ます。

上記を纏めるとこんな感じ。
**************************************************************
        float rad_plus = 0.05f
        Vector3 pos1 = transform.position;
        for (int i = 0; i < emax; i++)
        {
            pos[i] = transform.GetChild(0).position;
            if (i == 0)//腕の中心
            {
                pos[i].x = pos1.x;//腕の中心座標
                pos[i].y = pos1.y;//腕の中心座標
            }
            if (i != 0)//中心以外~先端まで
            {
                pos[i].x = ux[i - 1];
                pos[i].y = uy[i - 1];
            }
            pos[i].z = -i;
            
            rad[i] += rad_plus;
            ds[i] = 0.4f;
            ux[i] = Mathf.Cos(rad[i]) * ds[i] + pos[i].x;//次の腕のx座標
            uy[i] = Mathf.Sin(rad[i]) * ds[i] + pos[i].y;//次の腕のy座標
            transform.GetChild(i).rotation = Quaternion.Euler(0, 0, (rad[i] * Mathf.Rad2Deg));
            transform.GetChild(i).position = pos[i];
        }
        if (Input.GetKey(KeyCode.Q))
        {
            for (int i = 0; i < emax; i++)
            {
                float j;
                j = i;
                rad[i] += rad_plus - (j / 100);//腕を回転させる
            }
        }
**************************************************************
腕の画像は下記画像のような中心から外側に向かうような画像にしておかないと上手く腕が繋がりません。
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Twitter
カレンダー
03 2024/04 05
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
最新コメント
[04/20 kt.]
[04/19 うぇむ]
[11/24 kt.]
[11/21 NONAME]
[11/24 kt.]
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]