ÀÌ°ÍÀº 1999³â ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °­Á 2ȸºÐ ÀÔ´Ï´Ù.

#####################################################

------------------------------------------------------------------------
### µ¨ÆÄÀÌ·Î ÇÏ´Â Direct X - Direct Input (1/2)
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )

 

 Direct Input À̶õ ¹«¾ùÀΰ¡ ?  Direct X ÀÇ ±¸¼º ¿ä¼Ò Áß¿¡¼­ Direct Setup
´ÙÀ½À¸·Î ½¬¿î ¿ä¼ÒÀÌ´Ù.

 Direct InputÀº ÀÔ·Â ÀåÄ¡¿¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ Á¦¾îÇϱâ À§ÇÑ Direct XÀÇ ±¸
¼º¿ä¼ÒÀε¥, ÁÖ·Î °ü¸®ÇÏ´Â ÂÊÀÌ Å°º¸µå, ¸¶¿ì½º, Á¶À̽ºÆ½ÀÌ´Ù.

 ¸¶¿ì½º·Î´Â 3Â÷¿ø ¸¶¿ì½º±îÁö Áö¿øÇÏ°í, Á¶À̽ºÆ½À¸·Î´Â ÀϹÝÀûÀÎ 2Ãà 4¹öÆ°
»Ó¸¸ ¾Æ´Ï¶ó »çÀÌ´õ¿ÍÀδõ°°Àº ºñÇà±â Á¶Á¾°£À̳ª ½ºÆ¼¾î¸µ ±â´ÉÀÌ ÀÖ´Â ·¹ÀÌ
½º¿ë Á¶À̽ºÆ½±îÁö Áö¿øÇÑ´Ù. ( ÇÏÁö¸¸ ÇÊÀÚ°¡ 3Â÷¿ø ¸¶¿ì½º³ª Á¶À̽ºÆ½À» °¡
Áö°íÀÖÁö ¾Ê±â ¶§¹®¿¡ °­Á¿¡¼­´Â ¾ð±ÞÇÏÁö ¾Ê°Ú´Ù. )

Direct Input °­Á´ ÃÑ 2 ÆíÀ¸·Î ±¸¼ºµÉ ¿¹Á¤Àε¥, 1ÆíÀº Å°º¸µå °ü¸®°í 2Æí
Àº ¸¶¿ì½º °ü¸®·Î ÇÒ ¿¹Á¤ÀÌ´Ù.

------------------------------------------------------------------------

(1) Direct Input ÀÇ Keyboard ¸¦ ¿Ö »ç¿ëÇϴ°¡ ?

 À©µµ¿ìÁî¿¡´Â Å°º¸µå¸¦ °¨ÁöÇϱâ À§ÇÑ ÁÁÀº API ÇÔ¼ö°¡ ÀÌ¹Ì ÀÖ´Ù.

 GetAsyncKeyState() ¶ó´Â ÇÔ¼öÀε¥  ÀÌ ÇÔ¼ö¸¸ »ç¿ëÇصµ ÇöÀçÀÇ Å°°¡ ´­·¯Á®
ÀÖ´ÂÁö..  ¾Æ´Ï¸é ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡  Æ¯Á¤ Å°°¡ ´­·¯Áø ÀûÀÌ ÀÖ´ÂÁö¸¦
¾Ë ¼ö ÀÖ´Ù.

 ÀϹÝÀûÀÎ °ÔÀÓ( À©µµ¿ì ±â¹ÝÀÇ °ÔÀÓ )¿¡¼­´Â ÀÌ ÇÔ¼ö¸¸À¸·Îµµ ÃæºÐÈ÷ Å°º¸µå
°ü¸®¸¦ ÇÒ ¼ö ÀÖ°í Direct X ±â¹ÝÀÇ °ÔÀÓÀ̶ó°í ÇÏ´õ¶óµµ ÀÌ ÇÔ¼ö·Îµµ ÃæºÐÈ÷
Å°º¸µå ÀԷ¿¡ ¹«¸®¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 ±×·¸´Ù¸é Direct Input ÀÇ Keyboard ¸¦ ¿Ö »ç¿ëÇϴ°¡ ?

 ÇÊÀÚ°¡ »ý°¢ÇÏ´Â ÀÌÀ¯´Â ÀÌ·¸´Ù... Direct Input ÀÇ Keyboard ´Â DOS ½ÃÀý¿¡
°ÔÀÓ ÇÁ·Î±×·¡¸Ó°¡ Å°º¸µå ÀÎÅÍ·´Æ®¸¦ °¡·Îä¼­ ¸¸µç  Multi Key ¶ó´Â ±â¹ý¿¡
°¡Àå °¡±î¿î ¿ë¹ýÀ¸·Î ¾²À̱⠶§¹®¿¡ °ÔÀÓ ÇÁ·Î±×·¡¸Óµé¿¡°Ô Àͼ÷ÇÑ »ç¿ë¹ýÀ»
Á¦°øÇÑ´Ù. ±×¸®°í Å° Á¶ÇÕÀÌ ¸¹Àº ¾ÆÄÉÀ̵峪 ¾×¼Ç °ÔÀӵ¼­ Å°Á¶ÇÕÀÌ °£´Ü
ÇÏ°í ±× ¼Óµµ°¡ ºü¸£´Ù.

 ÀÌ Á¤µµ¸é ÃæºÐÇÑ ÀÌÀ¯°¡ µÇ¾ú´Ù°í »ý°¢ÇÏ°í ±¸ÇöÀ¸·Î µé¾î°¡°Ú´Ù.

------------------------------------------------------------------------

(2) Direct Input ÀÇ Keyboard °´Ã¼ ±¸Çö

| type
|
|    TKeyState = array[0..255] of Byte;
|
|    TDxInput = class
|       constructor Create(hInstance : integer; Handle : integer);
|       procedure   Free;
|    private
|    public
|       DirectInput         : IDirectInput;
|       DirectInputKeyboard : IDirectInputDevice;
|       procedure GetKeyState(var KeyState : TKeyState);
|    end;

 ÀÌ·¸°Ô °£´ÜÇÑ °´Ã¼·Î Direct Input ÀÇ Keyboard °´Ã¼°¡ ¸¸µé¾îÁø´Ù.

 »ý¼ºÀÚ, ¼Ò¸êÀÚ, ±×¸®°í º¯¼ö 2 °³¿Í ÇÔ¼öÇϳª...

 ¿ì¸®´Â Ç×»ó ±×·¸µí 10ÁÙÀÇ ¼³¸í º¸´Ù´Â 10ÁÙÀÇ Äڵ带 ´õ »¡¸® ÀÌÇØÇϱ⠶§
¹®¿¡ implementation¿¡ ±¸ÇöµÇ¾î ÀÖ´Â °´Ã¼ ¸Þ¼Òµå¸¦ Á÷Á¢ º¸¸é¼­ ¼³¸íÇÏ°Ú´Ù.

 ¾Æ·¡¿¡ º¸ÀÌ´Â °ÍÀÌ »ý¼ºÀÚ´Ù.
 ÆĶó¸ÞÅÍ´Â Instance¿Í HandleÀ» ¹Þ´Â´Ù.

