nn::pia::reckoning::Initialize();
nn::pia::reckoning::BeginSetup(); nn::pia::reckoning::EndSetup(); |
nn::pia::reckoning::Finalize();
|
ReckoningCloneElement のインスタンスは、(通信開始前でも開始後でも)任意のタイミングで作成、破棄できます。ただし、CloneProtocol に登録したままの状態でインスタンスを破棄してはいけません。不正なメモリアクセスが発生する可能性があります。
ReckoningStrategy を ReckoningCloneElement に設定後、ReckoningCloneElement をクローンに登録して使用します。ReckoningCloneElement をクローンに登録/登録解除する方法は、クローンエレメントのクローン登録/登録解除と同様となります。
nn::pia::clone::SendClone sendClone;
nn::pia::clone::ReceiveClone receiveClone; nn::pia::reckoning::Simple3dReckoningStrategy reckoningStrategy(1.f); nn::pia::reckoning::ReckoningCloneElement<nn::pia::reckoning::Simple3dReckoningStrategy> elementForSend; nn::pia::reckoning::ReckoningCloneElement<nn::pia::reckoning::Simple3dReckoningStrategy> elementForReceive; elementForSend.SetReckoningStrategy(&reckoningStrategy); elementForReceive.SetReckoningStrategy(&reckoningStrategy); sendClone.RegisterElement(&elementForSend, 0x0001); receiveClone.RegisterElement(&elementForReceive, 0x0001); |
クローンエレメントと同様に、SetValue() する前に、IsReadyToSetValue() で登録されているクローンが値を設定できる状態か確認する必要があります。また、GetValue() する前に、IsValidValue() で値を受信して有効な値を取得できる状態か確認する必要があります。
// 値の設定
if (elementForSend.IsReadyToSetValue()) { nn::pia::reckoning::Vector3f posForSend; bool isStop = false; elementForSend.SetValue(posForSend, &isStop); } // 値の取得 if (elementForReceive.IsValidValue()) { nn::pia::reckoning::Vector3f posForReceive = elementForReceive.GetValue(); } |
Vector3f は、reckoning 名前空間内で定義された 3 次元ベクトルを表すクラスです。アプリケーションでは、この型を独自の型に変換して使用して下さい。
SetValue() する際に、Vector3f の 3 つの値のうちいずれか一つの値を一定(0 など)にすることで、2 次元空間での推測を行うことが可能です。同様の考えで、1 次元の推測も行うことも可能です。
1 次関数を用いたアルゴリズムで推測する際、ゲームオブジェクトが等速直線運動後に減速することなく急停止すると、図 10-3. 推測値が振動する場合の例 に示すように、推測値が振動してしまう(動いていた方向に行きすぎて推測される)場合があります。図 10-3. 推測値が振動する場合の例 では、時刻 t でゲームオブジェクトが停止した場合、1 次関数を用いたアルゴリズムでは、その後の推測において推測パス 1のようなパスが推測されるため、値が振動してしまいます。
ライブラリとして用意されている Simple3dReckoningStrategy では、振動を改善するための停止フラグ機能が実装されています。ゲームオブジェクトが停止状態になった場合に、アプリケーションが停止フラグを Simple3dReckoningStrategy に渡すことで振動を防ぐことができます。SetValue() する際に、ゲームオブジェクトが動作状態から停止状態に切り替わったフラグをシステムに渡します(動作状態から停止状態への判定は、アプリケーションが行います)。通常、推測値と実際の値が一定の閾値以上の場合に標本値の更新が行われますが、停止フラグが SetValue() に渡された場合、そのとき渡された値を標本値として強制的に更新し、送信します。これにより、ゲームオブジェクトの停止位置の値が即座に送信され、受信側でもその値が使用されることになり、値が振動することはなくなります。