TDDIDFFX

タスク

 TDDIDFFXは、IDirectInputEffectをカプセル化し、フォースフィードバックエフェクトを実行するためのオブジェクトです。

 

リファレンス目次

プロパティ

(凡例:    読み取り専用   Published)

状態 Applied
Category
Style
フォース設定 Direction
Duration
設定 Gain
SamplePeriod
TriggerButton
TriggerRepeatInterval
エンベロープ AttackLevel
AttackTime
FadeLevel
FadeTime
ConstantForce用プロパティ Magnitude
RampForce用プロパティ StartMagnitude
EndMagnitude
Periodic用プロパティ Offset 
DeltaMagnitude 
Phase
Period
Condition用プロパティ PositiveCoefficient
NegativeCoefficient
PositiveSaturation
NegativeSaturation
DeadBand
ConditionOffset

メソッド

コンストラクタ Create
デストラクタ Destroy
デバイスへの割り当て Apply
Unload
使用と停止 Start
Stop
ファイルI/O LoadFromFile
LoadFromQDA
SaveToFile

 

リファレンス〜プロパティ

Applied

property Applied:Boolean;

 このオブジェクトが、すでにApplyメソッドによってジョイスティックに割り当てられたかを示します。

注意

 Applied = Trueの場合、Falseの場合に比べ、以下の制約があります

 

Category

property Category:TDDIDFFXCategory;

type TDDIDFFXCategory = (xcConstantForce,xcRampForce,xcPeriodic,xcCondition);

 Styleプロパティによって指定された波形が、どの種のエフェクトに属するかを示します。

 Styleプロパティを指定することで、一意に決まるので、このプロパティは読み出し専用です。

 StyleとCategoryの対応は、以下の通りです。

Category  カテゴリの説明 Style 
xcConstantForce  一定のフォース xsConstantForce 
xcRampForce  傾きを持ったフォース xsRampForce
xcPeriodic  周期を持ったフォース xsSquare 
xsSine
xsTriangle 
xsSawtoothUp 
xsSawtoothDown 
xcCondition スティックの状態に応じて変化するフォース xsSpring 
xsDamper 
xsInertia
xsFriction

 

Style

property Style:TDDIDFFXStyle;


type TDDIDFFXStyle = (xsConstantForce, xsRampForce,
                      xsSquare,xsSine,xsTriangle,xsSawtoothUp,xsSawtoothDown,
                      xsSpring,xsDamper,xsInertia,xsFriction);

 波形の大まかな特徴を示します。

 StyleとCategoryの対応、Styleの意味は、以下の通りです。

Style  Category どんな効果か
xsConstantForce  xcConstantForce  一定
xsRampForce xcRampForce  傾斜
xsSquare  xcPeriodic  矩形波
xsSine サイン波
xsTriangle  三角波
xsSawtoothUp  鋸歯波 /|/|/|
xsSawtoothDown  鋸歯波 |\|\|\
xsSpring  xcCondition  中心に向かって押し戻す
xsDamper  スティックが重たくなる
xsInertia 慣性が働く
xsFriction スティックに摩擦が働く


注意

 Applyメソッドによって、すでにジョイスティックに割り当てられている場合、このプロパティは変更できません。

 

Direction

property Direction:TPoint;

 フォースの働く向きをXY平面上のデカルト座標で指定します。

 CategoryがxcConditionの場合、このプロパティは無視されます。

 ユーザーの手前から遠ざかる方向へ、エフェクトを変更する場合、

 Directon:=Point(0,-1)

 というように、Yをマイナスに設定します。

 ユーザーの左から右の方向へ、エフェクトを設定する場合、

 Directon:=Point(1,0)

 というように、Xをプラスに設定します。

 向きを指定するためのものなので、値の大きさは関係有りません。(1,0)でも(2,0)でも全く同じです。

 

Duration

property Duration:DWord;

 エフェクトの持続時間をマイクロ秒単位で指定します。

 DInputユニットで宣言されている、DI_SECONDS定数を指定すれば、ちょうど一秒です。

 無限に持続するエフェクトにする場合は、INFINITEを指定します。

 

Gain

property Gain:DWord;

 エフェクトの振幅を指定します。

 0〜10000の範囲で指定します。10000で最大です。

 

SamplePeriod

property SamplePeriod:DWord;

 エフェクトのサンプリング間隔をマイクロ秒単位で指定します。

 0を指定すると、デバイスの最も細かいサンプリング間隔を用います。

 サンプリング間隔を大きくして、サイン波のエフェクトなどを作ることにより、ざらざらした手応えを作る…といった利用法があるそうです。

 

TriggerButton

property TriggerButton:Integer;

 このプロパティに指定した番号のボタンに連動して、エフェクトが再生されるようになります。

 DI_B1〜DI_B32の範囲で指定が可能で、-1など、それ以外の値を指定すると、連動するボタンは無し、ということにします。

 ボタン4が押されると、エフェクトが発生するようにします

TriggerButton:=DI_B4;

 

TriggerRepeatInterval

property TriggerRepeatInterval:DWord;

 ボタンと連動して再生されるエフェクトが終了した場合、次のエフェクト開始までの時間をマイクロ秒単位で指定します。



 以下の場合、ボタン4を押しつづけることでエフェクトが2秒間続き、1秒間止まり、2秒間続き…というのを繰り返します

Duration:=DI_SECONDS * 2;
TriggerButton:=DI_B4;
TriggerRepeatInterval:=DI_SECONDS;

以下の場合、ボタン4を押しつづけても、最初の2秒間だけしかエフェクトは再生されません。

Duration:=DI_SECONDS * 2;
TriggerButton:=DI_B4;
TriggerRepeatInterval:=INFINITE;

 

