DirectX SDK |
This topic pertains only to application development in Visual Basic. See DirectInput C/C++ Tutorials.
As the user moves the iron ball around, the application will adjust the direction and magnitude of the effect. First of all, though, you may want to check whether the device allows you to change the direction of the effect without stopping and restarting it. DirectInput will stop and restart the effect automatically if necessary, but you might want to modify the behavior of your application to avoid breaks in continuity.
In order to examine the capabilities for any effect, you need to enumerate supported effects and then look for the particular one you are interested in.
Dim diEnumEffects As DirectInputEnumEffects Dim params As Long Dim i As Long ' Enumerate constant forces Set diEnumEffects = didev.GetEffectsEnum(DIEFT_CONSTANTFORCE) For i = 1 To diEnumEffects.GetCount ' Look for the standard constant force. There could be others. If diEnumEffects.GetEffectGuid(i) = "GUID_ConstantForce" Then params = diEnumEffects.GetDynamicParams(i) Exit For End If Next i If Not (params And DIEP_DIRECTION) Then ' Cannot change direction dynamically. Take remedial action such ' as limiting points at which modifications will be made. End If
Similarly, to learn whether you can change the magnitude of the effect dynamically, perform the following check:
if Not (params And DIEP_TYPESPECIFICPARAMS) ' Can't change type-specific parameters dynamically. End If
Now you wish to modify the effect each time the device has been polled for input and the iron ball has moved. Let's presume that you have calculated the new magnitude in CurrentMag and the new direction (in degrees) in CurrentBearing. In order to make the necessary changes, you need to initialize only those members of DIEFFECT that are relevant.
EffectInfo.constantForce.lMagnitude = CurrentMag EffectInfo.x = CurrentBearing * 100
You now pass the DIEFFECT type to DirectInputEffect.SetParameters along with flags indicating which members contain valid data:
di_effect.SetParameters(EffectInfo, _ DIEP_DIRECTION Or DIEP_TYPESPECIFICPARAMS)
The DIEP_TYPESPECIFICPARAMS flag indicates that any member containing information particular to that type of effect is valid. In the case of a constant force, this means the constantForce member.