| constructor TDxInput.Create(hInstance : integer; Handle : integer);
| var
|    HR : HResult;
| begin
|    // ¼±Á¶ÀÇ Create¸¦ ½ÇÇàÇÑ´Ù.
|    Inherited Create;
|
|    // Direct Input °´Ã¼¸¦ ¸¸µç´Ù.
|    HR := DirectInputCreate(hInstance,DIRECTINPUT_VERSION,
|                                      DirectInput,nil);
|    if HR <> DI_OK then exit;
|
|    // Å°º¸µå µð¹ÙÀ̽º¸¦ »ý¼ºÇÑ´Ù.
|    HR := DirectInput.CreateDevice(GUID_SysKeyboard,
|                                   DirectInputKeyboard,nil);
|    if HR <> DI_OK then exit;
|
|    // Å°º¸µå¿¡ ´ëÇÑ µ¥ÀÌÅÍ Æ÷¸ËÀ» ¼³Á¤ÇÑ´Ù.
|    HR := DirectInputKeyboard.SetDataFormat(c_dfDIKeyboard);
|    if HR <> DI_OK then exit;
|
|    // »óÈ£ Çù·Â ·¹º§À» ¼³Á¤ÇÑ´Ù.
|    HR := DirectInputKeyboard.SetCooperativeLevel(Handle,
|                               DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);
|    if HR <> DI_OK then exit;
|
|    // Å°º¸µåÀÇ Á¢±Ù ±ÇÇÑÀ» ¾ò´Â´Ù.
|    HR := DirectInputKeyboard.Acquire;
|    if (HR <> DI_OK) and (HR <> DI_NOEFFECT) then begin
|       // ½ÇÆÐÇßÀ» ¶§ ±× ¿øÀÎÀ» ¾Ë¾Æ º»´Ù.
|       case HR of
|          DIERR_NOTINITIALIZED  :
|             ShowMessage('Direct Input Error : NOTINITIALIZED');
|          DIERR_INVALIDPARAM    :
|             ShowMessage('Direct Input Error : INVALIDPARAM');
|          DIERR_OTHERAPPHASPRIO :
|             ShowMessage('Direct Input Error : OTHERAPPHASPRIO');
|          else                    
|             ShowMessage('Direct Input Error');
|       end;
|    end;
| end;

 ÀÌ°É·Î Direct InputÀÇ Keyboard¿¡ ´ëÇÑ ÃʱâÈ­°¡ ¸ðµÎ ³¡³µ´Ù. ±×·³ ¼øÂ÷Àû
À¸·Î ´Ù½Ã ÀÚ¼¼ÇÏ°Ô ¼³¸íÇØ º¸¸é.....

1) DirectInputCreate(hInstance,DIRECTINPUT_VERSION,DirectInput,nil);

   Direct Input °´Ã¼¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö´Ù.

   Ã¹¹ø° ÆĶó¸ÞÅÍ : ÀÌ °´Ã¼¸¦ »ý¼ºÇÏ·Á´Â ÇÁ·Î±×·¥ÀÇ ÀνºÅϽº
   µÎ¹ø° ÆĶó¸ÞÅÍ : Direct Input ÀÇ ¹öÀü ³Ñ¹ö, ¾Æ·¡Ã³·³ Á¤ÀǵǾî ÀÖ´Ù.
                     {$IFDEF DIRECTX3}
                        DIRECTINPUT_VERSION = $0300;
                     {$ELSE}
                        DIRECTINPUT_VERSION = $0500;
                     {$ENDIF}
   ¼¼¹ø° ÆĶó¸ÞÅÍ : Direct Input ÀÇ ÁÖ °´Ã¼ÀÎ IDirectInput ·Î ¼±¾ðµÈ º¯
                     ¼ö°¡ var ·Î µé¾î°¡°Ô µÈ´Ù. ¼º°øÇϸé nilÀÌ ¾Æ´Ñ °ªÀÌ
                     µé¾î¿Â´Ù.
   ³×¹ø° ÆĶó¸ÞÅÍ : ¹«Á¶°Ç nilÀ» ¾´´Ù.

2) DirectInput.CreateDevice(GUID_SysKeyboard,DirectInputKeyboard,nil);
 
   »ç¿ëÇÒ µð¹ÙÀ̽º¸¦ »ý¼ºÇÑ´Ù.

   Ã¹¹ø° ÆĶó¸ÞÅÍ : »ç¿ëÇÒ µð¹ÙÀ̽ºÀÇ GUID¸¦ ³Ö´Â´Ù. ÀÌ¹Ì Á¤ÀǵǾî ÀÖ´Â
                     '½Ã½ºÅÛ Å°º¸µå'¿¡ ´ëÇÑ GUIDÀÎ GUID_SysKeyboard¸¦ ³Ö
                     À¸¸é µÈ´Ù.  Âü°í·Î °­Á 2Æí¿¡ ³ª¿Ã '¸¶¿ì½º' ¿¡ ´ëÇÑ
                     GUID´Â GUID_SysMouse ÀÌ´Ù.
   µÎ¹ø° ÆĶó¸ÞÅÍ : IDirectInputDevice ·Î ¼±¾ðµÈ º¯¼ö°¡ var ·Î µé¾î°£´Ù.
                     ¿ª½Ã ¼º°øÇϸé nilÀÌ ¾Æ´Ñ °ªÀÌ µé¾î ¿Â´Ù.
   ¼¼¹ø° ÆĶó¸ÞÅÍ : ¹«Á¶°Ç nilÀ» ¾´´Ù.

3) DirectInputKeyboard.SetDataFormat(c_dfDIKeyboard);

   µð¹ÙÀ̽º¿¡ ´ëÇÑ µ¥ÀÌÅÍ Æ÷¸ËÀ» ¼³Á¤ÇÑ´Ù.
   ÇöÀç´Â Å°º¸µå µð¹ÙÀ̽ºÀ̹ǷΠŰº¸µå¿¡ ´ëÇÑ µ¥ÀÌÅÍ Á¤º¸¸¦ º¸³Â´Ù.

   Ã¹¹ø° ÆĶó¸ÞÅÍ : ³ªÁß¿¡ Direct InputÀ¸·ÎºÎÅÍ µ¹·Á ¹ÞÀ» µ¥ÀÌÅÍÀÇ ÇüÀÇ
                     ±¸Á¶Ã¼¸¦ ³Ö´Â´Ù. ÀÌ¹Ì  c_dfDIKeyboard, c_dfDIMouse,
                     c_dfDIJoystick, c_dfDIJoystick2 µîÀÌ  Á¤ÀǵǾî ÀÖÀ¸
                     ¸ç ÀڽŸ¸ÀÇ µ¥ÀÌÅÍ Çüµµ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

                     
