Search Tips Advanced Search |
| Delphi Graphics and Game Programming Exposed with DirectX 7.0 by John Ayres Wordware Publishing, Inc. ISBN: 1556226373 Pub Date: 12/01/99
Search this book:
Previous | Table of Contents | Next
Listing 8-5: Using an envelope with periodic forces
    procedure TfrmJoyTestBed.FormActivate(Sender: TObject);

    var

       .

       .

       .

      AxisArray: array[0..1] of DWORD;

      DirArray: array[0..1] of longint;

      EffectInfo: TDIEffect;

      PeriodicInfo: TDIPeriodic;

      Envelope: TDIEnvelope;

    begin

       .

       .

       .

      {this effect plays on the X and Y axis}

      AxisArray[0] := DIJOFS_X;

      AxisArray[1] := DIJOFS_Y;

      {initialize the direction}

      DirArray[0] := 180*DI_DEGREES;

      DirArray[1] := 0;

      {initialize a periodic effect}

      PeriodicInfo.dwMagnitude := DI_FFNOMINALMAX;

      PeriodicInfo.lOffset := 0;

      PeriodicInfo.dwPhase := 0;

      PeriodicInfo.dwPeriod := DI_SECONDS div 10;

      {initialize the envelope. this will cause the effect to rise to the

       sustain level and then immediately fall back to 0 magnitude, as the

       entire duration of the effect is only 2 seconds, and both the

       attack and fade time each last a full second}

      Envelope.dwSize := SizeOf(TDIEnvelope);

      Envelope.dwAttackLevel := 0;

      Envelope.dwAttackTime := DI_SECONDS;

      Envelope.dwFadeLevel := 0;

      Envelope.dwFadeTime := DI_SECONDS;

      {initialize the global effect parameters}

      EffectInfo.dwSize := SizeOf(TDIEffect);

      EffectInfo.dwFlags := DIEFF_OBJECTOFFSETS or DIEFF_POLAR;

      EffectInfo.dwDuration := DI_SECONDS * 2;        // infinite duration

      EffectInfo.dwSamplePeriod := 0;

      EffectInfo.dwGain := DI_FFNOMINALMAX;

      EffectInfo.dwTriggerButton := DIJOFS_BUTTON0;   // tied to button 0

      EffectInfo.dwTriggerRepeatInterval := 0;

      EffectInfo.cAxes := 2;

      EffectInfo.rgdwAxes := @AxisArray;

      EffectInfo.rglDirection := @DirArray;

      EffectInfo.lpEnvelope := @Envelope;

      EffectInfo.cbTypeSpecificParams := SizeOf(TDIPeriodic);

      EffectInfo.lpvTypeSpecificParams := @PeriodicInfo;

      {create a sine wave periodic effect}

      FDirectInputDevice.CreateEffect(GUID_sine, @EffectInfo, PeriodicEffect, nil);

    end;
### Summary In this chapter, we discussed techniques for utilizing force feedback technology. We examined how to use both standard and custom effects, as well as how to modify effects on the fly. We also looked at shaping effects using envelopes. When using force feedback technology in your games, it is important to keep these points in mind: • Force feedback is part of the DirectInput subsystem, and was designed to work not only with joysticks but with any type of input device. • When discussing force feedback effects, it is necessary to understand several general concepts as they apply to the effect itself. Such concepts include kinetic forces, conditions, magnitude, coefficient, gain, duration, sample period, axes, direction, and envelope. • A kinetic force is an effect that actively pushes on one or more axes. This push can be in a single direction or in alternating directions such as occurs with periodic effects. • A condition is a resistance or force that is applied to one or more axes in response to their movement or position. • Magnitude is a measurement of the strength of a kinetic force, relative to the total maximum force that can be output by the device. The magnitude of a force can be expressed as an integer value between 10,000 and 10,000, where positive values represent a force in one direction and negative values represent the same force in the opposite direction. • The DI_FFNOMINALMAX constant is set to 10,000 and represents the total maximum force that can be exerted by the device on any given axis. This constant allows the developer to define the magnitude of a force as a percentage of the total maximum force available on the device. • Coefficient is a measurement of the strength of resistance to movement along an axis. Like magnitude, this value is expressed as an integer between 10,000 and 10,000. • Duration defines how long the effect will play, measured in microseconds. • The constant DI_SECONDS can be used to define the duration in terms of one-second intervals (or fractions thereof). • Sample period defines the interval between actual changes in the strength of a force, measured in microseconds. • Gain acts as a scaling factor for magnitudes and coefficients. It is expressed as a value between 0 and 10,000, indicating the percentage by which to scale the magnitude or coefficient. • Axes determine what axis (or axes) of movement on the force feedback device will be affected by the force feedback effect. • Direction determines the bearing of an effect along an axis (or axes) when its magnitude or coefficient values are positive. Negative values act in the opposite of the defined direction. • An envelope is a set of values that modify the magnitude of a force at the beginning and end of playback, and can be applied to all forces except conditions. • Force feedback effects are divided into six different categories: conditions, constant forces, periodic forces, ramp forces, device-specific effects, and custom forces. • All force feedback effects are defined by a primary structure called TDIEffect. This structure is used when creating the effect as well as modifying the effect after it has been created. • Each type of effect is defined by different parameters. These parameters are stored in a type-specific parameter data structure which differs from effect to effect. • Some members of the TDIEffect structure may be unsupported by some drivers. However, the application can use the GetEffectInfo method of the IDirectInputDevice2 interface to determine which TDIEffect parameters are supported. • Some effects must be downloaded to the device after they are created before they can be played. However, if the input device is in an acquired state when the effect is created, it is downloaded automatically. It is also downloaded automatically whenever the Start method is called. For some effects, such as a triggered effect that was created before the device was acquired, the Download method must be used. • A DIERR_DEVICEFULL error may be returned when using a force feedback effect. This indicates that the device has reached its maximum number of downloadable force feedback effects, and an existing effect must be unloaded from a device by calling the Unload method. • Triggered effects are automatically started when the trigger is pushed, and stopped when the trigger is released. Otherwise, effects must be explicitly started using the Start method. For effects with infinite duration, the Stop method must be called to halt playback. • Use the GetEffectStatus method to determine if an effect is currently playing. • Use the GetForceFeedbackState method to determine the overall state of the force feedback device. • Use the SendForceFeedbackCommand method to send global commands to the force feedback system. • The SetParameters method allows a force feedback effect to be modified on the fly.
Previous | Table of Contents | Next

Products | Contact Us | About Us | Privacy | Ad Info | Home Use of this site is subject to certain Terms & Conditions, Copyright © 1996-2000 EarthWeb Inc. All rights reserved. Reproduction whole or in part in any form or medium without express written permission of EarthWeb is prohibited. Read EarthWeb's privacy statement.