読者です 読者をやめる 読者になる 読者になる

スクリプト仕様の再設計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


# 英語の前に,もっと国語力をつけよう.俺