4) DirectInputKeyboard.SetCooperativeLevel(Handle,
                                DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);

   »óÈ£ Çù·Â ·¹º§À» ¼³Á¤ÇÑ´Ù. ÀÌ°ÍÀº µð¹ÙÀ̽º¸¦ ÀÚ½ÅÀÌ µ¶Á¡ÇÒ °ÍÀΰ¡? ¾Æ
   ´Ï¸é ´Ù¸¥ ÇÁ·Î±×·¥µµ µ¿½Ã¿¡ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ´À³Ä¿¡ ´ëÇÑ °ÍÀ» Á¤ÀÇ ÇÑ
   ´Ù. ÆĶó¸ÞÅÍ À̸§À» º¸¸é ¾Ë°ÚÁö¸¸ NONEXCLUSIVE Çϸ鼭 FOREGROUND ¿¡¼­
   ¸¸ µ¿ÀÛÇϵµ·Ï Çß´Ù. ( ½±°Ô ¸»ÇÏ¸é µý ÇÁ·Î±×·¥µµ Å°º¸µå ¾µ ¼öÀÖ°í ÇöÀç
   HandleÀ» º¸³½ À©µµ¿ì¿¡ Focus °¡ ÀÖÀ» ¶§¸¸  Å°º¸µå Á¤º¸¸¦ ¹ÞÀ» ¼ö ÀÖ°Ô
   ¼³Á¤Çß´Ù. )
   
   Ã¹¹ø° ÆĶó¸ÞÅÍ : Å°º¸µå Á¤º¸¸¦ ¹ÞÀ» À©µµ¿ìÀÇ ÇÚµé

   µÎ¹ø° ÆĶó¸ÞÅÍ : Çù·Â ·¹º§¿¡ ´ëÇÑ Ç÷¡±×°¡ µé¾î°£´Ù.

        DISCL_EXCLUSIVE    - µý ÇÁ·Î±×·¥¿¡¼­´Â Aquire() ÇÏ°í ÀÖ´Â µ¿¾È¿¡
                             Å°º¸µå¸¦ »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù.
        DISCL_NONEXCLUSIVE - µý ÇÁ·Î±×·¥°ú ŵµå Á¤º¸¸¦ °øÀ¯ÇÑ´Ù.
        DISCL_FOREGROUND   - À©µµ¿ì¿¡ Focus°¡ ÀÖÀ» ¶§¸¸ Å°º¸µå Á¤º¸¸¦ ¹Þ
                             À» ¼ö ÀÖ´Ù.
        DISCL_BACKGROUND   - À©µµ¿ì°¡ ºñÈ°¼ºµÇ¾îµµ Å°º¸µå Á¤º¸¸¦ ¹ÞÀ» ¼ö
                             °¡ ÀÖ´Ù.

        ( DISCL_EXCLUSIVE ¿Í DISCL_NONEXCLUSIVE ´Â µ¿½Ã¿¡ »ç¿ëÇÒ ¼ö ¾ø°í
          DISCL_FOREGROUND ¿Í DISCL_BACKGROUND µµ ¸¶Âù°¡Áö´Ù. )

5) DirectInputKeyboard.Acquire;

   µð¹ÙÀ̽ºÀÇ Á¢±Ù ±ÇÇÑÀ» ¾ò´Â´Ù. ÇöÀç´Â Å°º¸µå·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î Å°º¸
   µå¿¡ ´ëÇÑ Á¢±Ù ±ÇÇÑÀÌ´Ù. Acquire¸¦ È£Ãâ ÇÏÁö ¾ÊÀ¸¸é Å°º¸µåÀÇ µ¥ÀÌÅ͸¦
   °¡Á® ¿Ã ¼ö ¾ø´Ù.

   ±×¸®°í ¸®ÅÏ °ªÀÌ À§ÀÇ ´Ù¸¥ ÇÔ¼ö¿Í´Â Á» ´Ù¸£´Ù´Â °ÍÀ» ´À²¼À» °ÍÀÌ´Ù.

        if (HR <> DI_OK) and (HR <> DI_NOEFFECT) then

   ÀÌ·± ½ÄÀ¸·Î ¼º°øÇßÀ» ¶§ÀÇ °ªÀº DI_OK »Ó¸¸ ¾Æ´Ï¶ó S_FALSE ¶ó´Â °ªÀÏ ¼ö
   µµ ÀÖ´Ù. DI_OK ´Â Direct InputÀÌ ¼º°øÇßÀ» ¶§ Ç×»ó µ¹·ÁÁÖ´Â HResult °ª
   À̸ç, DI_NOEFFECT´Â ÀÌ¹Ì Acquire¸¦ ÀÌ¹Ì È£Ãâ ÇÑ »óÅÂÀÏ ¶§ÀÇ ¸®ÅÏ °ªÀÌ
   ´Ù.


ÀÌ·¸°Ô »ý¼ºÀÚ¿¡ ´ëÇÑ ºÎºÐÀÌ ±¸¼ºµÈ´Ù.


±×·¯¸é À̹ø¿¡´Â ¼Ò¸êÀÚ¿¡ ´ëÇؼ­ ¾Ë¾Æ º¸ÀÚ.

| procedure   TDxInput.Free;
| begin
|    // Å°º¸µå Á¢±Ù ±ÇÇÑ ÇØÁ¦
|    DirectInputKeyboard.Unacquire;
|
|    // Direct Input µð¹ÙÀ̽º °´Ã¼ ÇØÁ¦
|    DirectInputKeyboard._Release;
|    Pointer(DirectInputKeyboard) := nil;
|
|    // Direct Input °´Ã¼ ÇØÁ¦
|    DirectInput._Release;
|    Pointer(DirectInput) := nil;
|
|    // ¼±Á¶ÀÇ Free¸¦ ½ÇÇàÇÑ´Ù.
|    Inherited;
| end;

»ý¼ºÀÚ¿¡ ºñÇؼ­´Â ºñ±³Àû °£´ÜÇÏ´Ù. ±×·³ ¼³¸í ÇÏÀÚ¸é...

1) DirectInputKeyboard.Unacquire;

   Aquire ¸Þ¼Òµå¿¡ ÀÇÇØ ¾ò¾îÁø Á¢±Ù ±ÇÇÑÀ» ÇØÁ¦ÇÑ´Ù.

2) DirectInputKeyboard._Release;
   Pointer(DirectInputKeyboard) := nil;

   Direct Input µð¹ÙÀ̽º °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù. COM ¿¡¼­´Â ±×³É Release¸¦ »ç¿ë
   Çϴµ¥ _Release »ç¿ëÇÏ´Â ÀÌÀ¯´Â, µ¨ÆÄÀÌ 2 ÀÇ OLE2 ¿Í´Â ´Ù¸¥, µ¨ÆÄÀÌ 3
   ÀÇ À̻󿡼­ Áö¿øÇÏ´Â IUnknown ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϱ⠶§¹®ÀÌ´Ù.

3) DirectInput._Release;
   Pointer(DirectInput) := nil;

   Direct Input °´Ã¼¸¦ ÇØÁ¦ÇÑ´Ù. ¿Ö Release¶ó´Â °úÁ¤ÀÌ ÇÊ¿äÇÑÁö´Â COM ¿¡
   °ü·ÃµÈ Ã¥ÀÚ¸¦ ÀÐ¾î º¸±â ¹Ù¶õ´Ù. Âü°í·Î Direct X ´Â ¸ðµÎ COM ±â¹ÝÀÌ´Ù.


±×·³ ÀÌÁ¦ µü ÇϳªÀÇ ÇÔ¼ö¸¸ ³²¾Ò´Ù.

| procedure   TDxInput.GetKeyState(var KeyState : TKeyState);
| var
|    HR : HResult;
| begin
|    // Å°º¸µåÀÇ »óŸ¦ Àд´Ù.
|    HR := DirectInputKeyboard.GetDeviceState(SizeOf(KeyState),@KeyState);
|    // ¸¸¾à ÀÔ·Â ÀåÄ¡¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÐ¾î ¹ö·ÈÀ¸¸é ´Ù½Ã Aquire ÇÑ´Ù.
|    if HR = DIERR_INPUTLOST then DirectInputKeyboard.Acquire;
| end;

