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 |
property Applied:Boolean;
このオブジェクトが、すでにApplyメソッドによってジョイスティックに割り当てられたかを示します。
注意
Applied = Trueの場合、Falseの場合に比べ、以下の制約があります
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 |
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メソッドによって、すでにジョイスティックに割り当てられている場合、このプロパティは変更できません。
property Direction:TPoint;
フォースの働く向きをXY平面上のデカルト座標で指定します。
CategoryがxcConditionの場合、このプロパティは無視されます。
例
ユーザーの手前から遠ざかる方向へ、エフェクトを変更する場合、
Directon:=Point(0,-1)
というように、Yをマイナスに設定します。
ユーザーの左から右の方向へ、エフェクトを設定する場合、
Directon:=Point(1,0)
というように、Xをプラスに設定します。
向きを指定するためのものなので、値の大きさは関係有りません。(1,0)でも(2,0)でも全く同じです。
property Duration:DWord;
エフェクトの持続時間をマイクロ秒単位で指定します。
DInputユニットで宣言されている、DI_SECONDS定数を指定すれば、ちょうど一秒です。
無限に持続するエフェクトにする場合は、INFINITEを指定します。
property Gain:DWord;
エフェクトの振幅を指定します。
0〜10000の範囲で指定します。10000で最大です。
property SamplePeriod:DWord;
エフェクトのサンプリング間隔をマイクロ秒単位で指定します。
0を指定すると、デバイスの最も細かいサンプリング間隔を用います。
サンプリング間隔を大きくして、サイン波のエフェクトなどを作ることにより、ざらざらした手応えを作る…といった利用法があるそうです。
property TriggerButton:Integer;
このプロパティに指定した番号のボタンに連動して、エフェクトが再生されるようになります。
DI_B1〜DI_B32の範囲で指定が可能で、-1など、それ以外の値を指定すると、連動するボタンは無し、ということにします。
例
ボタン4が押されると、エフェクトが発生するようにします
TriggerButton:=DI_B4;
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の場合、このプロパティは意味を持ちません。
property Magnitude:Integer;
CategoryプロパティがxcConstantForceの時の波形の詳細を設定するプロパティは、以上の一個だけです。
フォースの振幅を、Magnitudeによって-10000〜10000の範囲で指定します。
property StartMagnitude:Integer; property EndMagnitude:Integer;
CategoryプロパティがxcRampForceの時の波形の詳細を設定するプロパティは、以上の2個です。
フォースの強さは、StartMagnitudeからEndMagnitudeまで、線形に変化します。
いずれも-10000〜10000の範囲で指定します。
Offset :Integer; DeltaMagnitude :DWord; Phase :DWord; Period :DWord;
CategoryプロパティがxcPeriodicの時の波形の詳細を設定するプロパティは、以上の4個です。
フォースの強さは、OffSet ± F(t) * DeltaMagnitude の範囲で変化します。F(t)は、Styleプロパティで指定された波形を示す関数です。
Offsetは-10000〜10000の範囲で、それ以外は0〜10000の範囲で指定します。
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の時は、エンベロープの影響は無視されます。
constructor Create(owner:TDDIDEX);
TDDIDFFXオブジェクトを生成します。
ownerには、フォームに貼りつけてあるDDIDEXコンポーネントの名前を指定してください。
destructor Destroy;
TDDIDFFXオブジェクトを破棄し、関連するDirectInputEffectオブジェクトも解放します。通常は、Freeメソッドを使ってください。
procedure Apply(idx:Integer);
フォースフィードバックエフェクトを、idxで示されるジョイスティックで使えるようにします。
idxには、ジョイスティック番号(DI_JOY1〜DI_JOY16)を指定します。
注意
一度Applyメソッドを実行してジョイスティックで使えるようにしたエフェクトは、Unloadメソッドによってジョイスティックから外すまでは他のジョイスティックにApplyすることはできません。また、Styleプロパティを変更することもできません。
procedure Unload;
Applyメソッドによってジョイスティックに載せられたエフェクトを外して、再生できないようにします。
procedure Start(iterate:Integer; exclusive:Boolean);
エフェクトを再生します。
iterateで再生する回数を指定します。INFINITEでStopメソッドが呼ばれるまで再生を繰り返します。
exclusiveにTrueを指定すると、もしもジョイスティックで他に再生中のエフェクトがあったら、それを停止して、このオブジェクトが持っているエフェクトを再生します。Falseを指定すると、再生中のエフェクトといっしょに再生します。
注意
事前にApplyメソッドによって、ジョイスティックにエフェクトを載せる必要があります。
procedure Stop;
Startメソッドで再生したエフェクトを停止します。
procedure LoadFromFile(fname:String);
SaveToFileメソッドによって保存されたエフェクトを読み込みます。
procedure LoadFromQDA(qdaName, id:String);
qdaNameで示されるファイル名を持ったQDAファイル内の、idで示されるIDを持ったデータから、SaveToFileメソッドによって保存されたエフェクトを読み込みます。
procedure SaveToFile(fname:String);
保持されているエフェクトについての情報を保存します。
LoadFromFileメソッドで読みこむことができます。
エフェクトを定義するためにプロパティへ代入するコードを書いていくのは手間ですから(^^;)