エンベロープ設定用プロパティ

property AttackLevel:DWord;
property AttackTime :DWord;
property FadeLevel  :DWord;
property FadeTime   :DWord;

 この四つのプロパティを操作することでエフェクトにエンベロープを設定できます。 

 エンベロープによって、フォースの継続時間(Durationプロパティで設定)に応じてエフェクトの振幅に波を付けることが出来ます。

 それぞれのプロパティの意味は、以下の通りです。

 図の真ん中へんの、平坦になっている部分は、Magnitudeプロパティや、BaseManitudeプロパティなど、各カテゴリで固有の振幅を設定するための値に準じます。

注意

 CategoryがxcConditionの場合、このプロパティは意味を持ちません。 

 

ConstantForce用プロパティ

property Magnitude:Integer;

 CategoryプロパティがxcConstantForceの時の波形の詳細を設定するプロパティは、以上の一個だけです。

 フォースの振幅を、Magnitudeによって-10000〜10000の範囲で指定します。

 

RampForce用プロパティ

property StartMagnitude:Integer;
property EndMagnitude:Integer;

 CategoryプロパティがxcRampForceの時の波形の詳細を設定するプロパティは、以上の2個です。

 フォースの強さは、StartMagnitudeからEndMagnitudeまで、線形に変化します。

 いずれも-10000〜10000の範囲で指定します。

 

Periodic用プロパティ

Offset		:Integer;
DeltaMagnitude	:DWord;
Phase		:DWord;
Period		:DWord;

 CategoryプロパティがxcPeriodicの時の波形の詳細を設定するプロパティは、以上の4個です。

 フォースの強さは、OffSet ± F(t) * DeltaMagnitude の範囲で変化します。F(t)は、Styleプロパティで指定された波形を示す関数です。

 Offsetは-10000〜10000の範囲で、それ以外は0〜10000の範囲で指定します。

 

Condition用プロパティ

PositiveCoefficient:Array[0..1] of Integer;
NegativeCoefficient:Array[0..1] of Integer;
PositiveSaturation :Array[0..1] of DWord;
NegativeSaturation :Array[0..1] of DWord;
DeadBand           :Array[0..1] of Integer;
ConditionOffset    :Array[0..1] of Integer;

 CategoryプロパティがxcConditionの時の波形の詳細を設定するプロパティは、以上の6個です。

 ConditionOffsetは、条件のオフセット(-10000〜10000)

 PositiveCoefficientは、ConditionOffsetの正側の係数(-10000〜10000)
 NegativeCoefficientは、ConditionOffsetの負側の係数(-10000〜10000)

 PositiveSaturationは、オフセットの正側の最大フォース出力(0〜10000)
 NegativeSaturationは、オフセットの負側の最大フォース出力(0〜10000)

 DeadBandは、条件がどの程度オフセットに近ければ、フォースを出さないか、という値(0〜10000)

 何を言っているのかよくわからないかもしれませんが、実際に試してみればどういう事なのか良く分かります(^^;)

 配列プロパティになっていますが、これはX成分についてとY成分についての二つが必要だからです。配列の添え字が0ならばX成分を、1ならばY成分をあらわします。たとえば、PostiiveCoefficient[0] は、PositiveCoefficioentのX成分です。

注意

 CategoryがxcConditionの時は、エンベロープの影響は無視されます。

 

 

リファレンス〜メソッド

Create

constructor Create(owner:TDDIDEX);

 TDDIDFFXオブジェクトを生成します。

 ownerには、フォームに貼りつけてあるDDIDEXコンポーネントの名前を指定してください。

 

Destroy

destructor Destroy;

 TDDIDFFXオブジェクトを破棄し、関連するDirectInputEffectオブジェクトも解放します。通常は、Freeメソッドを使ってください。

 

Apply

procedure Apply(idx:Integer);

 フォースフィードバックエフェクトを、idxで示されるジョイスティックで使えるようにします。

 idxには、ジョイスティック番号(DI_JOY1〜DI_JOY16)を指定します。

注意

 一度Applyメソッドを実行してジョイスティックで使えるようにしたエフェクトは、Unloadメソッドによってジョイスティックから外すまでは他のジョイスティックにApplyすることはできません。また、Styleプロパティを変更することもできません。

Unload

procedure   Unload;

 Applyメソッドによってジョイスティックに載せられたエフェクトを外して、再生できないようにします。

 

Start

procedure   Start(iterate:Integer; exclusive:Boolean);

 エフェクトを再生します。

 iterateで再生する回数を指定します。INFINITEでStopメソッドが呼ばれるまで再生を繰り返します。

 exclusiveにTrueを指定すると、もしもジョイスティックで他に再生中のエフェクトがあったら、それを停止して、このオブジェクトが持っているエフェクトを再生します。Falseを指定すると、再生中のエフェクトといっしょに再生します。

注意

 事前にApplyメソッドによって、ジョイスティックにエフェクトを載せる必要があります。

Stop

procedure   Stop;

 Startメソッドで再生したエフェクトを停止します。

 

LoadFromFile

procedure   LoadFromFile(fname:String); 

 SaveToFileメソッドによって保存されたエフェクトを読み込みます。

 

LoadFromQDA

procedure LoadFromQDA(qdaName, id:String); 

 qdaNameで示されるファイル名を持ったQDAファイル内の、idで示されるIDを持ったデータから、SaveToFileメソッドによって保存されたエフェクトを読み込みます。

 

SaveToFile

procedure   SaveToFile(fname:String);

 保持されているエフェクトについての情報を保存します。

 LoadFromFileメソッドで読みこむことができます。

 エフェクトを定義するためにプロパティへ代入するコードを書いていくのは手間ですから(^^;)