1) DirectInputKeyboard.GetDeviceState(SizeOf(KeyState),@KeyState);

   µð¹ÙÀ̽ºÀÇ »óŸ¦ Àд´Ù. ÇöÀç´Â DirectInputKeyboard °¡ Å°º¸µå·Î Á¤ÀÇ
   µÇ¾úÀ¸¹Ç·Î Å°º¸µå¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù.

   Ã¹¹ø° ÆĶó¸ÞÅÍ : µÎ¹ø° ÆĶó¸ÞÅÍ¿¡ µé¾î°¡´Â ¹öÆÛÀÇ »çÀÌÁ ³Ö´Â´Ù.

   µÎ¹ø° ÆĶó¸ÞÅÍ : ÀÔ·Â ÀåÄ¡ÀÇ Á¤º¸¸¦ °¡Á®¿À´Â ¹öÆÛÀÇ Æ÷ÀÎÅ͸¦ ³Ö´Â´Ù.
                     ¹°·Ð ±× ±¸Á¶´Â SetDataFormat() ¿¡¼­ ÀÌ¹Ì Á¤ÀÇÇß´Ù.

------------------------------------------------------------------------

(3) Direct Input ÀÇ Keyboard °´Ã¼ ¿ë¹ý

°´Ã¼¸¦ ±¸ÇöÇßÀ¸´Ï ÀÌÁ¦´Â »ç¿ëÇÏ´Â ¹æ¹ý¸¸ ³²¾Ò´Ù.

ÀÏ´Ü °´Ã¼ÀÇ ¼±¾ðÀº ´ÙÀ½Ã³·³ ÇÏ¸é µÈ´Ù.
    DxInput : TDxInput;

±×¸®°í »ý¼ºÀº
    DxInput := TDxInput.Create(hInstance,Handle);

¼Ò¸êÀº
    DxInput.Free;
    DxInput := nil;

ÀÌ·¸°Ô »ç¿ëÇÑ´Ù.

±×·¸´Ù¸é ¿ë¹ýÀ» º¸ÀÚ...

| var
|    KeyState : TKeyState;
|
| begin
|    // KeyState ¿¡ Å°º¸µå »óŸ¦ °¡Á®¿Â´Ù.
|    DxInput.GetKeyState(KeyState);
|
|    // ¿À¸¥ÂÊ È­»ìǥŰ°¡ ´­·¯Á® ÀÖ´Â »óÅÂÀΰ¡ ?
|    if KeyState[DIK_RIGHT] and $80 > 0 then
|    // ¿ÞÂÊ È­»ìǥŰ°¡ ´­·¯Á® ÀÖ´Â »óÅÂÀΰ¡ ?
|    if KeyState[DIK_LEFT ] and $80 > 0 then
|    // À§ÂÊ È­»ìǥŰ°¡ ´­·¯Á® ÀÖ´Â »óÅÂÀΰ¡ ?
|    if KeyState[DIK_UP   ] and $80 > 0 then
|    // ¾Æ·¡ÂÊ È­»ìǥŰ°¡ ´­·¯Á® ÀÖ´Â »óÅÂÀΰ¡ ?
|    if KeyState[DIK_DOWN ] and $80 > 0 then
| end;

KeyState ¿¡ µÇµ¹¾Æ ¿À´Â °ªÀº TKeyState ¿¡ ¼±¾ðµÈ ´ë·Î 256 °³ÀÇ byte ¹è¿­
ÀÌ´Ù. ±×¸®°í ±× ¹è¿­µéÀº Direct Input Çì´õ¿¡ Á¤ÀÇµÈ DIK_RIGHT ¿Í °°Àº »ó
¼ö¿¡ ÀÇÇØ Æ¯Á¤ Á¤º¸¸¦ °¡Á®¿Ã ¼ö°¡ ÀÖ´Ù.  DOS ¶§ÀÇ ½ºÄµÄÚµå¿Í À¯»çÇÏ°Ô Å°
º¸µåÀÇ ½ÇÁ¦ ¹°¸®ÀûÀÎ ¹öÆ°¿¡ ¹Ù·Î ´ëÀÀÇÑ´Ù. Áï 'a' Å°¸¦ ´©¸£¸é ¹«Á¶°Ç 'a'
Å°·Î ÀνÄÇÑ´Ù. ( ÀϹÝÀûÀÎ Å°º¸µå¶ó¸é Sfhit - 'a' °¡ µÇ¸é 'A' ·Î ÀνÄÇÏÁö
¸¸ ¿©±â¿¡¼­´Â '¿ÞÂÊ Shift' ¿Í 'a'·Î µû·Î ÀνÄÇÑ´Ù. )

±× ¹è¿­µé¿¡ ÀúÀåµÈ °ªÀÇ MSB(ÃÖ»óÀ§ºñÆ®)°¡ 1À̸é ÇöÀç ±× Å°°¡ ´­·¯Áø °ÍÀÌ
°í 0 À̶ó¸é Å°°¡ ¶¼¾îÁø °ÍÀÌ´Ù. ÀÌ Á¤º¸¸¦ °¡Áö°í DOS ¶§ÀÇ Multi-Key ó·³
Çڵ鸵Çϸé ÀÌÀü¿¡ ´­·¯Á³¾ú´ÂÁö.. ¶Ç´Â ÇöÀç ¸î°³ÀÇ Å°°¡ Á¶ÇյǾú´ÂÁö µîÀ»
¾Ë¼ö°¡ÀÖ´Ù. ( BM98 À̶ó´Â À½¾Ç °ÔÀÓ¿¡ º¸¸é µ¿½Ã¿¡ 6Å°¸¦ ´­·¯µµ µ¿½Ã¿¡ ¸ð
µÎ ÀνÄÀ» ÇØ ³»´Â °ÍÀ» º¼ ¼ö ÀÖÀ»°ÍÀÌ´Ù. )

------------------------------------------------------------------------

(4) Direct Input ÀÇ Keyboard °´Ã¼ »ç¿ë ¿¹Á¦

±×·³ ½ÇÁ¦·Î »ç¿ëÀ» Çغ¸ÀÚ¸é....

1. À§¿¡¼­ ¸¸µç Direct Input °´Ã¼¸¦ µû·Î Unit ·Î ÀúÀåÇÑ´Ù.

2. »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í, Unit1 ¿¡´Â ¹æ±Ý ¸¸µç Direct Input °´Ã¼°¡ ÀÖ
   ´Â unit¸¦ usesÇÑ´Ù. ±×¸®°í Direct Input Çì´õÀÎ DInput.Pas µµ usesÇÑ´Ù.

3. Æû¿¡´Â ŸÀ̸Ó, ¶óº§, ¹öÆ°À» ¸¸µç´Ù.

4. TForm1 ÀÇ public ¿¡ 'DxInput : TDxInput;' À» Ãß°¡ÇÑ´Ù.

5. ¹öÆ°ÀÇ Å¬¸¯ À̺¥Æ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

   DxInput := TDxInput.Create(hInstance,Handle);
   Timer1.Enabled := TRUE;

6. Form ÀÇ Close À̺¥Æ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

   Timer1.Enabled := FALSE;
   DxInput.Free;
   DxInput := nil;

7. ŸÀÌ¸Ó À̺¥Æ®ÀÇ IntervalÀ» 1·Î ÇÏ°í À̺¥Æ®¿¡´Â ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

