スクリプト仕様の再設計6
# ひたすらチラシの裏.
# 完全にコンテンツとして成り立ってないなぁ.
# きっと最終回.
■ オブジェクトの基本メンバ変数
(単なるソースのコピペなので,内部処理用の変数を含む) class IFiberObject { public: // スクリプト内で直接参照可 CVector m_pos; // 相対座標 CVector m_vel; // 速度 CVector m_acc; // 加速度 CVector m_hpbPosture; // 現在の姿勢(Head/Pitch/Bank) CVector m_vcAbsPosition; // 絶対座標(Move() 内で自動計算される) float m_fAge; // 年齢(誕生;0/死亡;1) float m_fLife; // 体力(最大;1/破壊;0) float m_fTime; // 誕生からの時間(秒) float m_fValueStac[_VALUESTAC_SIZE]; // 変数レジスタ // スクリプト内で直接参照不可 CVector* m_pOrigin; // 原点Objectのポインタ IFiberObject* m_pRefer[6]; // 参照Objectのポインタ WORD m_wReferBirth[6]; // 参照Objectの参照時の転生回数 WORD m_wBirth; // 自分の転生回数 protected: // ベクトルで保存されているパラメータの変換結果を保存 BYTE m_bfReqCalc; // 再計算要求フラグ BYTE m_bfReqFrameCalc; // MoveObject() 内で変更されるパラメータのフラグ CMatrix m_matRotate; // 姿勢の変換行列 float m_fPosAngle; // 相対座標 m_pos の角度 float m_fVelAngle; // 進行方向 m_vel の角度 float m_fAccAngle; // 加速方向 m_acc の角度 // 姿勢制御(姿勢は2次補間によって計算) TInterpolation<CVector> m_ipPosture; // 補間クラス float m_fPostureT; // 補間パラメータ変数 float m_fPostureDT; // dt/dFrame static CVector s_hpbPostureEnd; // 補間先の姿勢(1フレーム内のみ有効) char m_iHeadSync; // hpbPosture.x をシンクロさせる相手 short m_iHeadSyncCount; // hpbPosture.x をシンクロさせている時間 public: // 特殊移動制御(旋回/引力) void (*(funcSubFiber))(IFiberObject* pInst); // 特殊移動計算 functor short m_iSubFiberAge; // 特殊移動の寿命 protected: float m_fDecMax; // 旋回;最大角速度/引力;摩擦力 float m_fDecRate; // 減速率(0-1)(旋回;回転速度/引力;ばね定数) float m_fTarget; // 旋回;目標角度/引力;-1=Strain正は無視,+1=Strain負は無視 float m_fLength; // 長さ(旋回;速度,引力;ばね長さ) char m_iRefIndex; // 目標のm_pReferのインデックス.-1なら対象無し // その他 public: CVector m_vcColor; // 色 CVector m_vcColorAdd; // 色変化 protected: float m_fAgingSpeed; // 老いる速度 int m_iColorCounter; // 色変化時間カウンタ static SSinTable* s_pSinTable; // サインテーブル static float* s_pValueStac; // 現在の変数領域の保存 private: bool m_bAlive; // 生/死 };
■ オブジェクトのメンバ変数を書き換える命令
■ 基本動き
オブジェクトのメンバ変数↓を書き換える命令.
CVector m_pos; // 相対座標 CVector m_vel; // 速度 CVector m_acc; // 加速度
指定方法は,xyz座標系指定,または,xy平面状の曲座標系指定.
曲座標系指定の場合,角度値の意味をoption で指定する.
加速度指定について,時間を指定した場合,指定時間経過後に加速度=0とする.
pos x, y, z // 位置設定 vel vx, vy, vz // 速度設定 acc ax, ay, az, term // 加速度/加速時間設定 mot vx, vy, ax, ay // 速度/加速度設定 posa option, angle, dist // 位置設定(角度指定) vela option, angle, vel // 速度設定(角度指定) acca option, angle, acc, term // 加速度/加速時間設定(角度指定) mota option, angle, vel, acc, term // 速度/加速度設定(角度指定) <<option について>> abs; 下方向を0度とした絶対値 rel; 現在動いている方向を基準とした相対値 pos; 相対座標を基準とした相対値 vel; 速度を基準とした相対値 acc; 加速度をを基準とした相対値 parent; 親オブジェクトの方向を基準とした相対値 aim; ターゲットオブジェクト(プレイヤ)の方向を基準とした相対値 aim0-5; ターゲットオブジェクト(番号指定)の方向を基準とした相対値
これだけだと,「最大旋回速度を指定した旋回」が表現できないので追加
StartPosTurn option, angle, omegamax, decrate, term // 相対位置旋回/旋回最大角/減衰率 StartVelTurn option, angle, omegamax, decrate, term // 旋回/旋回最大角/減衰率 StartAccTurn option, angle, omegamax, decrate, term // 加速度旋回/旋回最大角/減衰率
これだけだと,「引力/斥力による動き」が表現できないので追加
// 接近開始(速度が変化); 対象, バネ長,バネ定数,+1で負値/-1で正値無視, 有効時間 StartApproach option(aim only), spring_length, spring_rate, ignore_strain_flag, term // 引力発生(加速度が変化); 対象, バネ長,バネ定数,減衰定数,+1で負値/-1で正値無視 StartAttraction option(aim only), spring_length, spring_rate, dumper_rate, ignore_strain_flag
■ 姿勢制御
オブジェクトのメンバ変数↓を書き換える命令.
CVector m_hpbPosture; // 現在の姿勢(Head/Pitch/Bank) TInterpolation<CVector> m_ipPosture; // 補間クラス static CVector s_hpbPostureEnd; // 補間先の姿勢(1フレーム内のみ有効)
姿勢は,
1. 現在の姿勢(Head/Pitch/Bank)
2. 指定時間後の姿勢(Head/Pitch/Bank)
3. 始点変化率,終点変化率,変化時間
を指定する事で,プログラム内でFerguson/Coons補間を行い,毎フレーム更新させる.
hpb head, pitch, bank // 姿勢指定 hpbEnd head, pitch, bank // 変化後の姿勢指定 // 姿勢変化の指定(t0/t1 始点/ 終点変化率,term 変化時間)変化率 = 1.0f で速度保存 hpbTerm t1, t2, term
これだけだと,「進行方向等に頭を向ける/敵の方向にゆっくり頭を向ける」が実装できないので追加.
// 頭方向の固定/固定時間(pos;原点方向,vel;進行方向,acc;加速方向,aim;対象の方向) HeadSync option, term // Head角旋回/旋回最大角/減衰率/旋回時間 StartHeadTurn option, angle, omegamax, decrate, term
■ 寿命制御
オブジェクトのメンバ変数↓を書き換える命令.
CVector m_vcColor; // 色 CVector m_vcColorAdd; // 色変化 float m_fAgingSpeed; // 老いる速度
寿命(FRAME数)設定.alph_ratio<1で年齢に従って透過するようになる.
また,現在色,変化後色,変化時間を指定することで除々に変色.
SetLifeTerm LifeTerm, alph_ratio // 寿命設定 SetColor dwColor // 色設定 SetColorDst dwColor, term // 変色設定;変化後の色,変化にかかる時間
■ レジスタ制御
オブジェクトのメンバ変数↓をまとめて書き換える命令.
float m_fValueStac[_VALUESTAC_SIZE]; // 変数レジスタ
"a=5" と書いても m_fValueStac[0] = 5 が代入できるが,
まとめて設定する場合に,行数がかかるので.
abcd a, b, c, d // レジスタをまとめて設定.(無指定でも0が代入される) efgh e, f, g, h // レジスタをまとめて設定.(無指定でも0が代入される)
■ オブジェクト生成/破棄
オブジェクトの生成/破棄,及びその設定を行う.
弾幕を表記する事を考えて,設定パラメータを多めに抽出.
- 発射位置の相対座標,射出源に座標追随するか?
- 発射方向,初速度,初加速度,加速時間
- n-way 弾の 弾数/ 角度範囲
- 多重弾の 弾数 / 速度範囲
- 乱数弾の 弾数/ 角度範囲 / 速度範囲
これらのパラメータを設定して...
// 弾ID,弾AccessNo,発射位置の相対座標,相対位置化 SetChild ActorID, AccessNo, x, y, bRelativePos // n-way,角度幅,速度幅,乱数か? SetCannon nway, angle_width, vel_width, randomize(0=false/1=true) // 弾設定 方向オプション,角度,初速度,初加速度,加速時間 SetBullet option, angle, vel, acc, term
生成する.
// 生成時に SetBullet パラメータ を指定する. fire option, angle, vel, acc, term
単独で生成する場合(n-way/多重射出などを無視して良い場合)用コマンドも用意
// SetChild →発射(初速度は 0 , SetCannon/SetBullet の設定は無効) create ActorID, AccessNo, x, y, bRelativePos
生成時に指定した AccessNo(任意) を用いて子オブジェクトの破棄を行う.
(bDestruction=0 で退避,bDestruction=1 で破壊) Destroy bDestruction // 自爆 DestroyChild AccessNo, bDestruction // 子Actor 破棄(bullet/Enemy/Particle) DestroyEnemy AccessNo, bDestruction // 子Actor 破棄(Enemy) DestroyBullet AccessNo, bDestruction // 子Actor 破棄(Bullet) DestroyParticle AccessNo, bDestruction // 子Actor 破棄(Particle) DestroyGBParticle AccessNo, bDestruction // 子Actor 破棄(BGParticle) DestroyShot AccessNo, bDestruction // 子Actor 破棄(Shot)
自分を中心に一番近い敵オブジェクトを検索して,ターゲットオブジェクトとして格納する.
// 索敵 索敵方法,索敵結果代入ReferNo, 最大索敵距離 FindTarget me_opt, set_refer_no, max_range
# 英語の前に,もっと国語力をつけよう.俺