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 7-14: Setting axis properties
    procedure TfrmJoyTestBed.FormActivate(Sender: TObject);

    var

      iCount: Integer;

      RangeProp: TDIPropRange;

      DataProp: TDIPropDWord;

        .

        .

        .

    begin

        .

        .

        .

      {we must now set the range for each axis, so initialize a range

       property structure}

      RangeProp.diph.dwSize := SizeOf(TDIPropRange);

      RangeProp.diph.dwHeaderSize := SizeOf(TDIPropHeader);

      RangeProp.diph.dwHow := DIPH_BYOFFSET;

      RangeProp.lMin := -1000;

      RangeProp.lMax := 1000;

      {we must also set deadzones and saturations for each axis, so

       initialize a DWord property structure}

      DataProp.diph.dwSize := SizeOf(TDIPropDWord);

      DataProp.diph.dwHeaderSize := SizeOf(TDIPropHeader);

      DataProp.diph.dwHow := DIPH_BYOFFSET;

      {for each axis...}

      for iCount := 0 to NumAxes-1 do

      begin

        {set its range...}

        RangeProp.diph.dwObj := FAxisList[iCount];

        DXCheck( FDirectInputDevice.SetProperty(DIPROP_RANGE, RangeProp.diph) );

        {its deadzone... (this value is in 100ths of a percent}

        DataProp.dwData := 1000;

        DataProp.diph.dwObj := FAxisList[iCount];

        DXCheck( FDirectInputDevice.SetProperty(DIPROP_DEADZONE, DataProp.diph) );

        {and its saturation (this value is also in 100ths of a percent}

        DataProp.dwData := 9000;

        DXCheck( FDirectInputDevice.SetProperty(DIPROP_SATURATION, DataProp.diph));

      end;

        .

        .

        .

      {set the cooperative level}

      DXCheck( FDirectInputDevice.SetCooperativeLevel(Handle, DISCL_EXCLUSIVE or

                                                      DISCL_FOREGROUND) );

      {finally, acquire the device so we can start retrieving information}

      DXCheck( FDirectInputDevice.Acquire );

      {enable the timer that retrieves the controller state}

      tmrJoyPoll.Enabled := TRUE;

    end;
Reading Input Data Compared to setting up DirectInput for game controllers, actually reading their input data is rather simple. Game controllers usually do not generate hardware interrupts. As such, Windows (and the device driver) is not informed that an input event has occurred on the device. Thus, for almost all game controllers, the Poll method must be called to instruct the driver to retrieve device information before the application can retrieve the device’s state. The Poll method takes no parameters. If a game controller does not require polling, this method has no effect. Therefore, it’s usually a good practice to always call the Poll method regardless of the game controller or its driver. Once this is done, the application can call the GetDeviceState method, passing in a pointer to a TDIJoyState2 structure. Although you can use buffered data techniques, most applications can get by with retrieving immediate game controller data. The TDIJoyState2 structure is defined as:
    TDIJoyState2 = packed record

      lX: Longint;                           // x-axis position

      lY: Longint;                           // y-axis position

      lZ: Longint;                           // z-axis position

      lRx: Longint;                          // x-axis rotation

      lRy: Longint;                          // y-axis rotation

      lRz: Longint;                          // z-axis rotation

      rglSlider: Array [0..1] of Longint;    // extra axes positions

      rgdwPOV: Array [0..3] of DWORD;        // POV directions

      rgbButtons: Array [0..127] of BYTE;    // 128 buttons

      lVX: Longint;                          // x-axis velocity

      lVY: Longint;                          // y-axis velocity

      lVZ: Longint;                          // z-axis velocity

      lVRx: Longint;                         // x-axis angular velocity

      lVRy: Longint;                         // y-axis angular velocity

      lVRz: Longint;                         // z-axis angular velocity

      rglVSlider: Array [0..1] of Longint;   // extra axes velocities

      lAX: Longint;                          // x-axis acceleration

      lAY: Longint;                          // y-axis acceleration

      lAZ: Longint;                          // z-axis acceleration

      lARx: Longint;                         // x-axis angular acceleration

      lARy: Longint;                         // y-axis angular acceleration

      lARz: Longint;                         // z-axis angular acceleration

      rglASlider: Array [0..1] of Longint;   // extra axes accelerations

      lFX: Longint;                          // x-axis force

      lFY: Longint;                          // y-axis force

      lFZ: Longint;                          // z-axis force

      lFRx: Longint;                         // x-axis torque

      lFRy: Longint;                         // y-axis torque

      lFRz: Longint;                         // z-axis torque

      rglFSlider: Array [0..1] of Longint;   // extra axes forces

    end;
This rather large structure defines the state of every object on the game controller. The position and rotation of various axes is easily retrievable, as is the state of buttons, POVs, etc. The following listing illustrates how to retrieve the current state of a game controller.
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.