var
   KeyState : TKeyState;
   s        : string;
begin
   DxInput.GetKeyState(KeyState);
   s := '';
   if KeyState[DIK_RIGHT] and $80 > 0 then s := s + 'Right ';
   if KeyState[DIK_LEFT ] and $80 > 0 then s := s + 'Left ';
   if KeyState[DIK_UP   ] and $80 > 0 then s := s + 'Up ';
   if KeyState[DIK_DOWN ] and $80 > 0 then s := s + 'Down ';
   Label1.Caption := s;
end;

8. ½ÇÇàÇÑ´Ù.

9. ¹öÆ°À» ´©¸£¸é Direct Input ÀÇ Å°º¸µå Çڵ鸵ÀÌ ½ÃÀ۵Ǵµ¥... ÇöÀç´Â È­
   »ìÇ¥ Å°¿¡¸¸ ¹ÝÀÀÇÑ´Ù. µ¿½Ã¿¡ È­»ìǥ۸¦ ¿©·¯°³ ´©¸£°Å³ª  µ¿½Ã¿¡ 4°³¸¦
   ´­·¯µµ ¸ðµÎ ¹ÝÀÀÇÑ´Ù.

³ª¸ÓÁö Å°¿¡ ´ëÇÑ »ó¼ö °ªÀº µ¨ÆÄÀÌ¿ë Direct X ÀÇ DInput.Pas ¿¡ º¸¸é Àß ³ª
¿Í ÀÖ´Ù.


------------------------------------------------------------------------

                                                          1999 / 10 / 31

#####################################################

------------------------------------------------------------------------
### µ¨ÆÄÀÌ·Î ÇÏ´Â Direct X - Direct Input (2/2)
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )

 

 ¾Õ Àå¿¡¼­ ¿ì¸®´Â Direct Input ¿¡ ÀÇÇÑ Å°º¸µå »óÅ Àб⸦ Çß¾ú´Ù.

 ±×·¸´Ù¸é ÀÌÁ¦´Â ¸¶¿ì½º¿¡ ´ëÇÑ »óŸ¦ Àоî¾ß ÇÒ Â÷·ÊÀε¥.... ¾Õ Àå¿¡¼­µµ
°£·«ÇÏ°Ô ¾ð±ÞÇßµíÀÌ Å°º¸µå¿¡¼­ Çß´ø ¹æ½ÄÀ¸·Î ½±°Ô Á¢±Ù ÇÒ ¼ö°¡ ÀÖ´Ù.

------------------------------------------------------------------------

(1) Direct Input ÀÇ Mouse ¸¦ ¿Ö »ç¿ëÇϴ°¡ ?

 À©µµ¿ìÁî¿¡´Â ¸¶¿ì½º À§Ä¡¸¦ °¨ÁöÇϱâ À§ÇÑ ÁÁÀº API ÇÔ¼ö°¡ ÀÌ¹Ì ÀÖ´Ù.

 GetCursorPos() ¶ó´Â ÇÔ¼öÀε¥  ÀÌ ÇÔ¼ö¸¸ »ç¿ëÇصµ ÇöÀçÀÇ ¸¶¿ì½ºÀÇ À§Ä¡¸¦
¾Ë ¼ö°¡ ÀÖ°í,  ¾Õ¿¡¼­ ¾ð±ÞÇÑ GetAsyncKeyState() ÇÔ¼ö¿¡¼­ VK_LBUTTON µîÀ»
»ç¿ëÇϸé ÇöÀçÀÇ ¸¶¿ì½º ¹öÆ° »óŵµ ¾Ë ¼ö°¡ ÀÖ´Ù.

 ÀϹÝÀûÀÎ °ÔÀÓ( À©µµ¿ì ±â¹ÝÀÇ °ÔÀÓ )¿¡¼­´Â ÀÌ ÇÔ¼ö¸¸À¸·Îµµ ÃæºÐÈ÷ ¸¶¿ì½º
°ü¸®¸¦ ÇÒ ¼ö ÀÖ°í Direct X ±â¹ÝÀÇ °ÔÀÓÀ̶ó°í ÇÏ´õ¶óµµ ÀÌ ÇÔ¼ö·Îµµ ÃæºÐÈ÷
¸¶¿ì½º »óÅ Á¤º¸ ¾ò´Âµ¥ ¹«¸®¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

 ±×·¸´Ù¸é Direct Input ÀÇ Mouse ¸¦ ¿Ö »ç¿ëÇϴ°¡ ?

 ½ÇÁ¦·Î ¸¶¿ì½º ¹öÆ°ÀÇ »óŸ¦ ¾ò±â À§Çؼ­´Â GetAsyncKeyState() ¸¦ »ç¿ëÇÏ
³ª Direct Input ¸¦ »ç¿ëÇϳª ¶È°°´Ù.  ÇÏÁö¸¸ Direct Input ¸¦ »ç¿ëÇÏ¸é µ¿
½Ã¿¡ ¸¶¿ì½º ¹öÆ°µéÀÇ »óÅÂ¿Í ¸¶¿ì½º À§Ä¡ Á¤º¸¸¦ ¾ò¾î ¿À±â ¶§¹®¿¡  ¼Óµµ°¡
»¡¶óÁø´Ù. ±×¸®°í GetCursorPos() ¶ó´Â ÇÔ¼ö´Â  ´ÜÁö À©µµ¿ì ¹ÙÅÁÈ­¸é¿¡¼­ÀÇ
Àý´ëÀûÀÎ À§Ä¡¸¸À» µ¹·ÁÁÖÁö¸¸ Direct Input ¿¡¼­´Â X, Y Ãà¿¡ ´ëÇÑ À̵¿ º¯
·®(Delta)À» ±âÁØÀ¸·Î Çϱ⠶§¹®¿¡ ¸¶¿ì½ºÀÇ À§Ä¡¸¦ Àâ´Â °Í »Ó¾Æ´Ï¶ó  ¸¶¿ì
½º°¡ ´ÜÀ§ ½Ã°£¿¡ ¾ó¸¶¸¸Å­ÀÇ ¼Óµµ·Î ¿òÁ÷¿´´ÂÁö±îÁöµµ ¾Ë¾Æ ³¾ ¼ö°¡ ÀÖ´Ù.

 ¿¹¸¦µé¾î  ´ç±¸ °ÔÀÓÀ» ¸¸µå´Âµ¥  ¸¶¿ì½º¸¦ ¹Ð¾î¼­ Å¥´ë¸¦ Á¶Á¾ÇÑ´Ù°í Çϸé
°øÀ» Ä¥ ¶§  ¼ø°£ÀûÀÎ y º¯·®À¸·Î ÈûÀÇ ¼¼±â¸¦ ÃøÁ¤ÇÏ°í x ÀÇ º¯·®À¸·Î ºø³ª
°£ Á¤µµ¸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

 ÀÌ Á¤µµ¸é ÃæºÐÇÑ ÀÌÀ¯°¡ µÇ¾ú´Ù°í »ý°¢ÇÏ°í ±¸ÇöÀ¸·Î µé¾î°¡°Ú´Ù.

------------------------------------------------------------------------

(2) Direct Input ÀÇ Mouse °´Ã¼ ±¸Çö

| type
|    TMouseState = TDIMouseState;
|
|    TDxInput = class
|       constructor Create(hInstance : integer; Handle : integer);
|       procedure   Free;
|    private
|    public
|       DirectInput         : IDirectInput;
|       DirectInputMouse    : IDirectInputDevice;
|       procedure GetMouseState(var MouseState : TMouseState);
|    end;

 ÀÌ·¸°Ô °£´ÜÇÑ °´Ã¼·Î Direct Input ÀÇ Mouse °´Ã¼°¡ ¸¸µé¾îÁø´Ù.

 »ý¼ºÀÚ, ¼Ò¸êÀÚ, ±×¸®°í º¯¼ö 2 °³¿Í ÇÔ¼öÇϳª...

 ¿ì¸®´Â Ç×»ó ±×·¸µí 10ÁÙÀÇ ¼³¸í º¸´Ù´Â 10ÁÙÀÇ Äڵ带 ´õ »¡¸® ÀÌÇØÇϱ⠶§
¹®¿¡ implementation¿¡ ±¸ÇöµÇ¾î ÀÖ´Â °´Ã¼ ¸Þ¼Òµå¸¦ Á÷Á¢ º¸¸é¼­ ¼³¸íÇÏ°Ú´Ù.

 ¾Æ·¡¿¡ º¸ÀÌ´Â °ÍÀÌ »ý¼ºÀÚ´Ù.
 ÆĶó¸ÞÅÍ´Â Instance¿Í HandleÀ» ¹Þ´Â´Ù.

| constructor TDxInput.Create(hInstance : integer; Handle : integer);
| var
|    HR : HResult;
| begin
|    // ¼±Á¶ÀÇ Create¸¦ ½ÇÇàÇÑ´Ù.
|    Inherited Create;
|
|    // Direct Input °´Ã¼¸¦ ¸¸µç´Ù.
|    HR := DirectInputCreate(hInstance,DIRECTINPUT_VERSION,
|                                      DirectInput,nil);
|    if HR <> DI_OK then exit;
|
|    // ¸¶¿ì½º µð¹ÙÀ̽º¸¦ »ý¼ºÇÑ´Ù.
|    HR := DirectInput.CreateDevice(GUID_SysMouse,DirectInputMouse,nil);
|    if HR <> DI_OK then exit;
|
|    // ¸¶¿ì½º¿¡ ´ëÇÑ µ¥ÀÌÅÍ Æ÷¸ËÀ» ¼³Á¤ÇÑ´Ù.
|    HR := DirectInputMouse.SetDataFormat(c_dfDIMouse);
|    if HR <> DI_OK then exit;
|
|    // »óÈ£ Çù·Â ·¹º§À» ¼³Á¤ÇÑ´Ù.
|    HR := DirectInputMouse.SetCooperativeLevel(Handle,
|                                  DISCL_EXCLUSIVE or DISCL_FOREGROUND);
|    if HR <> DI_OK then exit;
|
|    // ¸¶¿ì½ºÀÇ Á¢±Ù ±ÇÇÑÀ» ¾ò´Â´Ù.
|    HR := DirectInputMouse.Acquire;
|    if (HR <> DI_OK) and (HR <> DI_NOEFFECT) then begin
|       // ½ÇÆÐÇßÀ» ¶§ ±× ¿øÀÎÀ» ¾Ë¾Æ º»´Ù.
|       case HR of
|          DIERR_NOTINITIALIZED  :
|             ShowMessage('Direct Input Error : NOTINITIALIZED');
|          DIERR_INVALIDPARAM    :
|             ShowMessage('Direct Input Error : INVALIDPARAM');
|          DIERR_OTHERAPPHASPRIO :
|             ShowMessage('Direct Input Error : OTHERAPPHASPRIO');
|          else                    
|             ShowMessage('Direct Input Error');
|       end;
|    end;


 ÀÌ°É·Î Direct InputÀÇ Mouse¿¡ ´ëÇÑ ÃʱâÈ­°¡ ¸ðµÎ ³¡³µ´Ù.  ±×·³ ¼øÂ÷ÀûÀ¸
·Î ´Ù½Ã ´ëÃæ ¼³¸íÇØ º¸¸é..... ( 1 Æí¿¡¼­ ÀÚ¼¼ÇÏ°Ô Ç߱⠶§¹®¿¡.. )

1) DirectInputCreate(hInstance,DIRECTINPUT_VERSION,DirectInput,nil);

   Direct Input °´Ã¼¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö´Ù.
   Keyboard ÀÏ ¶§¿Í °°Àº ¸í·É¾î´Ù.

2) DirectInput.CreateDevice(GUID_SysMouse,DirectInputMouse,nil);
 
   »ç¿ëÇÒ µð¹ÙÀ̽º¸¦ »ý¼ºÇÑ´Ù.
   GUID_SysMouse°¡ ù¹ø° ÆĶó¸ÞÅÍ·Î µé¾î °¬±â ¶§¹®¿¡ IDirectInputDevice
   ·Î ¼±¾ðµÈ º¯¼öÀÎ DirectInputMouseÀº ¸¶¿ì½º µð¹ÙÀ̽º·Î »ý¼ºµÈ´Ù.

3) DirectInputMouse.SetDataFormat(c_dfDIMouse);

   µð¹ÙÀ̽º¿¡ ´ëÇÑ µ¥ÀÌÅÍ Æ÷¸ËÀ» ¼³Á¤ÇÑ´Ù.
   ÇöÀç´Â ¸¶¿ì½º µð¹ÙÀ̽ºÀ̹ǷÎ, ¸¶¿ì½º Á¤º¸¸¦ À§ÇÑ ±¸Á¶Ã¼ Æ÷¸ËÀ̶ó´Â °Í
   À» µð¹ÙÀ̽º¿¡°Ô ¾Ë·ÁÁØ´Ù.
                     
4) DirectInputMouse.SetCooperativeLevel(Handle,
                                DISCL_EXCLUSIVE or DISCL_FOREGROUND);

   »óÈ£ Çù·Â ·¹º§À» ¼³Á¤ÇÑ´Ù. Å°º¸µå µð¹ÙÀ̽ºÀÏ ¶§¿Í´Â ´Þ¸® EXCLUSIVE ·Î
   ¼³Á¤À» ÇÑ °ÍÀ» ´«¿©°Ü º¸±â ¹Ù¶õ´Ù.  DISCL_EXCLUSIVE ·Î ¼³Á¤À» ÇÏ¸é ´Ù
   ¸¥ ÇÁ·Î±×·¥¿¡ ´ëÇؼ­´Â ¹èŸÀûÀ¸·Î ¸¶¿ì½º Á¤º¸¸¦ µ¶Á¡ÇÒ ¼ö°¡ ÀÖÀ¸¸ç ¸¶
   ¿ì½º Ä¿¼­´Â GDI ȯ°æ¿¡¼­ »ç¶óÁö°Ô µÈ´Ù.  Áï ¸¶¿ì½º Ä¿¼­´Â ÀÚ½ÅÀÌ Á÷Á¢
   ±×·ÁÁÖ¾î¾ß Çϴµ¥... ¸ðµç °ÔÀÓÀÌ ±×·¸µí µðÆúÆ® ¸¶¿ì½º´Â »ç¶óÁö°í ÀÚ½Å
   ÀÇ °ÔÀÓ¿¡ ¸Â´Â ¸¶¿ì½º Ä¿¼­°¡ ¶°¾ß ÇÒ °ÍÀÌ´Ù.

   ¹°·Ð DISCL_NONEXCLUSIVE ·Îµµ ¼³Á¤Çصµ µÈ´Ù. ±×·¸°Ô ÇÏ¸é ¸¶¿ì½º Ä¿¼­°¡
   ´«¿¡ º¸ÀÌ°Ô µÈ´Ù. ÇÏÁö¸¸ ¸¶¿ì½º¸¦ Àâ°í ³­µ¿À» ºÎ¸®¸é¼­ ¾Æ·¡ À§·Î Ä¿¼­
   ¸¦ ¿òÁ÷¿© º¸¸é ¿ø·¡ ¿øÇß´ø ÁÂÇ¥·ÎºÎÅÍ ÀÚ²Ù ¹þ¾î³­´Ù(¿ÀÂ÷°¡ ³­´Ù)´Â °Í
   À» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ( ¿©±â¼­ ÁÂÇ¥¶õ ³í¸®ÀûÀ¸·Î º¯·®À» °è»êÇؼ­ ³ªÅ¸
   ³»´Â ¸¶¿ì½º À§Ä¡¸¦ ¸»ÇÑ´Ù. )

   ±×¸®°í Å°º¸µå ÇÒ ¶§ »© ¸ÔÀº ºÎºÐÀÌ Àִµ¥, Å°º¸µå´Â ±âº»ÀûÀ¸·Î ¹èŸÀû
   À¸·Î  »ç¿ëµÇ¾î Áú¼ö°¡ ¾ø´Ù.  ÇÏÁö¸¸ Direct X 7.0 ¿¡¼­´Â Å°º¸µåµµ ¹èŸ
   ÀûÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù°í ÇÏ´Ï Âü°í·Î ¾Ë¾Æ µÎÀÚ.

5) DirectInputMouse.Acquire;

   µð¹ÙÀ̽ºÀÇ Á¢±Ù ±ÇÇÑÀ» ¾ò´Â´Ù. ÇöÀç´Â ¸¶¿ì½º·Î Á¤ÀǵǾî ÀÖÀ¸¹Ç·Î ¸¶¿ì
   ½º¿¡ ´ëÇÑ Á¢±Ù ±ÇÇÑÀÌ´Ù. Acquire¸¦ È£Ãâ ÇÏÁö ¾ÊÀ¸¸é ¸¶¿ì½ºÀÇ µ¥ÀÌÅ͸¦
   °¡Á® ¿Ã ¼ö ¾ø´Ù. ³ª¸ÓÁö´Â Å°º¸µåÀÏ ¶§¿Í °°´Ù.


±×·¯¸é À̹ø¿¡´Â ¼Ò¸êÀÚ¿¡ ´ëÇؼ­ ¾Ë¾Æ º¸ÀÚ.

| procedure   TDxInput.Free;
| begin
|    // ¸¶¿ì½º Á¢±Ù ±ÇÇÑ ÇØÁ¦
|    DirectInputMouse.Unacquire;
|
|    // Direct Input µð¹ÙÀ̽º °´Ã¼ ÇØÁ¦
|    DirectInputMouse._Release;
|    Pointer(DirectInputMouse) := nil;
|
|    // Direct Input °´Ã¼ ÇØÁ¦
|    DirectInput._Release;
|    Pointer(DirectInput) := nil;
|
|    // ¼±Á¶ÀÇ Free¸¦ ½ÇÇàÇÑ´Ù.
|    Inherited;
| end;

³»¿ëÀº Å°º¸µå À϶§¿Í ¿ÏÀüÈ÷ °°´Ù.


±×·³ ÀÌÁ¦ µü Çϳª ³²Àº °¡Àå Áß¿äÇÑ ÇÔ¼ö¸¦ º¸ÀÚ.
¿ª½Ã Å°º¸µåÀÏ ¶§¿Í ¿ë¹ýÀº °°´Ù.

| procedure TDxInput.GetMouseState(var MouseState : TMouseState);
| var
|    HR : HResult;
| begin
|    HR := DirectInputmouse.GetDeviceState(SizeOf(MouseState),@MouseState);
|    if HR = DIERR_INPUTLOST then DirectInputMouse.Acquire;
| end;

1) DirectInputMouse.GetDeviceState(SizeOf(KeyState),@KeyState);

   µð¹ÙÀ̽ºÀÇ »óŸ¦ Àд´Ù. ÇöÀç´Â DirectInputMouse°¡ ¸¶¿ì½º·Î Á¤ÀǵǾú
   À¸¹Ç·Î ¸¶¿ì½º¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÐ¾î ¿Â´Ù.

   Å°º¸µåÀÏ ¶§¿Í ´Ù¸¥ Á¡Àº TMouseState ¶ó´Â ±¸Á¶Ã¼ÀÌ´Ù..

| type
|    TMouseState = TDIMouseState;

   À§ÀÇ ¼Ò½º¿¡ º¸¸é ÀÌ·± ºÎºÐÀÌ ÀÖ´Ù. DInput Çì´õ¿¡ ÀÖ´Â TDIMouseState¸¦
   ±×´ë·Î »ç¿ëÇÑ °ÍÀε¥ TDIMouseState ÀÇ ±¸Á¶´Â ´ÙÀ½°ú °°´Ù.

   TDIMouseState = packed record
       lX: Longint;
       lY: Longint;
       lZ: Longint;
       rgbButtons: Array [0..3] of BYTE;
   end;

   IX - ¸¶¿ì½º°¡ X ÃàÀ¸·Î À̵¿ÇÑ º¯·®
   IY - ¸¶¿ì½º°¡ Y ÃàÀ¸·Î À̵¿ÇÑ º¯·®
   IZ - ¸¶¿ì½º°¡ Z ÃàÀ¸·Î À̵¿ÇÑ º¯·® ( 3 Â÷¿ø ¸¶¿ì½º Áö¿ø¿ëÀÌ´Ù. )
   rgbButtons[0] - ¿ÞÂÊ ¸¶¿ì½º ¹öÆ°ÀÌ ´­·¯Áö¸é MSB°¡ 1 ±×·¸Áö ¾ÊÀ¸¸é 0
   rgbButtons[1] - ¿À¸¥ÂÊ ¸¶¿ì½º ¹öÆ°ÀÌ ´­·¯Áö¸é MSB°¡ 1 ±×·¸Áö ¾ÊÀ¸¸é 0
   rgbButtons[2] - 2 ¹öÆ° ÀÌ»óÀÇ ¸¶¿ì½º Áö¿ø¿ë
   rgbButtons[3] - 2 ¹öÆ° ÀÌ»óÀÇ ¸¶¿ì½º Áö¿ø¿ë

   ÀÌ·¸°Ô ÀÌ·ç¾îÁ® ÀÖ´Ù.


------------------------------------------------------------------------

(3) Direct Input ÀÇ Mouse °´Ã¼ ¿ë¹ý

°´Ã¼¸¦ ±¸ÇöÇßÀ¸´Ï ÀÌÁ¦´Â »ç¿ëÇÏ´Â ¹æ¹ý¸¸ ³²¾Ò´Ù.

ÀÏ´Ü °´Ã¼ÀÇ ¼±¾ðÀº ´ÙÀ½Ã³·³ ÇÏ¸é µÈ´Ù.
    DxInput : TDxInput;

±×¸®°í »ý¼ºÀº
    DxInput := TDxInput.Create(hInstance,Handle);

¼Ò¸êÀº
    DxInput.Free;
    DxInput := nil;

ÀÌ·¸°Ô »ç¿ëÇÑ´Ù.

±×·¸´Ù¸é ¿ë¹ýÀ» º¸ÀÚ...

| var
|    MouseState : TMouseState;
|
| begin
|    // MouseState ¿¡ ¸¶¿ì½º »óŸ¦ °¡Á®¿Â´Ù.
|    DxInput.GetMouseState(MouseState);
|
|    // ÇöÀçÀÇ x, y º¯·®À» ´õÇÑ´Ù.
|    Inc(MousePos.X,MouseState.lX);
|    Inc(MousePos.Y,MouseState.lY);
|    // ¸¶¿ì½º ¹öÆ°ÀÌ ´­·ÁÁ³´ÂÁöÀÇ ¿©ºÎ¸¦ ¾Ë¾Æ º»´Ù.
|    if MouseState.rgbButtons[0] and $80 > 0 then
|    if MouseState.rgbButtons[1] and $80 > 0 then

º¸´Ù½ÃÇÇ ÇÑ ¹ø¿¡ ¸¶¿ì½º À§Ä¡ Á¤º¸¿Í  ¸¶¿ì½º ¹öÆ° Á¤º¸¸¦ ¾ò¾î ¿À±â ¶§¹®¿¡
ºü¸¦¼ö ¹Û¿¡ ¾ø´Ù. ±×¸®°í À©µµ¿ìÀÇ ¸Þ¼¼ÁöµîÀ» °ÅÄ¡Áö ¾Ê±â°í ¹Ù·Î Çϵå¿þ¾î
ÀÎÅÍ·´Æ®¿¡¼­ ¾ò¾î ¿À±â ¶§¹®¿¡ ºÎÇϵµ Àû´Ù.

------------------------------------------------------------------------

(4) Direct Input ÀÇ Mouse °´Ã¼ »ç¿ë ¿¹Á¦

±×·³ ½ÇÁ¦·Î »ç¿ëÀ» Çغ¸ÀÚ¸é....

1. À§¿¡¼­ ¸¸µç Direct Input °´Ã¼¸¦ µû·Î Unit ·Î ÀúÀåÇÑ´Ù.

2. »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ ¸¸µé°í, Unit1 ¿¡´Â ¹æ±Ý ¸¸µç Direct Input °´Ã¼°¡ ÀÖ
   ´Â unit¸¦ usesÇÑ´Ù. ±×¸®°í Direct Input Çì´õÀÎ DInput.Pas µµ usesÇÑ´Ù.

3. Æû¿¡´Â ŸÀ̸Ó, ¶óº§, ¹öÆ°À» ¸¸µç´Ù.

4. TForm1 ÀÇ public ¿¡ 'DxInput : TDxInput;' À» Ãß°¡ÇÑ´Ù.
   ±×¸®°í 'MousePos : TPoint;' µµ Ãß°¡ÇÑ´Ù.  ÀÌ°ÍÀº ¸¶¿ì½º Ä¿¼­ÀÇ ÇöÀ§Ä¡
   ¸¦ ±â¾ïÇØ µÎ±â À§Çؼ­ ÇÊ¿äÇÏ´Ù.

5. ¹öÆ°ÀÇ Å¬¸¯ À̺¥Æ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

   DxInput  := TDxInput.Create(hInstance,Handle);
   MousePos := Point(0,0);
   Timer1.Enabled := TRUE;

6. Form ÀÇ Close À̺¥Æ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

   Timer1.Enabled := FALSE;
   DxInput.Free;
   DxInput := nil;

7. ŸÀÌ¸Ó À̺¥Æ®ÀÇ IntervalÀ» 1·Î ÇÏ°í À̺¥Æ®¿¡´Â ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.

var
   MouseState : TMouseState;
   s          : string;
begin
   DxInput.GetMouseState(MouseState);
   Inc(MousePos.X,MouseState.lX);
   Inc(MousePos.Y,MouseState.lY);
   s := Format('(%4d,%4d) ',[MousePos.X,MousePos.Y]);
   if MouseState.rgbButtons[0] and $80 > 0 then s := s + 'Left Button ';
   if MouseState.rgbButtons[1] and $80 > 0 then s := s + 'Right Button ';
   Label1.Caption := s;
end;

8. ½ÇÇàÇÑ´Ù.

9. ¹öÆ°À» ´©¸£¸é Direct Input ÀÇ ¸¶¿ì½º Çڵ鸵ÀÌ ½ÃÀ۵Ǵµ¥...  ¸¶¿ì½ºÀÇ
   ¿òÁ÷ÀÓÀ̳ª ¹öÆ°ÀÇ ´©¸§À» Ç¥½ÃÇØ ÁØ´Ù.  µ¿½Ã¿¡ ¹öÆ°À» ´­·¯µµ ¿ª½Ã °á°ú
   ´Â °°´Ù. ( ¸¶¿ì½º ÁÂÇ¥ÀÇ ±âÁØÀº Direct InputÀÌ ½ÃÀÛÇÒ¶§ÀÇ ¸¶¿ì½º À§Ä¡
   °¡ (0,0) À¸·Î ¼³Á¤µÈ´Ù. )


------------------------------------------------------------------------

<< ¿¡ÇÊ·Î±× >>

 Áö±Ý±îÁö ¼³¸íÇÑ °ÍÀº Direct X ÀÇ ÀÔ·Â µð¹ÙÀ̽º ºÎºÐÀÎ Direct Input ºÎºÐ
À̾ú½À´Ï´Ù.  µ¨ÆÄÀÌ·Î °ÔÀÓ ¸¸µå½Ã·Á´Â ºÐµé²²  Á¶±ÝÀ̳ª¸¶ µµ¿òÀÌ µÇ¾úÀ¸¸é
ÁÁ°Ú½À´Ï´Ù.

 Áö±Ý±îÁö µ¨ÆÄÀÌ·Î Direct Draw, ¸ÖƼ¹Ìµð¾î ŸÀ̸Ó, DIB, Direct Input  ¿¡
´ëÇÑ °­Á¸¦ Çߴµ¥..... ¾ÕÀ¸·Î µ¨ÆÄÀÌ·Î ÇÏ´Â Direct Sound, Direct Music,
Direct Play ¿¡ ´ëÇÑ °­Á¸¦ ´õ ÇÏ°í ½Í½À´Ï´Ù..

 ÀÏ¿äÀÏ ÇϷ縦 ÅõÀÚÇؼ­ 2Æí ºÐ·®ÀÇ °­Á¸¦ ÇßÀ¸´Ï, ¾ÕÀ¸·Îµµ ÀÏ¿äÀϸ¶´Ù ÀÌ
Á¤µµ ºÐ·®ÀÇ °­Á¸¦ ÇØ ³ª°¡°í ½Í½À´Ï´Ù. ±×·³ °ü½É ÀÖÀ¸½Å ºÐµéÀº ¸¹ÀÌ ±â´ë
ÇØ ÁÖ¼¼¿ä..

 ±×·³ ¸¶Áö¸·À¸·Î ÇѸ¶µð ³²±â°Ú½À´Ï´Ù.

          " A mountain is a mountain, Water is water. "
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                          1999 / 10 / 31