ÀÌ°ÍÀº 1998³â 1¿ù 31ÀϱîÁö ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸¿¡ ¿Ã·È´ø °­Á 8ȸºÐ ÀÔ´Ï´Ù.

                                              ¹ÙÀ̳ʸ® µ¥ÀÌÅÍ

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

                   ÇÏÀÌÅÚ °ÔÀÓÁ¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (0) - ÇÁ·Ñ·Î±×
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 Á¦°¡ °ÔÁ¦µ¿¿¡ È°µ¿À» Çϸ鼭 ¹«¾ð°¡ ±â·ÏÀ» ³²±â°í ½ÍÀº ¸¶À½¿¡  ÀÌ·± °­ÁÂ
¸¦ Çϱâ·Î ¸¶À½ ¸Ô¾ú½À´Ï´Ù.

 ÇöÀç À©µµ¿ì¿ë °ÔÀÓÀ» ¸¸µé±â À§Çؼ­ ´©±¸³ª ÇÒ °Í ¾øÀÌ »ç¿ëÇÏ·Á ÇÏ´Â °ÍÀÌ
¹Ù·ÎÀÌ '´ÙÀÌ·ºÆ® X'( ÀÌÈÄ DX ·Î Ç¥±â ) ÀÔ´Ï´Ù.

 ÇÏÁö¸¸ ÀÌ°ÍÀº ¿ì¸®³ª¶ó¿¡ Á¦´ë·Î µÈ ¹ø¿ªº»ÀÌ ¾ø±â ¶§¹®¿¡ óÀ½ ½ÃÀÛÇÏ·Á´Â
ºÐµé¿¡°Ô´Â ÇÔ²² Á¦°øµÇ´Â ¿µ¹® ÇïÇÁ ÆÄÀÏÀÌ µÎ·Æ±â´Â ¾î¿ ¼ö ¾ø´Â ³ë¸©Àε¥
´Ù°¡ ¹ø¿ªº» ¸¶Àú ¾î»öÇÑ ±¸ÀýÀ» »ç¿ëÇÏ¿© ¿ì¸®µéÀÇ ÀλóÀ» ÂîǪ¸®°Ô ÇÏ´Â °Í
¿¡´Â Ʋ¸²¾ø´Â »ç½ÇÀÔ´Ï´Ù.

 Á¦°¡ À̹ø °­Á¿¡ ±× ¸¹Àº ¸ðµå Áß¿¡¼­ Æ®·çÄ÷¯¸¦ ÇÏ´Â³Ä Çϸé, »ó´ëÀûÀ¸·Î
ÇÁ·Î±×·¡¹ÖÀÌ ½¬¿î ¸ðµåÀε¥´Ù°¡  ¾ÕÀ¸·Î ÇØ°¡ °¥ ¼ö·Ï °í±âÁ¾ÀÇ Ãß¼¼ÀÌ°í ±×
·¡ÇÈ Ä«µåÀÇ ¹ßÀüµµ ÇѸò ´Ü´ÜÈ÷ ÇÏ¿© ¾Õ ¼± ¹Ì·¡¿¡´Â  Æ®·çÄ÷¯°ÔÀÓµµ ºÎÁö
±â¼ö·Î ³ª¿Ã °ÍÀ̶ó´Â ÀúÀÇ ¿¹»ó¿¡¼­ÀÔ´Ï´Ù.
( Á¦ ÁÖ°üÀû ÀÔÀå¿¡¼­´Â Æ®·çÄ÷¯ 3D ³×Æ®¿öÅ© °ÔÀÓÀÌ ÃÖ°íºÀÀÌ µÉ ¶§°¡ ¹Ýµå
  ½Ã ¿Ã °Í °°Àº ´À³¦ÀÔ´Ï´Ù¸¸..... )

 ¿©±â¼­ ´Ù·ç´Â Æ®·çÄ÷¯¶õ ¹Ù·Î 24bit Ä÷¯¸¸À» µûÁö°Ú½À´Ï´Ù.  ¾î°¼­ ¿ä»õ
¸¸¸¸Ä¡ ¾Ê°Ô Áö¿øÇÏ´Â 32bit Ä÷¯·Î °­ÁÂÇÏÁö ¾Ê´À³Ä°í ¹°À¸½Å´Ù¸é Àú´Â ´ç´ç
ÇÏ°Ô ÀÌ·¸°Ô ¸»ÇÏ°Ú½À´Ï´Ù.

 " ¿ì¸®Áý ET4000 Àº 640 * 480 * 24bit °¡ ÃÖ°í »ç¾çÀÔ´Ï´Ù. " ¶ó°í..

 ÇÏÁö¸¸ 24bit ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑ »ç¶÷Àº º°´Ù¸¥ ³ë·Â ¾øÀÌ 16bit ÇÏÀÌÄ÷¯
³ª 32bit Æ®·çÄ÷¯¸¦ ´Ù·ç°Ô µÉ °ÍÀÓÀ» È®½ÅÇϱ⠶§¹®¿¡  ±×ÂÊ¿¡ ´ëÇÑ ¾ð±ÞÀº
°ÅÀÇ ÇÏÁö ¾ÊÀ» ¿¹Á¤ÀÔ´Ï´Ù.

 ¾ð¾î´Â "µ¨ÆÄÀÌ 3" À¸·Î ¸¸µé °ÍÀÌ°í ¸ðµç ¼Ò½º¿Í ¸®¼Ò½ºµéÀº °ÔÁ¦µ¿ ÀÚ·á½Ç
¿¡ µî·ÏÀÌ µÉ°Ì´Ï´Ù.. ( °­Á ³¡³ª°¥ ¹«·Æ¿¡.. )

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

 ±×·³ ¾ÕÀ¸·ÎÀÇ °­Á Ŀ¸®Å¥·³ÀÔ´Ï´Ù.

< Á¤±Ô °­Á >

   1. ´ÙÀÌ·ºÆ® X Æ®·çÄ÷¯ ÃʱâÈ­...
   2. ´ÙÀÌ·ºÆ® X ¿¡ ´ëÇÑ Çڵ鷯 ¼³Ä¡... ( ¿¹¿Ü, ¿¡·¯, À̺¥Æ®... )
   3. ´ÙÀÌ·ºÆ® X DDERROR_SURFACELOST ¿¡ ´ëÇÑ ´ëºñ
   4. ´ÙÀÌ·ºÆ® X³»Àå ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÑ ±âº»ÀûÀÎ À̹ÌÁö Âï±â
   5. °ÔÀÓÀ» À§ÇÑ ±âº» Ŭ·¡½º ±¸¼º(1)
   6. °ÔÀÓÀ» À§ÇÑ ±âº» Ŭ·¡½º ±¸¼º(2)
   7. Lock() À» ÀÌ¿ëÇÏ¿© Á÷Á¢ ºñµð¿À ¸Þ¸ð¸®¿¡ Âï±â
      + ¹ÝÅõ¸í È¿°ú ¸¸µé±â

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

°­Á¿¡ ¾Õ¼­ ÁÖÀÇÁ¡....

1. ÀÌ °­Á¸¦ Ÿ µ¿È£È¸¿¡ Çã¶ô ¾øÀÌ °ÔÁ¦ÇÏ´Â ÇàÀ§¸¦ ¹Ì¿öÇÒ °ÍÀÔ´Ï´Ù.
2. Á¦°¡ ÀÌÈÄ °­Á¿¡ ¹Ý¸»À» ¾²°Ô µÉ°ÍÀÓÀ» ¹Ì¸® ¾Ë·Á µå¸®´Â ¹ÙÀÔ´Ï´Ù.
3. ´ÙÀÌ·ºÆ® X -> DX,  Àú -> ÇÊÀÚ  µîÀ¸·Î ȣĪ º¯È­°¡ ÀÖÀ» °ÍÀÔ´Ï´Ù.

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (1) - ´ÙÀÌ·ºÆ® X Æ®·çÄ÷¯ ÃʱâÈ­
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 ÀÌÁ¦ DXÀÇ °¡Àå ±âÃÊ°¡ µÇ´Â 'DX ÃʱâÈ­'¸¦ ½ÃÀÛÇÑ´Ù.  ÇÁ·Ñ·Î±×¿¡¼­ ¿¹°íÇÑ
¹Ù¿Í °°ÀÌ ¾ð¾î´Â 'µ¨ÆÄÀÌ 3' À̸ç ÀÌÇÏÀÇ ¹öÀü¿¡¼­´Â Á¤È®ÇÑ ¼öÇàÀ» ¿¹»ó ÇÒ
¼ö°¡ ¾ø´Ù. ±×¸®°í MS ¿¡¼­ Á¦°øµÈ DDRAW.PAS ¸¦ ÀÌ¿ëÇؼ­ DDRAW.DLL À» ¿¬°á
ÇÒ °ÍÀ̸ç 'µ¨ÆÄÀÌ 2 ¾ð¸®½¬µå' ÀÇ ÀúÀÚ°¡ ¸¸µç DDUTILS.PAS ( DX¿¡¼­ ºñÆ®¸Ê
°ú ÆÈ·¹Æ®¿¡ ´ëÇÑ ÇÔ¼ö¸¦ ½±°Ô ¸¸µç À¯´Ö ) ¸¦ »ç¿ëÇÏ¸ç ¸ðµç °ÍÀ» ÁøÇàÇØ ³ª
°¥ °ÍÀÌ´Ù. ( ÀÌ ÆÄÀϵéÀº ÃßÈÄ¿¡ ÀÚ·á½Ç¿¡ µî·Ï ¿¹Á¤ )

 ±×¸®°í ¿©±â¿¡ ³ª¿À´Â ÃʱâÈ­ ÄÚµå´Â 'µ¨ÆÄÀÌ 2 ¾ð¸®½¬µå' ¶ó´Â Ã¥¿¡¼­ ¹è¿î
°ÍÀÌ´Ï ¸¸Å­ »ó´çÈ÷ À¯»çÇÑ Äڵ尡 ¸¹À¸¸ç ÇÔ¼ö¸íµµ ¿øÇüÀ» µû¸¥ °ÍÀÌ ¸¹´Ù´Â
°ÍÀ» ¹Ì¸® ¹àÇô µÎ´Â ¹ÙÀÌ´Ù.  ÇÏÁö¸¸ ³ª¸ÓÁö DX ½ºÆå¿¡ °üÇÑ ÀÚ·á´Â ¸ðµÎ DX
ÇïÇÁ¿¡ ¾ð±ÞµÈ ¿ø¼­¸¦ ¹ø¿ªÇÏ¿© µ¶ÀÚÀûÀ¸·Î ±â¼úÇÏ¿© ¿©·¯ºÐ²² ¼³¸íÇÏ´Â °ÍÀÌ
´Ù. ±× ÀÌÀ¯´Â ±¹³» ¹ø¿ª¼­¿¡¼­ ´©¶ôµÇ°Å³ª ¿À¿ªÇÑ ºÎºÐÀÌ ÀÖÀ»Áöµµ ¸ð¸¥´Ù´Â
ÇÊÀÚÀÇ ±â¿ì ¶§¹®À̱⵵ ÇÏ´Ù.

 ´Ù½Ã ÇÑ ¹ø ³ëÆĽɿ¡¼­ ¸»¾¸ µå¸®´Â °ÍÀÌÁö¸¸ ÀÌ °­Á´ DX ÁßÇϱÞÀÚ¸¦ À§ÇÑ
°ÍÀÌ¸é µ¨ÆÄÀÌ »ç¿ë¿¡ ¹«¸®°¡ ¾ø´Â ÀÚ¸¦ ±âÁØÀ¸·Î ÇÑ´Ù.  µû¶ó¼­ µ¨ÆÄÀÌ ¹®¹ý
À̳ª »ç¿ë¹ýÀº ÀüÇô ¾ð±ÞÇÏÁö ¾ÊÀ» °ÍÀÌ¸ç  DX ±âº» ÇÔ¼ö µîµµ °¡º±°Ô ¹«½ÃÇÏ
°í ³Ñ¾î°£´Ù..

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

(1) »õ·Î¿î ÇÁ·ÎÁ§Æ®ÀÇ ½ÃÀÛ

  ¸ÕÀú New Application ¿¡¼­ »õ·Î¿î ÇÁ·ÎÁ§Æ®¸¦ ½ÃÀÛÇÑ´Ù.

  ÆûÀº ¸¶À½´ë·Î ±¸¼ºÇصµ ¹«¹æÇϳª ½ÇÁ¦ ÆûÀº DX »ó¿¡¼­ ÀüÇô ³ªÅ¸³ªÁö ¾ÊÀ»
 °ÍÀ̹ǷΠȭ¸é Å©±â¸¦ ÁÙÀΠä ±¸¼®¿¡ µÎ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.

  ÆûÀ» ¸¸µé°í ÇØÁÖ¾î¾ß ÇÏ´Â °ÍÀº ´Ü ÇÑ°¡ÁöÀÌ´Ù. ÆûÀÇ Name ¼Ó¼ºÀº 'Basic'
 À¸·Î ¹Ù²Ù¾î¶ó.  ÀÌ°Ç ÇÊÀÚÀÇ ÄÚµå ½À°üÀÌ°ÚÁö¸¸ ¾ÕÀ¸·Î ¼³¸íµÉ ÆûÀÇ À̸§ÀÌ
 ¸ðµÎ Basic À̶õ À̸§ÀÇ °´Ã¼ ÀÏ °ÍÀ̱⠶§¹®ÀÌ´Ù.

  Save Project As ¶ó´Â °÷¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ ¼¼À̺êÇÑ´Ù. À̶§ÀÇ *.DPR À̸§Àº
 'DX24Bit1.Pas' ·Î ÇÏ°í À¯´ÖÀº 'MainUnt1'À¸·Î ÇØÁÖ±æ ¹Ù¶õ´Ù.
 ¾ÕÀ¸·ÎÀÇ °­ÀÇ ¹öÀü¿¡ µû¶ó ¿¹Á¦ ¼Ò½º´Â ¹øÈ£°¡ Áõ°¡ÇÒ °ÍÀÌ´Ù.

  ±×·³ ¸¸µé¾îÁö´Â ¼Ò½º´Â ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

|  program Dx24bit1;
|
|  uses
|    Forms,
|    MainUnt1 in 'MainUnt1.pas' {Basic};
|
|  {$R *.RES}
|
|  begin
|    Application.Initialize;
|    Application.CreateForm(TBasic, Basic);
|    Application.Run;
|  end.

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

(2) TBasic °´Ã¼ÀÇ Á¶¼º

  ÀÌÁ¦´Â ¸ðµç °ÍÀÌ 'MainUnt1.Pas'¿¡¼­ ÀÌ·ç¾îÁø´Ù.

  interface ¾Æ·¡¿¡ ´ÙÀ½°ú °°Àº °ÍÀ» Ãß°¡ÇÏÀÚ.

|  uses
|     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
|     Dialogs, DDraw, DDUtils;
|              ~~~~~~~~~~~~~~~ <- ¹ØÁÙ ±×Àº °Å Ãß°¡ Ç϶õ ¸»¾¸..

  À§¿¡µµ ¼³¸íÇßÁö¸¸ DDraw ´Â DDRAW.DLL À» »ç¿ëÇϱâ À§ÇÑ °ÍÀÌ°í,  DDUtils
 ´Â ºñÆ®¸Ê°ú ÆÈ·¹Æ®¸¦ Á» ´õ ½±°Ô »ç¿ëÇÏ°íÀÚ ¸¸µé¾îÁø À¯´ÖÀ¸·Î  ÇÊÀÚ°¡ ¸¸
 µç °ÍÀÌ ¾Æ´Ï´Ù.

  ±× ¾Æ·¡¿£ ´ÙÀ½°ú °°Àº »ó¼ö¸¦ ¼±¾ðÇÏÀÚ.

|  const
|     MAX_IMAGE_SURFACE = 1;         // ÀÐ¾î µéÀÏ À̹ÌÁö Ç¥¸éÀÇ ¼ö
|     BitmapName        = 'Test';    // À̹ÌÁö°¡ ÀÖ´Â ºñÆ®¸Ê À̸§
|     MAX_X_LINE        = 640;       // ¸¸µé È­¸éÀÇ °¡·Î Å©±â
|     MAX_Y_LINE        = 480;       // ¸¸µé È­¸éÀÇ ¼¼·Î Å©±â
|     BPP               = 3;         // Çȼ¿´ç ¹ÙÀÌÆ®.. 24 / 8 ÀÌ´Ù.

  ±×·¸´Ù¸é ¹Ù·Î ¾Æ·¡¿¡´Â

|  type
|     TBasic = class(TForm)
|     ........

  ÀÌ·± ±¸¹®ÀÌ ÀÖÀ» °ÍÀÌ´Ù.. ÀÌÁ¦´Â ÀÌ°ÍÀ» ¾Æ·¡¿Í °°ÀÌ Ã¤¿î´Ù.

|  type
|     TBasic = class(TForm)
|
|     private
|        function  GetBitmapName(i : integer) : string;
|
|     public
|        FPixelFormat   : (pfRGB, pfBGR);
|
|        DirectDraw     : IDirectDraw2;
|        PrimarySurface : IDirectDrawSurface2;
|        BackBuffer     : IDirectDrawSurface2;
|        Image          : array[1..MAX_IMAGE_SURFACE] of
|                                IDirectDrawSurface2;
|     end;
|
|  var
|     Basic: TBasic;
|
|  implementation
|  .....................

  À§ÀÇ ³»¿ëÀ» ÇϳªÇϳª ¼³¸íÇÏÀÚ¸é...

  1) function  GetBitmapName(i : integer) : string;
                  - ÀÌ°ÍÀº i ¶ó´Â ¼ýÀÚ¿¡ ´ëÇÑ BitmapNameÀÇ Á¤º¸¸¦ ¸®ÅÏÇÑ
                    ´Ù. ¸¸¾à i °¡ 1 À̶ó¸é 'Test1.Bmp'¸¦ ¸®ÅÏ ÇÒ °ÍÀÌ´Ù.
                    ÀÌ°ÍÀº Ç×»ó EXE ½ÇÇà µð·ºÅ丮¸¦ ±âÁØÀ¸·Î ºñÆ®¸ÊÀ» Áö
                    Á¤ÇÏ°Ô µÈ´Ù.

  2) FPixelFormat - ÀÌ°ÍÀº 24bit Æ®·çÄ÷¯ÀÇ Çȼ¿ Æ÷¸Ë¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã´Â
                    private º¯¼öÀÌ´Ù. À̶§ °¡Áú ¼ö ÀÖ´Â °æ¿ìÀÇ °ªÀº µÎ°¡
                    Áö·Î½á RGB Æ÷¸Ë°ú BGR Æ÷¸ËÀÌ ÀÖ´Ù.  °¢°¢ÀÇ Æ÷¸ËÀº ±×
            ·¡ÇÈ Ä«µå¿¡ ÀüÀûÀ¸·Î ±âÀÎÇÑ´Ù.

  3) DirectDraw     : IDirectDraw2;
                  - ÀÌ°ÍÀº °¡Àå ÇÙ½ÉÀÌ µÇ´Â DirectDraw ÀÇ °´Ã¼ º¯¼öÀÌ´Ù.

  4) PrimarySurface : IDirectDrawSurface2;
     BackBuffer     : IDirectDrawSurface2;
                  - ÀÌ°ÍÀº ±âº» ¹öÆÛ¿Í ¹é ¹öÆÛ¿¡ ´ëÇÑ DirectDraw Surface
                    °´Ã¼ÀÌ´Ù.

  5) Image          : array[1..MAX_IMAGE_SURFACE] of IDirectDrawSurface2;
                  - ÀÌ°ÍÀº ½ºÇÁ¶óÀÌÆ®³ª À̹ÌÁö¸¦ ÂïÀ» ¶§ »ç¿ëµÇ´Â ºñÆ®¸Ê
              À» ÀúÀåÇØ ³õ´Â Ç¥¸é °ø°£À¸·Î, ºñµð¿À ¸Þ¸ð¸®°¡ ºÎÁ·ÇÒ
                    ¶§´Â ÀÚµ¿À¸·Î ¸Þ¸ð¸®ÀÇ ÇÑ ¿µ¿ªÀ¸·Î ¼³Á¤µÈ´Ù.

  À§¿¡¼­ ¿ì¸®°¡ ÇÔ¼ö Çϳª¸¦ ¼±¾ð¸¸ ÇØ ³õÀº ä·Î µÎ¾úÀ¸´Ï, ¸¶Àú ¸¸µé°í ³Ñ
 ¾î °¡´Â °ÍÀÌ µµ¸®ÀÏ °Í °°´Ù.

|  function TBasic.GetBitmapName(i : integer) : string;
|  begin
|     GetBitmapName := ExtractFilePath(Application.ExeName)
|                      + BitmapName + IntToStr(i) + '.BMP';
|  end;

  ÀÌ ÇÔ¼ö´Â implementation ¿µ¿ª¿¡ ¾Æ¹« °÷À̳ª µÎ¸é µÈ´Ù.

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

(3) OnCreate À̺¥Æ® ¼³Á¤

  ÀÌÁ¦ DX °´Ã¼ »ý¼ºÀ» À§ÇØ Äڵ带 ÀÛ¼º ÇÒ ¶§ÀÌ´Ù.
 Object Inspector ÀÇ Events ÅÇÀ» ´©¸¥ ÈÄ¿¡ OnCreate À̺¥Æ®¸¦ ´õºí Ŭ¸¯ÇÑ
 ´Ù. ±×·¯¸é ¾Æ·¡¿Í °°Àº Äڵ尡 ´ç¿¬È÷ ³ªÅ¸³­´Ù.

|  procedure TBasic.FormCreate(Sender: TObject);
|  begin
|
|  end;

  ¹°·Ð ±× ¾ÈÀ» ä¿ì´Â °ÍÀº ¿ì¸®¿¡°Ô ³²°ÜÁø ¸·ÁßÇÑ »ç¸íÀÓÀ» »ó±âÇÏÀÚ.

|  procedure TBasic.FormCreate(Sender: TObject);
|  begin
|
|     if DirectDrawCreate2(nil,DirectDraw,nil) <> DD_OK then
|        Raise Exception.Create('DirectDraw °´Ã¼ »ý¼º ½ÇÆÐ');
|
|     Color       := clBlack;
|     BorderStyle := bsNone;
|     Cursor      := crNone;
|
|  end;

  ¿ì¸®°¡ ÇØÁÙ °ÍÀº ÀÌ°ÍÀÌ ÀüºÎÀÌ´Ù.

  DirectDrawCreate2 ÀÇ ¼¼ ¹ø° Àμö´Â Ç×»ó nil( = NULL)À̸ç ù ¹ø° Àμö
 µµ nil ·Î »ç¿ëÇÏ°Ô µÉ °ÍÀÌ´Ù.

  ¿ì¸®°¡ °í·ÁÇÒ °ÍÀº µÎ ¹ø° Àμö·Î½á IDirectDraw2 ·Î ¼±¾ðµÈ °´Ã¼°¡ ·¹ÆÛ
 ·±½º·Î ³Ñ¾î°¡°Ô µÈ´Ù. C ¸¦ »ç¿ëÇϽŠºÐÀ̶ó¸é Æ÷ÀÎÅÍ·Î ³Ñ°ÜÁá´Ù´Â ±â¾ïÀÌ
 ³²¾Æ ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸ ÆĽºÄ®Àº C ¿Í´Â ´Þ¸® ´ëºÎºÐÀÇ Æ÷ÀÎÅ͸¦ ·¹ÆÛ·±
 ½ºÇüÀ¸·Î ³Ñ°ÜÁֱ⠶§¹®¿¡  ¾ÕÀ¸·ÎÀÇ Àμö Àü´Þ¿¡µµ Æ÷ÀÎÅÍ´Â °ÅÀÇ »ç¿ëµÇÁö
 ¾ÊÀ» °ÍÀÌ´Ù.

  DirectDrawCreate2 ´Â ¸®ÅÏ °ªÀ¸·Î HResult¸¦ °¡Áö´Âµ¥ DD_OK °¡ ¾Æ´Ï¸é ¾î
 ¶°ÇÑ ÀÌÀ¯¿¡¼­µµ È£Ãâ ½ÇÆзΠ°£ÁÖÇÒ ¼ö ÀÖÀ¸¹Ç·Î  ¿¹¿Ü¸¦ ÀÏÀ¸Å°µµ·Ï ÇØ ³õ
 ¾Ò´Ù. Terminate ¸¦ ½ÃÅ°Áö ¾Ê´Â ÀÌÀ¯´Â ÇÁ·Î±×·¥ÀÇ ½Å·Ú¼ºÀ» À§ÇÑ °ÍÀÌ´Ù.

  ±×¸®°í ³ª¸ÓÁö 3ÁÙÀº ¸¸µé¾îÁú ÆûÀÇ »óŸ¦ ³ªÅ¸³»´Â °ÍÀ¸·Î °¢°¢ 'ÆûÀÇ »ö
 »óÀ» °Ë°Ô', 'ÆûÀÇ ¿Ü°û¼±À» ¾ø°Ô', 'Æû À§¿¡ Ä¿¼­ Á¦°Å' ¸¦ ³ªÅ¸³½´Ù. ¾îÂ¥
 ÇÇ DX ¿¡¼­ Ç® È­¸éÀ» ¸¸µé¾î ¹ö¸®¸é »çÀÌÁî¿¡ ´ëÇÑ Á¤º¸´Â ¹«ÀǹÌÇϹǷΠ¿©
 ±â¿¡ ³ÖÀ» ÇÊ¿ä°¡ ¾ø´Ù.

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

(4) OnShow À̺¥Æ® ¼³Á¤

  À̹øÀÇ À̺¥Æ®°¡ DX ÃʱâÈ­ÀÇ °¡Àå Áß¿äÇÑ ºÎºÐÀÌ´Ù.
 ¿ª½Ã, Object Inspector ÀÇ Events ÅÇÀ» ´©¸¥ ÈÄ¿¡ OnShow À̺¥Æ®¸¦ ´õºí Ŭ
 ¸¯ÇÑ´Ù. ±×·¯¸é ¾Æ·¡¿Í °°Àº Äڵ尡 ³ªÅ¸³­´Ù.

|  procedure TBasic.FormShow(Sender: TObject);
|  begin
|
|  end;

  ¿©±â¼­´Â º¯¼öÀÇ ¼±¾ðÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½°ú °°ÀÌ Àûµµ·Ï ÇÑ´Ù.  Å¸ÀÔ¿¡ ´ëÇÑ
 ¼³¸íÀº ±× º¯¼ö°¡ »ç¿ëµÉ ¶§ °°ÀÌ ÇÏ°Ú´Ù.

|  var
|     i             : integer;
|     DDSurfaceDesc : TDDSurfaceDesc;
|     DDSCaps       : TDDSCaps;
|     DDPixelFormat : TDDPixelFormat;
|     ColorKey      : TDDColorKey;

  ´ÙÀ½Àº ³Ö¾î¾ß ÇÒ Äڵ带 ¼øÂ÷ÀûÀ¸·Î ³ª¿­ÇÏ°í ¼³¸íÇÏ°Ú´Ù.


|     if not Assigned(DirectDraw) then exit;

  ¸¸¾à DirectDraw °´Ã¼°¡ »ý¼ºµÇ¾î ÀÖÁö ¾ÊÀ¸¸é ÇÔ¼ö¸¦ ³¡³½´Ù.
  ÀÌ°ÍÀº ¸ðµç °æ¿ì¸¦ ´ëºñÇϱâ À§ÇÑ ¹æ¹ýÀÌ´Ù.


|     if DirectDraw.SetCooperativeLevel(Handle,DDSCL_EXCLUSIVE or
|                   DDSCL_FULLSCREEN or DDSCL_ALLOWREBOOT) <> DD_OK then
|        Raise Exception.Create('¹èŸÀû Ç® ½ºÅ©¸° ¾ò±â ½ÇÆÐ');

  ¹èŸÀû Ç® ½ºÅ©¸° ¸ðµå·Î ¼³Á¤ÇÑ´Ù.
 Ã¹ ¹ø° ÀμöÀÎ Handle Àº Æû¿¡ ´ëÇÑ ÇÚµéÀ̸ç, µÎ ¹ø° Àμö´Â ´ÙÀ½°ú °°Àº
 °Íµé·Î or ¿¬»êÀ¸·Î °áÇÕÇÒ ¼ö ÀÖ´Ù.

     DDSCL_ALLOWMODEX      : ¸ðµå X ( 320*200 ¶Ç´Â 320*240 ) ¸¦ °¡´ÉÇÏ°Ô
                            ÇÑ´Ù. ¿ì¸®¿¡°Õ Ç÷£ ¸ðµå·Î ´õ Àß ¾Ë·ÁÁ® ÀÖ´Ù.
     DDSCL_ALLOWREBOOT     : Ç® ½ºÅ©¸° ¸ðµå¿¡¼­ Ctrl+Alt+Del ·Î ¸®ºÎÆÃÀÌ
                            °¡´ÉÇÏ°Ô ÇÑ´Ù.
     DDSCL_EXCLUSIVE       : ¹èŸÀû ½ºÅ©¸° ¸ðµå¸¦ ¿ä±¸ÇÑ´Ù.
     DDSCL_FULLSCREEN      : GDI ¸¦ ¿ÏÀü ¹«½ÃÇÏ´Â Ç® È­¸é ¹èŸ ¸ðµå¸¦ Áö
                            ½ÃÇÑ´Ù.
     DDSCL_NORMAL          : ÀϹÝÀûÀÎ À©µµ¿ì ¾ÖÇø®ÄÉÀ̼Çó·³ ½ÇÇàÇÑ´Ù.
                            DX â¸ðµå¿¡ »ç¿ëÇÑ´Ù.
     DDSCL_NOWINDOWCHANGES : È°¼º »óÅ¿¡¼­  DirectDraw °¡  Å½ºÅ© ÀüȯÀÌ
                            ºÒ°¡´ÉÇÏ°Ô Çϵµ·Ï Áö½ÃÇÑ´Ù.

     ** °áÇսà ÁÖÀÇ Á¡

     1> DDSCL_EXCLUSIVE ¿Í DDSCL_NORMAL Àº °°ÀÌ »ç¿ëÇÒ ¼ö ¾ø´Ù.
     2> DDSCL_EXCLUSIVE ´Â DDSCL_FULLSCREEN À» Ç×»ó ¼ö¹ÝÇÑ´Ù.
     3> DDSCL_ALLOWMODEX ´Â DDSCL_EXCLUSIVE ¿Í DDSCL_FULLSCREEN °ú  ÇÔ²²
        »ç¿ëµÈ´Ù. ¹°·Ð DDSCL_NORMAL Àº »ç¿ëÇÒ ¼ö ¾ø´Ù.

  À§¿¡¼­ ¸¸µç CooperativeLevel Àº ¹èŸÀû Ç® ½ºÅ©¸°ÀÌ¸ç ¸®ºÎÆÃÀÌ °¡´ÉÇÏ°Ô
 ¼³Á¤µÇ¾ú´Ù. ½ÇÇà Áß Ctrl+Alt+Del ·Î ¸®ºÎÆÃÀÌ °¡´ÉÇÏ°Ô ÇÑ °ÍÀº ÇÊÀÚÀÇ °æ
 Çè¿¡ µû¶ó DX ¿¡¼­ ½Ç¼ö¸¦ ÇÏ¸é ´Ù¿îµÇ´Â ¼ö°¡ ¸¹°í GDI ÀüȯÀÌ ¾ÈµÇ¾î ¸®¼Â
 À» ´­·¯¾ß ÇÏ´Â ¹ø°Å·Î¿òÀ» ¸¹ÀÌ °æÇèÇ߱⠶§¹®ÀÌ´Ù. ÇÏÁö¸¸ °ÔÀÓÀ» ¿Ï¼º ÇÏ
 °í ³ª¼­´Â ¸®ºÎÆÃÀÌ ¾ÈµÇ°Ô ÇØ ³õ´Â °Ô Temp Data º¸¾ÈÀ» À§ÇØ ÁÁÀ» °ÍÀÌ´Ù.


|     if DirectDraw.SetDisplayMode(MAX_X_LINE,MAX_Y_LINE,24,0,0)
|                                                          <> DD_OK then
|        Raise Exception.Create('640 x 480 x 24bit ¸ðµå ½ÇÆÐ');

  ÀÌ°ÍÀÌ ¹Ù·Î Æ®·çÄ÷¯·Î ¸¸µå´Â ¸í·ÉÀÌ´Ù. ù ¹ø°¿Í µÎ ¹ø°´Â °¢°¢ X¿Í Y
 ÀÇ ±æÀ̸¦ ¾Ë·ÁÁÖ´Â °ÍÀ¸·Î ÇöÀç´Â 640 * 480 ÀÌ´Ù. ¼¼ ¹ø° Àμö´Â Bit Per
 Pixel ·Î 24ÀÌ´Ù.
 ( 24bit Ä÷¯À̹ǷÎ. ±×¸®°í ´ç¿¬È÷ 256Ä÷¯ ÀÏ ¶§´Â 8 ÀÌ´Ù. )
 ³× ¹ø° Àμö´Â Refresh Rate ·Î 0 ÀÌ µé¾î°¡¸é ÀÌ ¸Þ¼ÒµåÀÇ IDirectDraw ÀÎ
 ÅÍÆäÀ̽º ¹öÀüÀÌ »ç¿ëµÇ°Ô µÈ´Ù. ±×¸®°í ´Ù¼¸ ¹ø° Àμö´Â Ç×»ó 0 ÀÌ´Ù.


|     FillChar(DDSurfaceDesc,SizeOf(DDSurfaceDesc),0);
|     with DDSurfaceDesc do begin
|        dwSize            := SizeOf(DDSurfaceDesc);
|        dwFlags           := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
|        ddSCaps.dwCaps    := DDSCAPS_COMPLEX or DDSCAPS_FLIP or
|                             DDSCAPS_PRIMARYSURFACE;
|        dwBackBufferCount := 1;
|     end;
|
|     if DirectDraw.CreateSurface(DDSurfaceDesc,PrimarySurface,nil)
|                                                          <> DD_OK then
|        Raise Exception.Create('º¹ÇÕ È­»ó °ø°£ »ý¼º ½ÇÆÐ');

  ÀÌÁ¦´Â Ç¥¸éÀ» »ý¼ºÇÏ´Â ÀÏÀÌ´Ù.
  TDDSurfaceDesc ¿¡ ´ëÇÑ Å¸ÀÔ ±¸Á¶´Â ³»¿ëÀÌ ¸¹Àºµ¥´Ù°¡ °ÅÀÇ ¸ðµç DX ¼­Àû
 ¿¡¼­ ¾ð±ÞÇÏ°í ÀÖÀ¸¹Ç·Î ¿©±â¼­´Â »ý·«ÇÏ°í ÇÊ¿äÇÑ ºÎºÐ¸¸ ¤°í ³Ñ¾î °¡µµ·Ï
 ÇÑ´Ù.

  ¿ì¼± FillChar ·Î DDSurfaceDesc ¸¦ 0 À¸·Î ¸¸µç´Ù. ÀÌ·¸°Ô ÇÑ ÁÖµÈ ÀÌÀ¯´Â
 È¤½Ã ¶óµµ ¸ð¸¦ µ¹¹ß »çŸ¦ ¹Ì¿¬¿¡ ¹æÁöÇϱâ À§ÇÑ °ÍÀÌ´Ù. ¿©±â¿¡¼­ dwSize
 ¶ó°í µÈ ·¹Äڵ带 ÁÖÀÇÇØ¾ß ÇÑ´Ù.  ¿©±â´Â Ç×»ó  ±× Å¸ÀÔÀÇ Å©±â°¡ µé¾î°¡¾ß
 Çϴµ¥, º¸Åë Àؾî¹ö¸®°í »ý·«ÇÏ´Â ¼ö°¡ ¸¹´Ù. ±×·¸°Ô µÇ¸é Á¤¸» ¾Ë ¼ö ¾ø´Â
 ¹ö±×¸¦ Å°¿ì´Â ¼ÀÀÌ µÇ°Å³ª  ÀüÇô ÀÌ»óÀÌ ¾ø¾î º¸ÀÌÁö¸¸ ´Ù¿îÀÌ µÇ´Â ºÒÇàÇÑ
 »çŸ¦ ÃÊ·¡ÇÏ°Ô µÈ´Ù.

  ´ÙÀ½ÀÇ dwFlag µµ Âü Àç¹ÌÀÖ´Â ¿ëµµÀÌ´Ù. TDDSurfaceDesc ÀÇ ·¹ÄÚµå Áß¿¡¼­
 ÇöÀç À¯È¿ÇÑ °ªÀ» °¡Áö´Â ·¹Äڵ常 ÁöÁ¤ÇØ ÁÖ´Â °ÍÀÌ´Ù. ÇÊÀÚ°¡ À©µµ¿ì ÇÁ·Î
 ±×·¡¹ÖÀ» ÀÔ¹®Çϸ鼭 Àç¹ÌÀÖ°Ô ´À²¼´ø °Ô  ¹Ù·Î ¾Õ¿¡ ³ª¿Â ·¹ÄÚµåÀÇ size Ç¥
 ±â¿Í flag Ç¥±â¿´´Ù. ±ÍÂú±âµµ ÇÏÁö¸¸ ¾î¶»°Ô º¸¸é ¹Ì·¡¸¦ À§ÇØ À¶Å뼺À» Ãæ
 ºÐÈ÷ °í·ÁÇÑ ¹ß»óÀ̾ú±â ¶§¹®ÀÌ´Ù.  ÀÚ, DDSD_CAPS or DDSD_BACKBUFFERCOUNT
 ¸¦ ÁöÁ¤ÇÑ ÈÄ¿¡ ¾Æ·¡ µÎ ÁÙ¿¡´Â ddSCaps ¿Í dwBackBufferCount ¸¸ÀÌ °ªÀÌ ÇÒ
 ´çµÇÁö ¾Ê¾Ò´Â°¡ !

  ddSCaps.dwCaps ´Â Ç¥¸é »ý¼º¿¡ ´ëÇÑ  Á¤º¸¸¦ ³Ö¾î ÁØ´Ù.

     DDSCAPS_COMPLEX        : 'º¹ÇÕ Ç¥¸é'À» ¸¸µç´Ù.  º¹ÇÕ Ç¥¸éÀº Çϳª ÀÌ
    »óÀÇ ÈĸéÀ» °¡Áö°í ÀÖÀ¸¸ç ºÎ°¡ÀûÀÎ ÈĸéµéÀº
                             Primary ¿Í ¿¬°áµÇ¾î ÀÖ´Ù. ¶§¹®¿¡ Primary ¸¦
                             Á¦°ÅÇϸé Á¾¼ÓµÈ Èĸéµéµµ °°ÀÌ Á¦°ÅµÈ´Ù.
     DDSCAPS_FLIP           : Çø®ÇÎ ±¸Á¶¸¦ °¡Áö´Â Ç¥¸éÀ» ¸¸µç´Ù,
     DDSCAPS_PRIMARYSURFACE : À¯Àú¿¡°Ô Á÷Á¢ º¸À̴ ǥ¸é( Primary ) À» ¸¸
                             ¸¸µé°Ô Áö½ÃÇÑ´Ù.

  dwBackBufferCount ´Â ÈÄ¸é ¹öÆÛÀÇ °³¼ö¸¦ ³Ö´Â´Ù. ÇöÀç´Â 1 °³·Î ¼³Á¤Çß´Ù.
 ¸¸¾à 2 ·Î ¼³Á¤Çß´Ù¸é Æ®¸®Çà ¹öÆÛ¸µÀ» ÇÏ°Ô µÈ´Ù.  ( Æ®¸®Çà ¹öÆÛ¸µ¿¡ ´ëÇØ
 ¼­´Â Help ¸¦ Âü°íÇϱ⠹ٶõ´Ù. )

  ÀÌ·¸°Ô Á¤ÀÇÇÑ DDSurfaceDesc ·Î Ç¥¸éÀ» »ý¼ºÇÏ´Â ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù.
 ¾Æ·¡¿Í °°ÀÌ Çϸé PrimarySurface ¶ó´Â º¯¼ö°¡ º¹ÇÕ Ç¥¸éÀ» °¡¸®Å°°Ô µÈ´Ù.

     DirectDraw.CreateSurface(DDSurfaceDesc,PrimarySurface,nil)

  Àμö ¼³¸íÀº ÇÊ¿ä ¾øÀ» Á¤µµ·Î °£´ÜÇÏ´Ù. ´Ü 3¹ø° Àμö°¡ nil ÀÌ ¾Æ´Ï¶ó¸é
 ÇöÀçÀÇ DX ¹öÀü¿¡´Â ¿¡·¯¸¦ ¹ß»ý½ÃŲ´Ù.


|     DDSCaps.dwCaps := DDSCAPS_BACKBUFFER;
|     if PrimarySurface.GetAttachedSurface(DDSCaps,BackBuffer)
|                                                  <> DD_OK then
|        Raise Exception.Create('ÈÄ¸é ¹öÆÛ »ý¼º ½ÇÆÐ');

  À§ÀÇ °Íµµ ÀÌÀü °Í°ú ¸¶Âù°¡ÁöÀÇ ¹æ¹ýÀÌ´Ù. DDSCaps.dwCaps ¿¡¼­ ÈĸéÀ» Áö
 ½ÃÇÏ´Â DDSCAPS_BACKBUFFER °¡ ´ëÀÔµÈ °Í ¸»°í´Â º°¹Ý ´Ù¸¦ °Ô ¾ø´Ù. ÇÏÁö¸¸
 ÇÔ¼ö¿¡ À־´Â  Ä¿´Ù¶õ º¯È­°¡ ÀÖ´Ù.  ±×°ÍÀº ¹Ù·Î PrimarySurface °´Ã¼°¡
 º¹ÇÕ Ç¥¸éÀ¸·Î ÃʱâÈ­ µÇ¾ú±â ¶§¹®¿¡ IDirectDrawSurface2 ¿¡ Á¤ÀÇµÈ ¸Þ¼Òµå
 ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ±× ¸Þ¼ÒµåÀÇ Ã¹Â° ÁÖÀÚ°¡  GetAttachedSurface
 ¶ó´Â ¹Ù·ÎÀ§ÀÇ ÇÔ¼öÀÌ´Ù.  ÀÌ°ÍÀº DDSCaps ¿¡ ¸í½ÃµÈ Ç¥¸éÀ» ¾ò´Â ÇÔ¼ö·Î½á
 ÇöÀç´Â ÈÄ¸é ¹öÆÛ°¡  ±× ´ë»óÀ¸·Î ÁöÁ¤µÇ¾ú±â ¶§¹®¿¡  BackBuffer ¿¡´Â Èĸé
 ¹öÆÛ·Î ÃʱâÈ­ µÇ°Ô µÇ´Â °ÍÀÌ´Ù.

  »ç½Ç ¿©±â±îÁö¸é DX ÃʱâÈ­¿Í Cooperative LevelÀ» ¾ò°í ¸ðµå ¹Ù²Ù±â, ±×¸®
 °í 2°³ÀÇ Çø®ÇÎ °¡´ÉÇÑ º¹ÇÕ È­»ó Ç¥¸éÀ» ¸¸µé±â´Â ³¡ÀÌ ³­ ¼ÀÀÌ´Ù. À̾îÁö
 ´Â ³ª¸ÓÁö ÃʱâÈ­´Â ¸ðµÎ ºÎ¼öÀûÀÎ °ÍµéÀÌ´Ù.

 

|     FillChar(DDPixelFormat,sizeof(DDPixelFormat),0);
|     DDPixelFormat.dwSize := sizeof(DDPixelFormat);
|     if PrimarySurface.GetPixelFormat(DDPixelFormat) <> DD_OK then
|        Raise Exception.Create('Çȼ¿ Æ÷¸Ë Àб⠽ÇÆÐ');
|
|     if DDPixelFormat.dwRBitMask = $00FF0000 then
|        FPixelFormat := pfRGB
|     else if DDPixelFormat.dwRBitMask = $000000FF then
|        FPixelFormat := pfBGR
|     else
|        Raise Exception.Create('Çȼ¿ Æ÷¸Ë Æǵ¶ ½ÇÆÐ');

  ÀÌ ºÎºÐÀº »ý¼ºÇÑ 24bit Æ®·çÄ÷¯¿¡ ´ëÇÑ Çȼ¿ Æ÷¸ËÀ» ÆǺ°ÇÏ´Â ºÎºÐÀÌ´Ù.
 Áß¿äÇÑ ºÎºÐÀÌÁö¸¸ ÀÇ¿Ü·Î Àß ¸ð¸£´Â »ç¶÷µµ ¸¹Àº °Í °°¾Æ¼­  ¾à°£ÀÇ ¼³¸íÀ»
 ºÎ°¡½ÃÅ°°Ú´Ù.

  24bit Æ®·çÄ÷¯¿¡¼­´Â ±×·¡ÇÈ Ä«µå¿¡ ±âÀÎÇÏ´Â 2°³ÀÇ Çȼ¿ ¸ðµå°¡ ÀÖ´Ù.
 °¢°¢ RGB ¿Í BGR ·Î ´ëÇ¥µÇ´Â °ÍÀ¸·Î ´ÙÀ½°ú °°Àº ±¸Á¶¸¦ °¡Áø´Ù.

    < RGB ±¸Á¶ >                   < BGR ±¸Á¶ >

      Red    00FF0000h               Red    000000FFh
      Green  0000FF00h               Green  0000FF00h
      Blue   000000FFh               Blue   00FF0000h

  ( 24bit Æ®·çÄ÷¯´Â, 16bit ÇÏÀÌÄ÷¯³ª 32bit Æ®·çÄ÷¯¿Í´Â ´Þ¸® ¾ËÆÄ Çȼ¿
    À» °¡ÁöÁö ¾Ê´Â´Ù.  µû¶ó¼­ Texture Map Format À̳ª Off-Screen Surface
    Format ¸ðµÎ ÀÌ µÎ °¡Áö¹Û¿¡ ¾ø´Ù.                                  )

  À̰͵éÀ» ¾Ë¾Æ³»¼­ µµ´ëü ¾îµð¿¡ ½á¸Ô´À³Ä°í  Àǹ®À» °¡Áö½Ç ºÐÀÌ  °è½ÇÁö
 ¸ð¸£°ÚÁö¸¸, À̰͵éÀº DirectDrawSurface ÀÇ ³»ºÎ ¸Þ¼Òµå¿¡¼­´Â ¾Æ¹« »ó°ü¾ø
 ÀÌ ÀÛµ¿µÇ´õ¶óµµ  Lock À» ÇÏ¿© »ç¿ëÀÚ°¡ Á÷Á¢ ¸Þ¸ð¸®¸¦ Á¦¾îÇØ¾ß ÇÏ´Â °æ¿ì
 ¿¡´Â ¿ÏÀüÈ÷ ´Ù¸¥ °á°ú°¡ ³ª¿Í ¹ö¸± ¼ö Àֱ⠶§¹®¿¡ ²À ¾Ë¾Æ¾ß ÇÑ´Ù.

  À§ÀÇ ÇÔ¼ö´Â ÀÌÇØÇϱ⠽¬¿ï Å×´Ï ±×³É ³Ñ¾î°¡µµ·Ï ÇÑ´Ù.


|     for i := 1 to MAX_IMAGE_SURFACE do begin
|        Image[i] := DDLoadBitmap(DirectDraw,GetBitmapName(i),0,0);
|     end;

  ½ºÇÁ¶óÀÌÆ®·Î »ç¿ëÇÒ ¿¹Á¦ ºñÆ®¸ÊÀ» ·ÎµåÇÑ´Ù.  À§¿¡ »ç¿ëµÈ ºñÆ®¸Ê ÇÔ¼ö´Â
 DDUtils.Pas ¿¡ Á¤ÀÇ µÈ °ÍÀ¸·Î  »ó´çÈ÷ À¯¿ëÇÑ ÇÔ¼ö¶ó°í »ý°¢µÈ´Ù.  ¿Ö³Ä¸é
 '¸®¼Ò½º -> ½ÇÇà µð·ºÅ丮 -> °¡´ÉÇÑ ¸ðµç Æнº' ¼øÀ¸·Î ºñÆ®¸ÊÀ» ã¾Æ °¡¹Ç
 ·Î, °ÔÀÓ ¿Ï¼º ´Ü°è¿¡ ºñÆ®¸ÊÀ» ¸®¼Ò½º ´Ü°è¿¡¼­ ½ÇÇà ÆÄÀÏ¿¡ ³Ö´õ¶óµµ ÀüÇô
 ¼Ò½ºÀÇ ¼öÁ¤ÀÌ ÇÊ¿äÄ¡ ¾Ê´Ù.
  À̹ø ¿¹Á¦¿¡¼­´Â 'Test1.Bmp' Çϳª¸¸ »ç¿ëµÉ °ÍÀÌ´Ù.


|     for i := 1 to MAX_IMAGE_SURFACE do begin
|        ColorKey.dwColorSpaceLowValue := 0;
|        ColorKey.dwColorSpaceHighValue := 0;
|        if Image[i].SetColorKey(DDCKEY_SRCBLT,ColorKey) <> DD_OK then
|           Raise Exception.Create('Åõ¸í»ö ÁöÁ¤ ½ÇÆÐ');
|     end;

  ÀÌ°ÍÀº µµ½º ¶§ ½ºÇÁ¶óÀÌÆ®¿¡´Â º¼ ¼ö ¾ø´ø ±â´ÉÀÎ Åõ¸í»ö Á¤ÀÇ ±â´ÉÀÌ´Ù.
 ¿©±â¼­ Á¤ÀÇµÈ Åõ¸í»ö( ¿µ¾î·Î´Â Color Key ) Àº »ç¿ëÀÚ°¡ ¿øÇϸé ÀÏ¹Ý Ãâ·Â
 ¿¡¼­ ¹Ù·Î Áö¿øÇØ ¹ö¸°´Ù.  dwColorSpaceLowValue ¿Í dwColorSpaceHighValue
 ´Â Åõ¸í»öÀ¸·Î ÁöÁ¤ÇÒ ´Ü°èÀÇ ÃÖ¼Ò °ª°ú ÃÖ´ë °ªÀ» ÁöÁ¤ÇÏ´Â DWORDÀÇ ·¹ÄÚµå
 ÀÌ´Ù.  ÇÊÀÚÀÇ °æÇèÀ¸·Î´Â 0 ¹øÀ̳ª 00FFFFFFh ÀÇ ÇÑ ´Ü°è¸¸À» µÎ´Â °ÍÀÌ °¡
 Àå ÆíÇÏ´Ù°í »ý°¢µÈ´Ù.  ¹°·Ð Ãâ·ÂµÉ °ËÀº »öÀº 00000001 Á¤µµ·Î ÇØ µÎ´Â °Ô
 ÁÁÁö ¾ÊÀ»±î »ý°¢ÇÑ´Ù. ( ÀÌÇØ°¡ ¾ÈµÇ¸é Á÷Á¢ ½ÇÇè Çغ¸¶ó... )

  À§¿¡¼­´Â °¢°¢ÀÇ ºñÆ®¸ÊÀ» ÀúÀåÇÑ À̹ÌÁö ¹öÆÛ¿¡´Ù°¡  DDCKEY_SRCBLT ¸¦ Áö
 Á¤Çߴµ¥ ÀÌ°ÍÀº,  Åõ¸í»öÀÌ Á¤ÀÇ µÈ blit ¿¬»êÀÌ ½ÇÇàµÉ ¶§  À̹ÌÁö ¼Ò½ºÀÇ
 Åõ¸í»öÀ» Àû¿ëÇÏ¿© ½ºÇÁ¶óÀÌÆ®¸¦ Âï°Ô µÈ´Ù. ´Ù½Ã ¸»ÇÏ¸é ½ºÇÁ¶óÀÌÆ®¸¦ ÂïÀ»
 ¶§ ÂïÀ» ±×¸²¿¡ Åõ¸í»öÀ» Àû¿ëÇÏ¿© ½ºÇÁ¶óÀÌÆ®¸¦ Ç¥½ÃÇÏ°Ô µÇ´Âµ¥ ÀÌ ¹æ¹ýÀº
 µµ½º ¶§ÀÇ ½ºÇÁ¶óÀÌÆ® Âï±â¿Í µ¿ÀÏÇÏ´Ù°í »ý°¢Çϸé ÀÌÇØ°¡ ºü¸¦ °ÍÀÌ´Ù.

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

(5) OnDestroy À̺¥Æ® ¼³Á¤

  ¸¶Áö¸· À̺¥Æ®ÀÎ OnDestroy ¸¦ ´õºíŬ¸¯ÇÑ´Ù. ±×¸®°í ¸¶Âù°¡Áö·Î ´ÙÀ½°ú °°
 Àº Äڵ带 ÀÛ¼ºÇÑ´Ù.

|  procedure TBasic.FormDestroy(Sender: TObject);
|  var
|     i : integer;
|  begin
|
|     if Assigned(PrimarySurface) then PrimarySurface.Release;
|                               // º¹ÇÕ È­»ó Ç¥¸éÀ» Á¦°ÅÇÑ´Ù.
|
|     for i := 1 to MAX_IMAGE_SURFACE do begin
|        if Assigned(Image[i]) then Image[i].Release;
|     end;                      // ºñÆ®¸Ê À̹ÌÁö Ç¥¸éÀ» Á¦°ÅÇÑ´Ù.
|
|     if Assigned(DirectDraw) then DirectDraw.Release;
|     DirectDraw := nil;        // ¸¶Áö¸·À¸·Î DX °´Ã¼¸¦ Á¦°ÅÇÑ´Ù.
|
|  end;

  º°´Ù¸¥ ¼³¸íÀÌ ÇÊ¿ä ¾øÀ» ¸¸Å­ »·ÇÑ ÁøÇàÀÌ´Ù.

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

 ÀÌ·¸°Ô DX ÀÇ Æ®·çÄ÷¯ ÃʱâÈ­°¡ ³¡³µ´Ù.
 ÀÌ°ÍÀ» ½ÇÇà ½ÃÄÑ º¸¸é °ú¿¬ ¾î¶² °á°ú°¡ ³ª¿Ã±î.. ³î¶óÁö ¸¶½Ã¶ó..
¾Æ¹«°Íµµ ¾ø´Â ±ô±ôÇÑ È­¸éÀÌ ´ç½ÅÀ» ±â»Ú°Ô ¸Â¾Æ ÁÙ °ÍÀÌ´Ù. ±× »ç½Ç¿¡ ³Ê¹«
½½ÆÛÇϰųª ³ë¿©¿ö ¸»¶ó.  ´Ù¸¥ ¹Ì½º ŸÀÌÇÎÀ¸·Î ¿¡·¯°¡ ³ª¼­ ´Ù¿îÀÌ ¾ÈµÈ °Í
¸¸À¸·Îµµ »î¿¡ ´ëÇÑ °¡Ä¡¸¦ ÃæºÐÈ÷ ¸¸³£ÇÒ ¼ö ÀÖÀ» Å״ϱî. Á¾·á´Â Alt+F4..

 ´ÙÀ½Àº ÃʱâÈ­¿¡ µû¸¥ ¿¹¿Ü, ¿¡·¯, ±âŸ À̺¥Æ® ¿¡ ´ëÇÑ °ÍÀ» ´Ù·ç°Ú´Ù.

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (2) - ´ÙÀÌ·ºÆ® X ¿¡ ´ëÇÑ Çڵ鷯 ¼³Ä¡
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 DX ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÃʱâÈ­´Â ÀÌ¹Ì ³¡³µ´Ù. ÇÏÁö¸¸ ÇϳªÀÇ °ÔÀÓÀ» ¸¸µé±â¿¡
´Â ÅξøÀÌ ºÎÁ·ÇÑ °ÍÀÌ »ç½ÇÀÌ´Ù.  ±×·¡¼­ À̹ø¿¡ ´Ù·ê °ÍÀº DX ÀÇ ¿¹¿Ü ÇÚµé
·¯¿Í Çø®Çο¡ µû¸¥ À̺¥Æ® Çڵ鷯ÀÌ´Ù.

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

(1) µÎ¹ø° ÇÁ·ÎÁ§Æ®ÀÇ ½ÃÀÛ

  ¸ÕÀú ÀÌÀü¿¡ Á¦ÀÛÇÑ DX24Bit1.Dpr À» ÀÐ¾î µéÀδÙ.  Save Project As ¸¦ ¼±
 ÅÃÇÏ¿© ÀúÀå½Ã¿¡ À̸§À» DX24Bit2.Dpr ·Î ¹Ù²Û´Ù.  Save As ·Î MainUnt1.Pas
 µµ MainUnt2.Pas ·Î ¹Ù²Û´Ù.  ÀÌ ÀýÂ÷´Â °­ÁÂÀÇ ¹öÀüÀÌ Çϳª ´õ  ¿Ã¶ó°¬À½À»
 ¸»ÇØÁÖ´Â °ÍÀÌ´Ù.

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

(2) TBasic Ŭ·¡½º¿¡¼­ Ãß°¡ÇÒ Çʵå¿Í ¸Þ¼Òµå

  C ¸¦ ÇϽô ºÐÀ̶ó¸é 'Çʵå¿Í ¸Þ¼Òµå'¶ó´Â ¸»º¸´Ù´Â '¸â¹ö¿Í ¸â¹ö ÇÔ¼ö'¶ó
 ´Â ¸»¿¡ ´õ Àͼ÷ÇÒ·±Áö´Â ¸ð¸£°ÚÁö¸¸ µ¨ÆÄÀÌ´Â ¾ö¿¬È÷ ÆĽºÄ®ÀÇ °´Ã¼ ÁöÇâÀ»
 µû¸£¹Ç·Î ¿ë¾îµµ ÆĽºÄ®¿¡¼­ ÆÄ»ýµÈ °ÍÀ¸·Î °ñ¶ú´Ù.

  ´ç½ÅÀÌ Ãß°¡ ÀÔ·ÂÇØ¾ß ÇÒ »õ·Î¿î Çʵå¿Í ¸Þ¼Òµå´Â ¾Æ·¡¿Í °°´Ù.

|  type
|     TBasic = class(TForm)
|
|        procedure FormMinimize(Sender: TObject);
|        procedure FormOnRestore(Sender: TObject);
|        procedure FormKeyDown(Sender: TObject; var Key: Word;
|      Shift: TShiftState);
|
|     private
|        FPreviousFlipping : boolean;
|        FFlippingEnabled  : boolean;
|
|        procedure ExceptionHandler(Sender : TObject; Error : Exception);
|        procedure HandleMessage(var Msg : TMsg; var Handled : boolean);
|        procedure IdleHandler(Sender : TObject; var Done : boolean);
|        procedure SetFlippingEnabled(Value : boolean);
|
|     public
|
|        procedure UpdateDisplay(is_commandable : boolean);
|        property  FlippingEnabled : boolean read FFlippingEnabled

|                                            write SetFlippingEnabled;
|     end;

  »õ·Î Ãß°¡µÈ ºÎºÐÀº  ¿¹¿Ü Çڵ鷯¿Í Çø®Çο¡ ´ëÇÑ À̺¥Æ® Çڵ鷯·Î ±¸¼ºµÇ
 ¾î ÀÖ´Ù.

  À̹ø¿¡µµ °¢°¢ÀÇ ÇÔ¼öÀÇ ¼Ò½º¸¦ Ãß°¡ ½ÃÅ°´Â ÇüÅ·Π¼³¸íÀ» ÇÏ°Ú´Ù.

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

(3) Çø®Çο¡ °üÇÑ ÇÔ¼ö¿Í ÇÁ·ÎÆÛƼ

  ´ÙÀ½À¸·Î ´Ù·ê °ÍÀº Çø®ÇÎ °ü·Ã ÇÔ¼öµéÀÌ´Ù.

|        property  FlippingEnabled : boolean read FFlippingEnabled
|                                            write SetFlippingEnabled;

  À§¿Í °°ÀÌ FlippingEnabled ´Â ÀÐÀ» ¶§´Â FFlippingEnabled ¿¡¼­ ¹Ù·Î Àаí
 , ¾µ ¶§´Â SetFlippingEnabled ÇÔ¼ö¸¦ È£ÃâÇÏ´Â property ·Î ¼±¾ðµÇ¾ú´Ù.

  ±×·³, ¹®Á¦ÀÇ SetFlippingEnabled ¸¦ º¸µµ·Ï ÇÏÀÚ.

|  procedure TBasic.SetFlippingEnabled(Value : boolean);
|  begin
|     if Value <> FFlippingEnabled then begin
|        FFlippingEnabled := Value;
|        if FFlippingEnabled then begin
|           Application.OnMessage := HandleMessage;
|           Application.OnIdle := IdleHandler;
|        end else begin
|           Application.OnMessage := nil;
|           Application.OnIdle := nil;
|        end;
|     end;
|  end;

  Value °¡ ÇöÀçÀÇ °Í°ú ´Ù¸¦ ¶§´Â º¯È­¸¦ Áִµ¥, ±× ´ë»óÀº OnMessage À̺¥
 Æ®¿Í OnIdle À̺¥Æ®ÀÌ´Ù. ÀÌ°ÍÀº ÇÁ·Î±×·¥ÀÌ ´ë±âÇÏ´Â µ¿¾È¿¡ ¹ß»ýÇϱâ ɧ§¢¹®
 ¿¡ ÃÖÀûÀÇ Çø®ÇÎ ¼Óµµ¸¦ ³»±â À§Çؼ­´Â ²À ÇÊ¿äÇÑ ¿ä¼ÒÀÌ´Ù.  Timer À̺¥Æ®
 µµ ÀÖÁö ¾Ê´À³Ä ÇϽðÚÁö¸¸ ÀÌ°ÍÀÌ ´õ È¿À²ÀûÀ̶ó°í ÇÊÀÚ´Â »ý°¢ÇÑ´Ù.

  Value °¡ TRUE ÀÏ ¶§´Â µÎ °¡ÁöÀÇ À̺¥Æ®°¡ ¸ðµÎ ÁöÁ¤µÇ¾î ÇÁ·Î±×·¥Àº ¹Ù»Ú
 °Ô Çø®ÇÎÀ» ÇØ´îÅ×°í, FALSE ·Î ÁöÁ¤µÇ¾î ÀÖ´Ù¸é µÎ °¡Áö À̺¥Æ®´Â ´õ ÀÌ»ó
 µ¿ÀÛÀ» ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.  ÀÌ°ÍÀº GDI È­¸éÀÌ ÇÊ¿äÇÑ ¿¹¿Ü ¸Þ¼¼Áöµî¿¡¼­ ¿ä
 ±äÇÏ°Ô »ç¿ëµÇ¸ç Çø®ÇÎ ¶§¹®¿¡ ¸Þ¼¼Áö°¡ ±Ý¹æ °¡·ÁÁ® ¹ö¸®´Â »óȲÀ» ¹æÁöÇÒ
 ¼ö ÀÖ´Ù.

  À§¿¡ ÁöÁ¤ÇÑ OnMessage ¿Í OnIdle ¿¡ ´ëÇÑ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

|  procedure TBasic.HandleMessage(var Msg : TMsg; var Handled : boolean);
|  begin
|     UpdateDisplay(TRUE);
|  end;
|
|  procedure TBasic.IdleHandler(Sender : TObject; var Done : boolean);
|  begin
|     UpdateDisplay(TRUE);
|     Done := FALSE;
|  end;
|
|  procedure TBasic.UpdateDisplay(is_commandable : boolean);
|  begin
|     PrimarySurface.Flip(nil,DDFLIP_WAIT);
|  end;

  TBasic.IdleHandler ¿¡¼­ ´« ¿©°Ü º¼ °ÍÀº Done À̶ó´Â ·¹ÆÛ·±½º º¯¼ö¸¦ Áö
 Á¤ÇÑ °ÍÀÌ´Ù. ¿©±â¼­´Â FALSE ·Î Çߴµ¥, ÀÌ°ÍÀº VCL ÀÌ À©µµ¿ì ¸Þ¼¼Áö¸¦ ±â
 ´Ù¸®´Â °ÍÀ» ¸·´Â´Ù°í ÇÑ´Ù.

  ÀÌ µÎ ÇÔ¼ö´Â ¸ðµÎ °øÅëÀûÀ¸·Î  UpdateDisplay ¶ó´Â È­¸é °»½Å ÇÔ¼ö¸¦ ºÎ¸£
 µµ·Ï µÇ¾îÀÖ´Ù. UpdateDisplay ´Â º¸´Ù½ÃÇÇ DirectDrawSurface ÀÇ Flip ÇÔ¼ö
 ¸¦ ºÎ¸£°í ÀÖ´Ù.  Flip ÇÔ¼ö¾ß ¸»·Î °¡Àå ÇÙ½ÉÀûÀÎ ÇÔ¼ö Áß Çϳª·Î½á µÎ°³ÀÇ
 È­¸éÀ» ÀüȯÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¸¸¾à µÎ°³ÀÇ È­¸éÀÌ ¸ðµÎ ºñµð¿À ¸Þ¸ð¸®¿¡ ¼±
 ¾ðµÇ¾ú´Ù¸é ±×·¡ÇÈ ½ÃÀÛ ¹øÁö ÁÖ¼Ò¸¦ ¹Ù²Ù´Â °úÁ¤ÀÌ µÉ°ÍÀÌ¸ç ¹é¹öÆÛ°¡ ºñµð
 ¿À ¸Þ¸ð¸® ºÎÁ·À¸·Î ÀÎÇØ ¸Þ¸ð¸®¿¡ ¸¸µé¾îÁ³´Ù¸é  Blt ÇÔ¼ö¿Í °°Àº µ¿ÀÛÀ¸·Î
 ºñµð¿À ¸Þ¸ð¸®¿¡ °í¼Ó º¹»ç¸¦ ÇÏ°Ô µÈ´Ù.

  Flip ÇÔ¼öÀÇ Ã¹ ° Àμö´Â ¹é ¹öÆÛ°¡ primary °¡ µÇÁö ¾ÊÀ» ¶§ ½ÇÁ¦·Î Çø³
 ½Ãų DirectDrawSurface ÀÇ ÁÖ¼Ò¸¦ ³Ö´Â °ÍÀ¸·Î½á,  À̹øÀÇ °­Á¿¡¼­´Â Ç×»ó
 nil À» ¾´´Ù. ±×¸®°í µÎ ¹ø° Àμö´Â DDFLIP_WAIT ¸¦ ³Ö°Å³ª ¾Æ¹« °ªÀ» ¾È³Ö
 ´Â µÎ °¡ÁöÀÇ ¹æ¹ýÀÌ ÀÖÀ¸¸ç À§ÀÇ ¿ë¹ýó·³ DDFLIP_WAIT ¸¦ ³Ö´Â´Ù¸é Çø®ÇÎ
 ÀÌ µÉ ¶§±îÁö ´ë±âÇß´Ù°¡ Çø®ÇÎÀ» ½ÃŲ´Ù.  ´ë±â°¡ µÇ´Â ÀÌÀ¯¿¡´Â ¸ð´ÏÅÍÀÇ
 ¼öÁ÷ º¹±Í ( Vertical Retrace ) ¸¦ ±â´Ù¸®±â ¶§¹®ÀÌ´Ù.

  ¸¸¾à Æ®¸®Çà ¹öÆÛ¸µÀ» ¾´´Ù¸é Flip ¿¡ ´ë±â¸¦ µÎÁö ¾ÊÀº ä·Î  while ÀÇ Á¶
 °ÇÀ¸·Î ¼öÁ÷ º¹±Í ½ÃÀÛ À¯¹«¸¦ üũÇÏ´Â GetVerticalBlankStatus ¸¦ µÎ¾î ´ë
 ±âÇÏ´Â µ¿¾È¿¡ 3¹ø° ¹öÆÛ¿¡ ¹«¾ð°¡¸¦ ÀÛ¾÷ÇÑ´Ù¸é  ¾ó¸¶°£ÀÇ À̵æÀ» ¾òÀ» ¼ö
 ÀÖÁö ¾ÊÀ»±î »ý°¢ÇÑ´Ù.


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

(4) OnCreate À̺¥Æ®¿¡ Ãß°¡ »çÇ×

|   Application.OnException := ExceptionHandler;
|   Application.OnMinimize  := FormMinimize;
|   Application.OnRestore   := FormOnRestore;

  À§ÀÇ 3 ÁÙÀ» Á÷Á¢ TBasic.FormCreate(Sender: TObject) ¿¡ Ãß°¡½ÃÅ°±â ¹Ù¶õ
 ´Ù.  Ã¹ ¹ø° ÁÙÀº ¿¹¿Ü°¡ ¹ß»ýÇßÀ» ¶§ ½ÇÇà½ÃÅ°´Â ÇÔ¼ö¸¦ ÁöÁ¤ÇÑ °ÍÀÌ°í ³ª
 ¸ÓÁö µÎ ÁÙÀº  ÆûÀÌ ÃÖ¼ÒÈ­µÇ¾úÀ» ¶§¿Í ´Ù½Ã º¹±¸ µÇ¾úÀ» ¶§¿¡ ´ëÇÑ À̺¥Æ®
 ·Î½á Á÷Á¢ÀûÀ¸·Î Áö¿øÇÏ´Â ÆûÀÇ À̺¥Æ®´Â ¾Æ´Ï±â ¶§¹®¿¡ ÀÌ·¸°Ô Çڵ鷯 Çü½Ä
 À¸·Î ¼±¾ðÇÏ°Ô µÇ¾ú´Ù. ÀÌ·¸°Ô ÇÏ´Â ÀÌÀ¯´Â, DX ÀÇ Ç® È­¸éÀÌ ÃÖ¼ÒÈ­ µÈ´Ù´Â
 °ÍÀº À©µµ¿ì óÀ½ÀÇ ¸ðµå·Î µ¹¾Æ°£´Ù´Â ÀÇ¹Ì¿Í ÇÔ²² DX ¿¡¼­ ¼±¾ðÇÑ ¸ðµç È­
 »ó °ø°£ÀÇ »ó½ÇÀ» ÀǹÌÇϱ⠶§¹®¿¡ ÀÌ°ÍÀ» Á¦¾îÇÒ ¹«¾ð°¡°¡ ¿ä±¸µÇ¾î¼­ÀÌ´Ù.

  ±×·¸´Ù¸é À§¿¡ ¾ð±ÞµÈ FormMinimize ¿Í FormOnRestore ¸¦ ¤°í ³Ñ¾î°¡´Â °Í
 ÀÌ ¸Å³ÊÀÏÅ×´Ï ¼Ò½º¸¦ »ìÆì º¸±â·Î ÇÏÀÚ.

|  procedure TBasic.FormMinimize(Sender: TObject);
|  begin
|     FPreviousFlipping := FlippingEnabled;
|     FlippingEnabled   := FALSE;
|  end;
|
|  procedure TBasic.FormOnRestore(Sender: TObject);
|  begin
|     FlippingEnabled   := FPreviousFlipping;
|  end;

  ÆûÀÌ ÃÖ¼ÒÈ­ µÇ¸é ÀÌÀüÀÇ Çø®ÇÎ »óŸ¦ ±â¾ïÇÏ°í  Çø®ÇÎÀ» ºÒ°¡´ÉÇÏ°Ô ÇÑ
 ´Ù. ¸¶Âù°¡Áö·Î ÆûÀÌ ´Ù½Ã º¹±¸°¡ µÇ¸é ±â¾ïÇØ µÎ¾ú´ø Çø®ÇÎ »óÅ·Π¼¼ÆÃÇÑ
 ´Ù. ¿Ö ÀÌ·¸°Ô ¹ø°Å·Î¿î °úÁ¤À» °ÅÄ¡´Â°¡ ÇÏ¸é  ÆûÀÌ ÃÖ¼ÒÈ­µÇ¾úÀ»¶§´Â ½ÇÁ¦
 ·Î °ÔÀÓÀ» ¾ÈÇÏ´Â °ÍÀ̱⠶§¹®¿¡  °ÔÀÓ¿¡¼­ ¿À´Â ºÎÇϸ¦  ÃÖ´ëÇÑÀ¸·Î ÁÙ¿©¼­
 ´Ù¸¥ ¾ÖÇø®ÄÉÀ̼ÇÀÇ ¼öÇà ¼Òµµ¸¦ ³ôÀÌÀڴµ¥ ±× ÃëÁö°¡ ÀÖ´Ù.
  ¶ÇÇÑ, ÇÁ·Î±×·¥ÀÌ ¹æ´ëÇØÁö¸é ¿©±â¿¡´Ù°¡ ´Ù¸¥ ¸¹Àº ±â´ÉÀ» ³Ö´Â °ÍÀÌ °¡´É
 ÇÏ´Ù.

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

(5) OnKeyDown À̺¥Æ® ¸¸µé±â

  ÆûÀÇ Object Inspector ÀÇ Events ÀÇ OnKeyDown À̺¥Æ®¸¦ ´õºí Ŭ¸¯ÇÑ´Ù.
  ±×¸®°í ¾Æ·¡ÀÇ ¼Ò½º¸¦ ÀÔ·ÂÇÑ´Ù.

|  procedure TBasic.FormKeyDown(Sender: TObject; var Key: Word;
|                                                   Shift: TShiftState);
|  begin
|     if ssAlt in Shift then Key := 0;
|     if key = VK_ESCAPE then Close;
|  end;

  Ã¹Â° ÁÙÀº Alt+F4 ·Î Á¾·áÇÏ´Â °ÍÀ» ¸·´Â ·çƾÀÌ´Ù.  Alt ·Î ÁöÁ¤µÇ´Â ´ëºÎ
 ºÐÀÇ ½Ã½ºÅÛ Å°¸¦ ¸·´Â´Ù.
  ( ÇÏÁö¸¸ Alt+Tab °ú Ctrl+Alt+Del Àº µèÁö ¾Ê´Â´Ù. )
  µÎ¹ø°ÀÇ ÁÙÀº ESC Å°¸¦ ´­·¶À» ¶§ Á¾·á°¡ µÇµµ·Ï ¹Ù²Ù¾î ³õ´Â´Ù.

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

(6) ¿¹¿Ü Çڵ鷯 ¸¸µé±â

  À§ÀÇ OnCreate ¿¡¼­ ¾ð±ÞÇÑ Application.OnException := ExceptionHandler;
 À̶ó´Â ±¸¹®ÀÇ Àǹ®À»Ç®¶§°¡ ¿Ô´Ù. ÀÌ°ÍÀº Raise ·Î ÇÁ·Î±×·¡¸Ó°¡ ¹ß»ý½ÃÅ°
 ´Â ¿¹¿Ü¿Í µ¨ÆÄÀÌ ÀÚü¿¡¼­ ¿¡·¯ ¹ß»ý½Ã¿¡ »ý¼ºµÇ´Â ¿¹¿Ü¸¦ ó¸®ÇÏ°Ô µÈ´Ù.

  ±×·³ ¼Ò½º¸¦ ¸ÕÀú Á¦½ÃÇÏ°í ¼³¸í¿¡ µé¾î°¡°Ú´Ù.

|  procedure TBasic.ExceptionHandler(Sender : TObject; Error : Exception);
|  var
|     WasEnabled : boolean;
|  begin
|     MessageBeep(0);
|
|     WasEnabled      := FlippingEnabled;
|     FlippingEnabled := FALSE;
|
|     if Assigned(DirectDraw) then DirectDraw.FlipToGDISurface;
|
|     MessageDlg(Error.Message,mtError,[mbOK],0);
|
|     FlippingEnabled := WasEnabled;
|
|  end;

  ¿¹¿Ü Çڵ鷯ÀÇ ¿øÇüÀº óÀ½ºÎÅÍ Á¤ÀǵǾîÁø °ÍÀ¸·Î Error ¿¡´Â ¿¹¿ÜÀÇ Á¤º¸
 °¡ µé¾î°¡ ÀÖ´Ù.

  ¸ÕÀú À©µµ¿ì µðÆúÆ® À½À» ¹ß»ý ½ÃŲ ÈÄ ( º¸Åë '»à-' ÇÏ´Â À½ )  ÇöÀçÀÇ ÇÃ
 ¸®ÇÎ »óŸ¦ ÀúÀåÇÏ°í  Çø®ÇÎÀÌ ºÒ°¡´ÉÇÏ°Ô ÇÑ´Ù.  ¸¸¾à DirectDraw °´Ã¼°¡
 ÃʱâÈ­ µÇ¾î ÀÖ´Ù¸é FlipToGDISurface ¸¦ ½ÇÇàÇÑ´Ù.  ÃʱâÈ­ °Ë»ç¸¦ ÇÏ´Â ÀÌ
 À¯´Â, ¿¹¿Ü°¡ DirectDraw °´Ã¼°¡ »ý¼ºµÇ±â Àü¿¡ ¹ß»ýÇÒ ¼öµµ Àֱ⠶§¹®ÀÌ´Ù.
 FlipToGDISurface ´Â ½ÇÇà Á÷ÀüÀÇ GDI È­¸éÀ» Primary ¿¡ º¹»çÇÑ´Ù.  ÀÌ°ÍÀ»
 »ç¿ëÇؾ߸¸ MessageDlg ¸¦ Á¤È®ÇÏ°Ô À¯Àú°¡ º¼ ¼ö ÀÖ°Ô µÈ´Ù.

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

(7) OnShow ¿Í OnDestroy À̺¥Æ®¿¡ Ãß°¡ »çÇ×

  TBasic.FormShow ¿¡¼­ ¸¶Áö¸· ÁÙ¿¡

      FlippingEnabled := TRUE;

  ¸¦ ³Ö´Â´Ù.  ÀÌ °úÁ¤ÀÌ ÀÖ°í ³ª¼­¾ß ºñ·Î¼Ò Çø®ÇÎÀÌ ½ÃÀÛµÇ°í °ÔÀÓ È­¸éÀ»
 À¯Àú°¡ º¼ ¼ö ÀÖ°Ô µÈ´Ù.

  TBasic.FormDestroy ¿¡¼­´Â ´ÙÀ½ÀÇ µÎÁÙÀÌ Ãß°¡µÈ´Ù.

      FlippingEnabled := FALSE;         // Á¦ÀÏ ¾ÕÁÙ¿¡ ³Ö´Â´Ù.
      Application.OnException := nil;   // Á¦ÀÏ µÚÂÊ¿¡ ³Ö´Â´Ù.

  ÆûÀÌ OnDestroy ¸Þ¼¼Áö¸¦ ¹Þ´Â´Ù´Â Àǹ̰¡  °ÔÀÓÀÇ Á¾·á¸¦ ÀǹÌÇϹǷΠÁ¦ÀÏ
 Ã¹ ÁÙ¿¡ Çø®ÇÎÀ» ¾ø¾Ö´Â ¸Þ¼¼Áö¸¦ ³Ö¾î¾ß ÇÏ´Â °ÍÀÌ´Ù.
  ±×¸®°í DirectDraw °´Ã¼±îÁö ¸ðµÎ ¾ø¾îÁö°í ³­ ÃÖÈÄ¿¡ ³Ö´Â Äڵ尡 ¹Ù·Î µÑ
 Â° ÁÙ¿¡ ÀÖ´Â ¿¹¿Ü Çڵ鷯 Á¦°ÅÀÌ´Ù.

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (3) - ´ÙÀÌ·ºÆ® X SURFACELOST ¿¡ ´ëÇÑ ´ëºñ
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 ÀÌÁ¦ DX ¸¦ ¾î´À Á¤µµ ±¸ÃàÇÏ°í °£´ÜÇÑ °ÔÀÓÀ» ¸¸µé±â¿¡µµ ÃæºÐÇÑ Äڵ尡 ¸¸
µé¾îÁ® ÀÖ´Â »óÅÂÀÌ´Ù. ÇÏÁö¸¸ DX ´Â ÀÌ Á¤µµ·Î ÃʱâÈ­¸¦ ³¡³¾ Á¤µµ·Î ¸¸¸¸ÇÏ
Áö ¾ÊÀº °ÍÀÌ »ç½ÇÀÌ´Ù.  ±×·¡¼­ À̹ø¿¡´Â ¾î¶°ÇÑ ÇüÅÂ·Îµç »ç¶óÁ® ¹ö¸° Ç¥¸é
À» ´Ù½Ã º¹±¸ÇÏ´Â Äڵ带 ³Ö´Â °ÍÀÌ ÁÖµÈ °ü°ÇÀÌ´Ù.  ¶ÇÇÑ ±âº»ÀûÀ¸·Î Ç¥¸éÀ»
°íÁ¤ÇÏ¿© Á÷Á¢ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¾òÀ» ¼ö ÀÖ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸°Ú´Ù.

 ÀÏ¹Ý À©µµ¿ì °ÔÀÓ Á¦ÀÛ¿¡ Àͼ÷ÇÑ ºÐÀ̶ó¸é  ¿¹»óÄ¡ ¸øÇÑ À¯ÀúÀÇ ÇൿÀ¸·Î ÀÎ
ÇØ È­¸éÀÌ ÀϺΠ¶Ç´Â ÀüºÎ°¡ Áö¿öÁö´Â Çö»óÀ» óÀ½¿¡ °æÇèÇغ¸°Ô µÈ´Ù. GDI·Î
±×·ÁÁø È­¸éÀº ÀÚµ¿ º¹±¸ ±â´ÉÀÌ ¾øÀ¸¹Ç·Î Ç×»ó À©µµ¿ìÀÇ WM_PAINT ¸¦ ¹Þ¾Æ¼­
´Ù½Ã ±×¸²À» ±×·ÁÁá´ø ±â¾ïÀ» °¡Áö°í °è½Å ºÐÀÌ ¸¹À¸¸®¶ó »ý°¢ÇÑ´Ù.

 DX ´Â ±âº»ÀûÀ¸·Î â¸ðµå¿¡¼­ Ŭ¸®ÆÛ °´Ã¼¸¦ Áö¿øÇϹǷΠÀÌ·± Á¡¿¡¼± ¹®Á¦°¡
¾øÁö¸¸ ÇÑ °¡Áö Áß´ëÇÑ ¹®Á¦¸¦ ¾È°í ÀÖ´Ù.  Å½ºÅ© ÀüȯµîÀ¸·Î È­¸éÀÇ ¸ðµå°¡
¹Ù²î¾î ¹ö¸®°ÔµÇ¸é  DX ¿¡¼­ ÇÒ´çÇÑ Ç¥¸éÀº  ¸ðµÎ ¸Þ¸ð¸®¸¦ ÀÒ¾î ¹ö¸®°Ô µÇ´Â
°ÍÀÌ ±×°ÍÀÌ´Ù.  ¾Æ¿¹ ÀÛ¾÷ Àüȯ Å°ÀÎ Alt+Tab °°Àº°ÍÀÌ ¸ÔÁö ¾Êµµ·Ï ÇÏ´Â ¹æ
¹ýÀÌ VC++ °ÔÀÓ¿¡´Â ÁÖ·Î »ç¿ëµÇÁö¸¸, ÇÇÇÏ´Â°Ô ´É»ç´Â ¾Æ´Ï´Ù.

 ¸¸¾à DX °¡ Ç¥¸éÀ» ÀÒ¾î ¹ö·È´Âµ¥µµ ºÒ±¸ÇÏ°í Blt ÇÔ¼öµîÀ» »ç¿ëÇÏ·Á ÇÑ´Ù¸é
DX ´Â ¿¡·¯³ª ¿¹¿Ü ´ë½Å¿¡ DDERROR_SURFACELOST ¸¦ ¸®ÅÏÇÏ°Ô µÇ°í ÇÁ·Î±×·¡¸Ó
´Â ´ëºÎºÐÀÇ DX ÇÔ¼ö¿¡´Ù°¡ DDERROR_SURFACELOST ¿¡ ´ëÇÑ ´ëºñ¸¦ ÇؾßÇÑ´Ù.
¿©±â¼­ ´ëºñ¶ó°í ÇÏ´Â °ÍÀº,  DX ÇÔ¼ö ½ÇÇà½ÃÀÇ ¸®ÅÏ¿¡ Àú ¸Þ¼¼Áö°¡ ¸®ÅϵǸé
Ç¥¸éÀ» º¹±¸ ½ÃÅ°°í ÀÒ¾î¹ö¸° À̹ÌÁö ¹öÆÛ¸¦ ´Ù½Ã Àд ÀÛ¾÷À» ½ÃÅ°¸é µÈ´Ù.

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

(1) ¼¼¹ø° ÇÁ·ÎÁ§Æ®ÀÇ ½ÃÀÛ

  ¸ÕÀú ÀÌÀü¿¡ Á¦ÀÛÇÑ DX24Bit2.Dpr À» ÀÐ¾î µéÀδÙ.  Save Project As ¸¦ ¼±
 ÅÃÇÏ¿© ÀúÀå½Ã¿¡ À̸§À» DX24Bit3.Dpr ·Î ¹Ù²Û´Ù.  Save As ·Î MainUnt2.Pas
 µµ MainUnt3.Pas ·Î ¹Ù²Û´Ù.

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

(2) TBasic Ŭ·¡½º¿¡¼­ Ãß°¡ÇÒ Çʵå¿Í ¸Þ¼Òµå

  ´ç½ÅÀÌ Ãß°¡ ÀÔ·ÂÇØ¾ß ÇÒ »õ·Î¿î Çʵå¿Í ¸Þ¼Òµå´Â ¾Æ·¡¿Í °°´Ù.

|  type
|     TBasic = class(TForm)
|
|        procedure FormPaint(Sender: TObject);
|
|     private
|        FIsLocked         : boolean;
|
|        function  RestoreSurfaces : HResult;
|        procedure DrawSurfaces;
|
|     public
|        LockDesc       : TDDSurfaceDesc;
|
|        procedure DrawScreen;
|        function  MakeItSo(DDResult : HResult) : boolean;
|        procedure LockBackGround;
|        procedure UnlockBackGround;
|     end;

  »õ·Î Ãß°¡µÈ ºÎºÐÀº È­»ó º¹±¸ ½ÃÅ°´Â ºÎºÐ°ú È­¸éÀ» °íÁ¤ÇÏ°í ÇØÁ¦ÇÏ´Â µÎ
 ºÎºÐÀ¸·Î µÇ¾î ÀÖ´Ù.

  À̹ø¿¡µµ ¿ª½Ã °¢°¢ÀÇ ÇÔ¼öÀÇ ¼Ò½º¸¦ Ãß°¡ ½ÃÅ°´Â ÇüÅ·Π¼³¸íÀ» ÇÏ°Ú´Ù.

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

(3) È­»ó º¹±¸¿¡ ´ëÇÑ ÇÔ¼öµé

  ¾Õ¿¡¼­µµ ¾ð±ÞÇßµíÀÌ ´ëºÎºÐÀÇ DX ÇÔ¼öµéÀº  Ç×»ó Ç¥¸éÀ» ÀÒ¾î ¹ö¸®Áö ¾Ê¾Ò
 ´ÂÁö¸¦ °Ë»çÇØ¾ß ÇÑ´Ù. (  ´õ ÀÚ¼¼È÷ ¸»Çϸé DDERROR_SURFACELOST ¸¦ ¸®ÅÏÇÒ
 ¼ö ÀÖ´Â ¸ðµç ÇÔ¼ö°¡ ´ë»óÀÌ µÈ´Ù. )

  ¼Ò½º·Î ¿¹¸¦ µéÀÚ¸é ´ÙÀ½°ú °°Àº Çü½ÄÀÌ µÉ °ÍÀÌ´Ù.

|  if PrimarySurface.Flip(nil,DDFLIP_WAIT) = DDERROR_SURFACELOST then
|     º¹±¸ÇÏ´Â ÄÚµå();

  ÇÏÁö¸¸ Ç¥¸é¿¡ ´ëÇÑ DX ÇÔ¼ö¸¶´Ù ÀÌ·± º¹±¸ Äڵ带 °Ë»çÇÏ°í Ç¥¸éÀ» ÀÒ¾úÀ»
 ¶§´Â Ç¥¸éÀ» »ì·Á³»°Ô ¸¸µç´Ù¸é ÀÌ°ÍÀº ¿©°£ÀÇ ¹ø°Å·Î¿î ÀÛ¾÷ÀÌ ¾Æ´Ò °ÍÀÌ´Ù.

  ±×·¡¼­ ¸¸µé¾îÁø °ÍÀÌ ´ÙÀ½¿¡ ³ª¿À´Â MakeItSo ÀÌ´Ù. ÀÌ ÇÔ¼öÀÇ À̸§Àº 'µ¨
 ÆÄÀÌ 2 ¾ð¸®½¬µå' ¶ó´Â Ã¥ÀÇ ÀúÀÚ°¡ ÁöÀº ±×´ë·Î»ç¿ëÇß´Ù.

|  function TBasic.MakeItSo(DDResult : HResult) : boolean;
|  begin
|     case DDResult of
|        DD_OK             : Result := TRUE;
|        DDERR_SURFACELOST : Result := RestoreSurfaces <> DD_OK;
|        else                Result := DDResult <> DDERR_WASSTILLDRAWING;
|     end;
|  end;

  MakeItSo ´Â ÇÔ¼öÀÇ ¸®ÅÏ °ªÀ» Àμö·Î ¹Þ¾Æ¼­ ±×°ÍÀÌ DDERR_SURFACELOST ÀÏ
 ¶§´Â RestoreSurfaces ¸¦ È£ÃâÇÏ¿© È­»óÀ» º¹±¸ÇÏ°í, DDERR_WASSTILLDRAWING
 ¸¸ ¾Æ´Ï¶ó¸é Ç×»ó TRUE ¸¦ ¸®ÅÏ Çϵµ·Ï µÇ¾î ÀÖ´Ù.  ¸¸¾à È­»óÀ» º¹±¸Ç϶ó´Â
 ¸Þ¼¼Áö¸¦ ¹Þ°í ¼º°øÀûÀ¸·Î º¹±¸ ½ÃÄ×´Ù¸é FALSE °¡ ¸®Åϵȴٴ °ÍÀ» Àß ¾Ë¾Æ
 µÎ¾î¾ß ÇÑ´Ù. ÀÌ°ÍÀº Á¶±ÝÀÖ´Ù°¡ ´Ù½Ã ¼³¸íÇϱâ·Î ÇÏ°í ¿ì¼± RestoreSurface
 ¶ó´Â ÇÔ¼öºÎÅÍ »ìÆ캸ÀÚ.

|  function TBasic.RestoreSurfaces : HResult;
|  var
|     i : integer;
|  begin
|     Result := PrimarySurface.Restore;
|     if Result = DD_OK then begin
|        for i := 1 to MAX_IMAGE_SURFACE do begin
|           Result := Image[i].Restore;
|           if Result <> DD_OK then begin
|      exit;
|           end;
|        end;
|        if Result = DD_OK then DrawSurfaces;
|     end;
|  end;
|
|  procedure TBasic.DrawSurfaces;
|  var
|     i : integer;
|  begin
|     for i := 1 to MAX_IMAGE_SURFACE do begin
|        DDReloadBitmap(Image[i],GetBitmapName(i));
|     end;
|  end;

  MakeItSo ¿¡¼­ ºÒ·ÁÁø RestoreSurface ´Â Primary ¸¦ º¹±¸ÇÏ°í ³ª¸ÓÁö À̹Ì
 Áö ¹öÆ۵鵵 º¹±¸ ½ÃŲ´Ù.  ±×¸®°í ÀÌ°ÍÀÌ ¸ðµÎ ¼º°øÀûÀ̾ú´Ù¸é DrawSurface
 ¸¦ È£ÃâÇÏ¿© µ¥ÀÌŸ¸¦ ÀÒ¾î ¹ö¸° À̹ÌÁö ¹öÆÛ¸¦ ´Ù½Ã ä¿î´Ù.
  DDReloadBitmap Àº DDUtils.Pas ¿¡ Æ÷ÇԵǾî ÀÖ´Â ÇÔ¼ö·Î½á  ºñÆ®¸ÊÀ» À̹Ì
 Áö ¹öÆÛ¿¡ ¿Ã¸®´Â ¿ªÇÒÀ» ÇÑ´Ù.

  ±×·¯¸é ¿©±â¿¡¼­ »õ·Ó°Ô µîÀåÇÑ DX ÇÔ¼öÀÎ Restore ¸¦ »ìÆ캸ÀÚ.
  ÀÌ ÇÔ¼ö´Â ÇØÁ¦µÇ¾î ¹ö¸° DirectDrawSurface °´Ã¼¿¡ ´ëÇØ  Ç¥¸éÀ» º¹±¸ÇÏ´Â
 ¿ªÇÒÀ» ÇÑ´Ù. PrimarySurface ´Â óÀ½¿¡ º¹ÇÕ È­»ó Ç¥¸éÀ¸·Î Á¤ÀÇ µÇ¾ú±â ¶§
 ¹®¿¡ PrimarySurface.Restore ¸¸ ÇØÁÖ¸é ³ª¸ÓÁö ¿¬°üµÈ ¹é ¹öÆ۵鵵 °°ÀÌ º¹
 ±¸°¡ µÈ´Ù. ( º¹ÇÕ È­»ó Ç¥¸éÀÇ ÀåÁ¡ÀÌ´Ù. )

  ³ª¸ÓÁö´Â Ưº°È÷ ¼º¸íÇÒ ºÎºÐÀº ¾ø´Ù. ´õ ÀÚ¼¼ÇÏ°Ô surface lost ¿¡ ´ëÇؼ­
 ¾Ë°í ½Í´Ù¸é Help ÆÄÀÏÀ» ºÎ¸£¸é µÈ´Ù.


  ±×·¸´Ù¸é À̹ø¿¡´Â MakeItSo °¡ µµ´ëü ¾î¶»°Ô »ç¿ëµÇ´ÂÁö¸¦ ¾Ë¾Æº¸ÀÚ.
 À§¿¡¼­µµ ¸»ÇßµíÀÌ  MakeItSo(PrimarySurface.Flip(nil,DDFLIP_WAIT)) ¸¦ È£
 ÃâÇßÀ» ¶§, ¸¸¾à Ç¥¸éÀ» ÀÒ¾î ¹ö¸° »óŶó¸é Çø®ÇÎÀº ÇàÇØÁöÁö ¾Ê°í MakeIt
 So ¿¡¼­ È­»ó º¹±¸¸¦ À§ÇÑ ÀÛ¾÷¸¸À» ÇÏ°Ô µÈ´Ù. ±×´ë½Å FALSE °¡ ¸®Åϵȴٰí
 ¸»Çß¾ú´Ù.  ÀÌ·² ¶§´Â ½ÇÁ¦·Î MakeItSo °¡ ³¡³ª°í ³ª¼­ Çø®ÇÎ ÇÔ¼ö¸¦ ÇÑ ¹ø
 ´õ ½ÇÇàÇØÁà¾ß ½ÇÁ¦·Î Çø®ÇÎÀÌ ÀϾ°Ô µÈ´Ù. ±×·¡¼­ ¿ì¸®´Â ¾ÕÀ¸·Î ÀÌ ÇÔ
 ¼ö¸¦ ÀÌ·± ½ÄÀ¸·Î¸¸ »ç¿ëÇϱâ·Î ÇÑ´Ù !!

|     repeat
|     until MakeItSo(PrimarySurface.Flip(nil,DDFLIP_WAIT));

  ÀÌ·¸°Ô Çϸé Á¤È®ÇÑ Çø®ÇÎÀÌ ÀϾ¾ßÁö¸¸  repeat until ·çÇÁ¸¦ Å»ÃâÇÏ°Ô
 µÇ´Â °ÍÀÌ´Ù. °æ¿ì¸¦ µûÁ®º¸ÀÚ.

   1> MakeItSo °¡ TRUE ¸¦ ¸®ÅÏ

     : ¹«Á¶°Ç Çѹø¸¸ ½ÇÇàÇÏ°í ·çÇÁ¸¦ ³ª¿Â´Ù.
       MakeItSo ³»ÀÇ ÇÔ¼ö°¡ ¼º°øÇßÀ» ¶§, È­»ó º¹±¸°¡ ½ÇÆÐÇßÀ» ¶§, ÀÌ¿Ü¿¡
       ¿¡·¯°¡ ¹ß»ýÇßÀ» ¶§

   2>  MakeItSo °¡ FALSE ¸¦ ¸®ÅÏ

      : ´Ù½Ã MakeItSo ³»ÀÇ ÇÔ¼ö¸¦ ½ÇÇàÇÑ´Ù.
        È­»ó º¹±¸°¡ ¼º°øÇßÀ» ¶§,DX ºÎÇÏ ¶§¹®¿¡ Áö¿¬µÉ ¶§

  È­»ó º¹±¸°¡ ½ÇÆÐÇϰųª ±× ÀÌ¿Ü ´Ù¸¥ ¿¡·¯¿¡ ´ëÇؼ­ TRUE ¸¦ ¹ß»ý ½ÃÄÑ ·ç
 ÇÁ¿¡¼­ »©³»´Â ÀÌÀ¯´Â ¹«ÇÑ ·çÇÁ¸¦ ¹æÁöÇϱâ À§Çؼ­ÀÌ´Ù.  ¹Ý´ë·Î È­»ó º¹±¸
 °¡ ¼º°øÇßÀ» ¶§¿Í DX Áö¿¬¿¡ ´ëÇØ FALSE ¸¦ ¹ß»ý ÇÏ´Â °Íµµ,  MakeItSo ³»ÀÇ
 ÇÔ¼ö¸¦ ÇÑ ¹ø ´õ ½ÇÇà ½ÃÅ°±â À§Çؼ­ÀÌ´Ù.

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

(4) OnPaint À̺¥Æ® ¼³Á¤

  ¾î¶°ÇÑ ÀÌÀ¯¿¡ ÀÖ¾î¶óµµ À©µµ¿ì È­¸éÀÇ °»½ÅÀÌ ÇÊ¿äÇÑ ºÎºÐÀÌ »ý±æ ¶§´Â ÀÌ
 À̺¥Æ®°¡ Æû¿¡ ¾Ë·ÁÁö°Ô µÈ´Ù. ÀÌ¹Ì ¿ì¸®´Â È­¸éÀ» ´Ù½Ã ÀÐ¾î µéÀÌ´Â ·çƾÀÎ
 DrawSurfaces ¸¦ ¸¸µé¾î µÎ¾ú´Ù.  ±×·¡¼­ ÀÌ À̺¥Æ®¿¡´Â  DirectDraw °´Ã¼°¡
 À¯È¿ÇÏ´Ù¸é DrawSurfaces ¸¦ È£ÃâÇÏ°Ô¸¸ ÇØµÎ¸é ¸ðµç °ÍÀÌ ³¡³­´Ù.

|  procedure TBasic.FormPaint(Sender: TObject);
|  begin
|     if Assigned(DirectDraw) then
|        DrawSurfaces;
|  end;

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

(5) È­¸é °íÁ¤°ú ÇØÁ¦¿¡ ´ëÇÑ ÇÔ¼ö

  ÀÌ ÇÔ¼öµéÀº µµ½º ¶§Ã³·³ Á÷Á¢ È­¸é¿¡ ´ëÇÑ ¸Þ¸ð¸® Æ÷ÀÎÅ͸¦ ¾ò¾î »ç¿ëÀÚÀÇ
 ÀÓÀÇ´ë·Î Á¶ÀÛÀ» ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.  ÀڽŸ¸ÀÇ À̹ÌÁö Å×Å©´ÐÀ» ¹ßÈÖÇÒ ¼ö ÀÖ
 ´Â ÁÁÀº ¹æ¹ýÀ̱ä ÇÏÁö¸¸  ±×·¡ÇÈ Ä«µå¿¡ µû¸¥ Çϵå¿þ¾î °¡¼Ó ±â´ÉÀ» »ç¿ëÇÒ
 ¼ö ¾ø´Ù´Â ´ÜÁ¡À» ¾È°íÀÖ´Ù.

|  procedure TBasic.LockBackGround;
|  begin
|     if not FIsLocked then begin
|        LockDesc.dwSize := SizeOf(TDDSurfaceDesc);
|        repeat
|        until MakeItSo(BackBuffer.Lock(Rect(0,0,MAX_X_LINE,MAX_Y_LINE),
|                       LockDesc,DDLOCK_SURFACEMEMORYPTR +
|                       DDLOCK_WAIT, 0));
|        FIsLocked := TRUE;
|     end;
|  end;
|
|  procedure TBasic.UnlockBackGround;
|  begin
|     if FIsLocked then begin
|        BackBuffer.UnLock(LockDesc.lpSurface);
|        FIsLocked := FALSE;
|     end;
|  end;

  À§ÀÇ µÎ ÇÔ¼ö´Â Ç¥¸éÀ» °íÁ¤ÇÏ°í ÇØÁ¦ÇÏ´Â ÇÔ¼öÀÌ´Ù.
 TBasic.LockBackGround ºÎÅÍ »ìÆ캸ÀÚ. À̹ø °­Á¿¡ »õ·Î ¸¸µç private º¯¼ö
 ÀÎ FIsLocked ´Â Ç¥¸éÀÌ °íÁ¤µÇ¾úÀ» ɧ§¢¸¸ TRUE ¸¦ °¡Áø´Ù. µû¶ó¼­ ¸ÕÀú À̹Ì
 °íÁ¤µÇ¾ú´Â °¡¸¦ È®ÀÎÇÏ¿©, ±×·¸Áö ¾Ê´Ù¸é Ç¥¸é °íÁ¤ ÀÛ¾÷À» ½ÃÀÛÇÏ°Ô µÈ´Ù.
 LockDesc ´Â Lock ÇÔ¼ö¸¦ À§ÇØ µû·Î ¸¸µç TDDSurfaceDesc º¯¼ö·Î¼­, Lock ¿¡
 ¼­ µ¹¾Æ¿À´Â ¸®ÅÏ °ªÀÌ ³ªÁß¿¡ Áß¿äÇÏ°Ô ¾²À̱⠶§¹®¿¡  º°µµ·Î public ¼±¾ð
 À» ÇÑ°ÍÀÌ´Ù.

  Áß¿äÇÑ °ªÀ̶õ, LockDesc.lpSurface ¿Í LockDesc.lPitch ¸¦ ¸»ÇÏ´Â °ÍÀÌ´Ù.

  LockDesc.lpSurface ´Â ¿ì¸®°¡ ¾Ë°í ½Í¾îÇÏ´ø Ç¥¸é ¸Þ¸ð¸®ÀÇ ½ÃÀÛ¹øÁö,  Áï
 (0,0) ÀÇ Áּҷνá, µµ½º¶§ÀÇ A000:0000 ÁÖ¼Ò¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ¹°·Ð º¯¼ö
 ¾Õ¿¡ lp °¡ ºÙÀº °É·Î ºÁ¼­ long pointer ÀÎ 4 bytes Æ÷ÀÎÅÍ º¯¼öÀÌ´Ù. ±×·¡
 ¼­ DWORD ·Î ¼±¾ðÇÑ °ªÀ¸·Î LockDesc.lpSurface ¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù.

  LockDesc.lPitch ´Â Ç¥¸éÀÇ ³í¸®Àû °¡·Î ÆøÀÌ´Ù. µµ½º¿¡¼­ º£»ç¸¦ ´Ù·ç¾îº¸
 ½Å ºÐÀ̶ó¸é 640 ÀÇ °¡·Î ±æÀ̸¦ ³í¸®Æø¸¸ 1024 ·Î ´Ã¿© ¹ðÅ© ÀüȯÀÇ °è»êÀ»
 °£´ÜÇÏ°Ô ÇÏ·Á ÇϽŠºÐÀÌ ÀÖÀ»·±ÀÚ ¸ð¸£°Ú´Ù. ÀÌ·¸°Ô ÇÏ¸é ½ÇÁ¦ÀÇ È­¸éÀÇ »ç
 ÀÌÁî´Â °¡·Î 640 ÀÌÁö¸¸ ¸Þ¸ð¸® »óÀ¸·Î´Â °¡·Î°¡ 1024 °¡ µÈ´Ù.  µû¶ó¼­ 640
 * 480 * 256 color ¿¡¼­ (0,0) °ú (0,1) ÀÇ ¹øÁö Â÷ÀÌ°¡ 640 ÀÌ ¾Æ´Ñ 1024°¡
 µÇ¾úÀ» °ÍÀÌ´Ù. LockDesc.lPitch ¿ª½Ã ÀÌ·± °³³äÀÌ´Ù. ÀϺΠīµåÀÇ °æ¿ì¿¡´Â
 DX ½º½º·Î°¡ °¡·Î°¡ 640 ÀÌ¶óµµ 1024 ·Î ³»ºÎ ³í¸®ÆøÀ» Àâ¾ÆÁØ´Ù. ±×·¡¼­ ÀÌ
 º¯¼ö¿¡´Â ( °¡·ÎÀÇ ³í¸®Æø * byte per pixel ) ÀÌ µé¾î°¡°Ô µÈ´Ù. ±× ¶§¹®¿¡
 (0,0) °ú (0,1) ÀÇ ¹øÁö Â÷ÀÌ´Â lPitch ¸¸Å­ »ý±â°Ô µÈ´Ù. ÀÌÇØ°¡ µÇ½Å ºÐÀÌ
 ¶ó¸é Áö±ÝÂë, " ¾ÆÇÏ... ±×·³ y ÁÂÇ¥ Çϳª ´Ã¾î³¯¶§¸¶´Ù lPitch ¸¦ ´õÇØÁÖ¸é
 µÇ´Â±º.. " À̶ó°í »ý°¢Çϰųª, ´õ ³ª°¡¼­ " À½... ±×·³ (x,y) ¿¡ ´ëÇÑ ¹øÁö
 °è»êÀº ( longint(LockDesc.lpSurface) + y * LockDesc.lPitch + x * 3 ) °¡
 µÇ°Ú±º... " ÇÏ°í »ý°¢ÇÒ °ÍÀÌ´Ù.  ±×·¡¼­ µµ½º¶û °°Àº °³³äÀ̶ó°í ÇÒ ¼ö ÀÖ
 ´Ù. °Ô´Ù°¡ ºñµð¿À Ä«µå¿¡ »ó°ü¾øÀÌ ¹ðÅ©°¡ ÇÊ¿ä ¾ø´Â ¼±Çü ¸Þ¸ð¸®·Î ¾Ö¹Ä·¹
 ÀÌ¼Ç Çϱ⠶§¹®¿¡ ÇÁ·Î±×·¡¸Ó·Î¼± ¹Ý°¡¿î ÀÏÀÌ´Ù.  ( ÇÏÁö¸¸ Àß Â¥¿©Áø µµ½º
 ¿¡¼­ º¸´Ü ¾î¿ ¼ö ¾øÀÌ ´À¸®°Ô µÇ°ÚÁö¸¸.... )

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

(6) Ãß°¡ »çÇ׿¡ ´ëÇÑ ÀÌÀü À̺¥Æ® °³¼±

  1) TBasic.FormShow ¿¡¼­..

     ¿©±â¼­´Â FlippingEnabled := TRUE;  ¹Ù·Î ¾Õ¿¡ ¸î ÁÙÀÇ Äڵ带 ³Ö¾î ÁÖ
    ¾î¾ß ÇÑ´Ù. ÀÌ ÄÚµå´Â ¹é ¹öÆÛ¸¦ Áö¿ì´Â ¿ªÇÒÀ» Çϴµ¥ ÀϺΠ±×·¡ÇÈ Ä«µå
    ¿¡¼­´Â ÃʱâÈ­ ¶§ ¹é ¹öÆÛ¸¦ Áö¿ìÁö ¾Ê´Â °ÍÀÌ ¹ß°ßµÇ¾ú±â ¶§¹®ÀÌ´Ù.
    ( ¿¹¸¦ µé¸é ATI MACH 64 .. )

|     LockBackGround;
|     pVideo := PDWORD(LockDesc.lpSurface);
|     for i := 0 to pred(MAX_Y_LINE) do begin
|        FillChar(pVideo^,MAX_X_LINE * BPP,0);
|        inc(longint(pVideo),LockDesc.lPitch);
|     end;
|     UnlockBackGround;

     ¸¸¾à¿¡ ÀÌ Äڵ尡 ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù¸é »èÁ¦ ÇØÁ־ ÁÁ´Ù.  ½ÇÁ¦ °ÔÀÓÀ»
    ¸¸µå·Á¸é ¾îÂ¥ÇÇ ¹é¹öÆÛ¸¦ Áö¿ì´Â °úÁ¤ÀÌ ÇÑ ¹ø ÀÌ»ó µé¾î°¡±â ¶§¹®ÀÌ´Ù.

  2) TBasic.UpdateDisplay ¿¡¼­..

     ¿©±â´Â Çø®ÇÎ ÇÔ¼ö¿¡ ´ëÇØ MakeItSo ¸¦ ³Ö¾î ÁÖ¾î¾ß ÇÑ´Ù. ¿ë¹ýÀº À§¿¡
    ¼­ ¾ð±ÞÇÑ ±×´ë·ÎÀ̸ç,  ±× ¾Õ¿¡´Â ½ÇÁ¦ ±×¸²À» ±×¸®´Â DrawScreen ÀÌ ÄÚ
    µå¿¡ Ãß°¡µÇ¾ú´Ù.

|  procedure TBasic.UpdateDisplay(is_commandable : boolean);
|  begin
|     DrawScreen;
|     repeat
|     until MakeItSo(PrimarySurface.Flip(nil,DDFLIP_WAIT));
|  end;

     ÇöÀçÀÇ DrawScreen Àº È­¸é ( 300,200 ) ¿¡ ³ì»öÀÇ Á¡ Çϳª¸¦ ´Þ¶û Âï´Â
    Ç㹫ÇÑ °á°ú¸¦ ³º°Ô µÈ´Ù.

|  procedure TBasic.DrawScreen;
|  begin
|     LockBackGround;
|     PDWORD(DWORD(LockDesc.lpSurface)+LockDesc.lPitch*200+300*BPP)^
                := $0000FF00;
|     UnlockBackGround;
|  end;

     Lock À» »ç¿ëÇÏ¿© Á¡À» Âï´Â ºÎºÐÀº  ³ªÁß¿¡ ´Ù½Ã ÀÚ¼¼ÇÏ°Ô ´Ù·ç°Ô µÇ´Ï
    Áö±ÝÀº ±×·¯·Á´Ï.. ÇÏ¸ç ³Ñ¾î°¡±â ¹Ù¶õ´Ù.

  3) ¿¹¿Ü Çڵ鷯ÀÇ °»½Å

     ÀÌÁ¦ Lock À̶ó´Â °³³äÀÌ Çϳª ´õ »ý°åÀ¸´Ï Ç¥¸éÀÌ Lock µÇ¾î ÀÖ´Â »óȲ
    ¿¡¼­µµ Çø®ÇÎó·³ °°Àº °úÁ¤À» ÇØÁÖ¾î¾ß ÇÑ´Ù. ¸¸¾à Ç¥¸éÀÌ °íÁ¤µÇ¾î ÀÖ
    ´Â »óÅ¿¡¼­  GDI ÀÇ ±×·¡ÇÈ ÇÔ¼ö³ª DX ÀÇ Blt ÇÔ¼ö·ù¸¦ »ç¿ëÇÏ°Ô µÈ´Ù¸é
    ´çÀå ´Ù¿îÀÌ µÇ¾î ¹ö¸®´Â°á°ú°¡ µÈ´Ù.  ±×·¡¼­ Ç×»ó GDI ¸¦ Ç¥½ÃÇϱâ À§
    Çؼ­ Ç¥¸éÀÇ Lock À» ÇØÁ¦ÇÏ¿©¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ ºÎºÐµµ ¿ª½Ã Lock À»
    ´Ù·ç´Â ºÎºÐ¿¡¼­ ´õ ÀÚ¼¼È÷ ¾ð±ÞÇϵµ·ÏÇÏ°Ú´Ù.

|  procedure TBasic.ExceptionHandler(Sender : TObject; Error : Exception);
|  var
|     WasEnabled : boolean;
|     WasLocked  : boolean;
|  begin
|    { ¿¹¿Ü ¸Þ¼¼Áö¸¦ º¸À̱â Àü¿¡ GDI·Î Àüȯ }
|     MessageBeep(0);
|
|     WasEnabled      := FlippingEnabled;
|     FlippingEnabled := FALSE;
|
|     WasLocked       := FIsLocked;
|     if WasLocked then begin
|        UnlockBackGround;
|     end;
|
|     if Assigned(DirectDraw) then DirectDraw.FlipToGDISurface;
|
|     MessageDlg(Error.Message,mtError,[mbOK],0);
|
|     if WasLocked then begin
|        LockBackGround;
|     end;
|
|     FlippingEnabled := WasEnabled;
|
|  end;

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (4) - ´ÙÀÌ·ºÆ® X ±âº»ÀûÀÎ À̹ÌÁö Âï±â
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 DX ¿¡ ´ëÇÑ ¸ðµç ÃʱâÈ­´Â ³¡³µ´Ù.
 ¾Æ¸¶µµ ¿©±â±îÁöÀÇ ºÎºÐÀº Æ®·çÄ÷¯¿Í´Â »ó°ü ¾ø´Â ºÎºÐÀÌ ´ëºÎºÐÀ̾ú´Ù. ±×
¸®°í  ´©±¸³ª ¾øÀÌ DX ¸¦ ¾²°íÀÚ ÇÏ´Â »ç¶÷À̶ó¸é °ÅÀÇ À¯»çÇÑ ¹æ¹ýÀ¸·Î Ãʱâ
È­¸¦ Çϸ®¶ó°í »ý°¢ÇÑ´Ù.

 ¿©±â¼­ºÎÅÍ´Â °ÔÀÓÀÇ µ¶Æ¯ÇÑ °ÔÀÓ ±â¹ýÀ» ¹ßÈÖÇÒ ±âȸ°¡ »ý±æ °ÍÀÌ´Ù. ÀÌ °­
Á¿¡¼­´Â DX ¿¡¼­ Áö¿øÇÏ´Â ¸Þ¼Òµå¸¦ ÀÌ¿ëÇؼ­ È­¸éÀ» Âï¾îº»´Ù.  DX ÀÇ ³»Àå
¸Þ¼Òµå´Â ±×·¡ÇÈ Ä«µå¿¡ µû¸¥ Çϵå¿þ¾î °¡¼Ó ±â´ÉÀ» Áö¿øÇϱ⠶§¹®¿¡ À߸¸ »ç
¿ëÇÑ´Ù¸é µµ½º ºÎ·´Áö ¾ÊÀº ¼Óµµ°¡ °¡´ÉÇÏ´Ù°í º»´Ù.

 ÀÌÁ¦ºÎÅÍ´Â ³ª¸ÓÁö ¸ðµç ¼Ò½º´Â ±×´ë·Î µÐ ä, DrawScreen ¸¸À» ¼öÁ¤ÇÏ¿© »ç
¿ëÇÏ´Â ¹æ¹ýÀ» ¾µ °ÍÀÌ´Ù.

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

(1) ³×¹ø° ÇÁ·ÎÁ§Æ®ÀÇ ½ÃÀÛ

  ¸ÕÀú ÀÌÀü¿¡ Á¦ÀÛÇÑ DX24Bit3.Dpr À» ÀÐ¾î µéÀδÙ.  Save Project As ¸¦ ¼±
 ÅÃÇÏ¿© ÀúÀå½Ã¿¡ À̸§À» DX24Bit4.Dpr ·Î ¹Ù²Û´Ù.  Save As ·Î MainUnt3.Pas
 µµ MainUnt4.Pas ·Î ¹Ù²Û´Ù.

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

(2) TBasic Ŭ·¡½º¿¡¼­ Ãß°¡ÇÒ Çʵå¿Í ¸Þ¼Òµå

  ¾ø´Ù! ( ³ÃÁ¤Çϱº.. )
 Á¶±Ý Àü¿¡µµ ¸»ÇßÁö¸¸ ÀÌÁ¦´Â DrawScreen ¸¸À» °³Á¶ÇÏ¿© »ç¿ëÇÒ °ÍÀ̱⠶§¹®
 ÀÌ´Ù.

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

(3) ¿ì¸®°¡ È­¸é¿¡ ÂïÀ» ù¹ø° À̹ÌÁö

  ÀÚ·á½Ç¿¡ ÇÔ²² ¿Ã¶ó¿Â Å×½ºÆ®¿ë ÇÁ·Î±×·¥¿¡´Â Test1.Bmp ¿Í Test2.Bmp ¶ó´Â
 ¿¹Á¦ ºñÆ®¸ÊÀÌ ÀÖ´Ù. ¿ì¸®´Â ÀÌÁ¦ºÎÅÍ ÀÌ ºñÆ®¸ÊÀ¸·Î ¸ðµç °ÍÀ» ó¸®ÇÏ°Ô µÉ
 °ÍÀÌ´Ù.

  Âü°í·Î ¸»ÇØ µÎÀÚ¸é, Test1.Bmp ´Â ÇÊÀÚ°¡ ¸¸µé¾ú´ø °ÔÀÓÀÎ ´ëº¯ ÆÄÀÌÅÍ µî
 ¿¡ ³ª¿Ô´ø ½ºÇÁ¶óÀÌÆ®µéÀÌ ÀÖ°í  Test2.Bmp ¿¡´Â ¿ª½Ã ÇÊÀÚ°¡ ¸¸µé¾ú´ø ´ëº¯
 ÆÄÀÌÅÍÀÇ ¹è°æ È­¸éÀÌ µé¾î ÀÖ´Ù. ( ÀÌ ±×¸²µéÀº ¸ðµÎ °øµ¿ Á¦ÀÛÀÚ¿´´ø ³×Åä
 ( ¹Ú¼ºÁø : NeoTouch )°¡ Á¦ÀÛÇÑ ±×¸²µéÀÌ´Ù. )

  ÀÌÀü¿¡ DrawScreen ÀÇ ÄÚµå´Â ¸ðµÎ »èÁ¦´ÙÀ½ÀÇ °ÍÀ¸·Î ±³Ã¼ÇÑ´Ù.

|  procedure TBasic.DrawScreen;
|  begin
|     repeat
|     until MakeItSo(BackBuffer.BltFast(random(600),random(400),Image[1],
|                    Rect(0,26,52,95),DDBLTFAST_SRCCOLORKEY));
|  end;

  ¼³¸íÀº µÚ·Î ¹Ì·ç°í ¿ì¼± ½ÇÇàºÎÅÍ ½ÃÄѺ¸ÀÚ. ¾Æ¸¶ '´ëº¯ ÆÄÀÌÅÍ'ÀÇ ³×Åä°¡
 È­¸é¿¡ ·£´ýÀ¸·Î ÂïÈú °ÍÀÌ´Ù. ¿©±â¼­ ÁÖ¸ñÇØ¾ß ÇÒ Àç¹ÌÀÖ´Â Á¡À̶ó¸é, ºñµð
 ¿À ·¥ÀÌ 1M ÀÎ Ä«µå¿Í 2M ÀÎ Ä«µå°¡ °¢°¢ ´Ù¸¥ °á°ú¸¦ ³ªÅ¸³½´Ù´Â °ÍÀÌ´Ù.

  ÇÑ È­¸éÀ» Ç¥½ÃÇÒ ¼ö ÀÖ´Â ¸Þ¸ð¸®ºÎÅÍ ¿ì¼± °è»êÇØ º¸ÀÚ. 640 * 480 * 3 À»
 Çϸé 921,600 bytes °¡ ÇÊ¿äÇÏ´Ù´Â °è»êÀÌ ³ª¿Â´Ù.  1024 ·Î ³ª´©¾î º¸¸é °á
 ±¹ 900 KB °¡ µç´Ù´Â ¾ê±âÀÌ´Ù. ±×·¯¹Ç·Î ºñµð¿À ·¥ ¿ë·®ÀÌ 1M ¶ó¸é primary
 ´Â ºñµð¿À ¸Þ¸ð¸®°¡ µÇÁö¸¸  ¹é ¹öÆÛ´Â ºñµð¿À ¸Þ¸ð¸® ºÎÁ·À¸·Î ÀÏ¹Ý RAM ¿µ
 ¿ª¿¡ »ý¼ºÀÌ µÇ°í °á±¹ Flip À̶ó´Â °úÁ¤Àº ¹é ¹öÆÛ¸¦ primary ·Î º¹»ç¸¦ ÇÏ
 ´Â °ÍÀÌ µÈ´Ù. µû¶ó¼­ ³×ÅäÀÇ À̹ÌÁö´Â µµ½º ¶§ °¡»ó ¹öÆÛ¸¦ ¾²´Â °Íó·³ ÀÌ
 ¹ÌÁö°¡ È­¸é¿¡ Ãß°¡ µÇµíÀÌ ÂïÈ÷°Ô µÈ´Ù.

  ÇÏÁö¸¸ ºñµð¿À ·¥ÀÌ 2M ÀÌ»óÀ̶ó¸é 900 KB Â¥¸®  µÎ °³ÀÇ Ç¥¸éÀÌ ¸ðµÎ ºñµð
 ¿À ·¥ »ó¿¡ È®º¸°¡ µÇ°í Flip À̶ó´Â °úÁ¤Àº  ±×·¡ÇÈ ½ÃÀÛ ÁÖ¼Ò¸¦ ¹Ù²Ù¾î ÁÖ
 ´Â Çü½ÄÀÌ µÇ¾î µÎ È­¸éÀÌ °¢°¢ À̹ÌÁö°¡ ÂïÈ÷¸ç ºü¸¥ ÀüȯÀÌ ÀϾ´Â °Íó
 ·³ º¸ÀÌ°Ô µÈ´Ù.  ( ÇÊÀÚµµ óÀ½¿£ À̷и¸À¸·Î ¾Ë°í ÀÖ´ø °ÍÀ̶ó Á÷Á¢ µý ±×
 ·¡ÇÈ Ä«µå¿¡¼­ ´«À¸·Î È®ÀÎ ÇÏ°í¼­¾ß ÀÌ ±ÛÀ» ÀÚ½ÅÀÖ°Ô ÀûÀ» ¼ö ÀÖ¾ú´Ù. )

  ±×·³.. óÀ½ ³ª¿Â DX ÇÔ¼öÀÎ BltFast ¿¡ ´ëÇؼ­ ¼³¸íÇÏ°Ú´Ù.
 ÀÌ ÇÔ¼ö´Â º¹»çÇÒ À̹ÌÁöÀÇ Åõ¸í»ö ¶Ç´Â º¹»çµÇ´Â °÷ÀÇ Åõ¸í»ö¿¡ µû¶ó  ºí·Ï
 Àü¼ÛÀ» ÇàÇÏ´Â ÇÔ¼öÀÌ´Ù. ±×¸®°í Ç×»ó 1 : 1 »çÀÌÁî·Î Àü¼ÛÇÏ´Â Á¡°ú Ŭ¸®ÇÎ
 ÀÌ µÇÁö ¾Ê´Â´Ù´Â Á¡ÀÌ Blt ÇÔ¼ö¿Í Å©°Ô ´Ù¸¥ Á¡À̸ç ÀÌ·Î ÀÎÇØ ¾ò´Â ¼ÓµµÀÇ
 À̵æÀº 10% Á¤µµ¶ó°í ¾Ë·ÁÁ® ÀÖ´Ù. ÇÏÁö¸¸ Çϵå¿þ¾î °¡¼ÓÀÌ »ç¿ëµÉ °æ¿ì¿¡´Â
 µÎ °¡ÁöÀÇ ¼ÓµµÂ÷ÀÌ´Â ¾ø´Ù.

  ÇÔ¼öÀÇ ¿øÇüÀº  function  BltFast(DWORD, DWORD, var IDirectDrawSurface,
 TRect, DWORD) : HResult; ÀÌ´Ù. óÀ½ÀÇ DWORD ´Â ÂïÇôÁú (x,y) ÁÂÇ¥ÀÌ°í ´Ù
 À½ÀÇ Àμö´Â ¿øº» À̹ÌÁö°¡ Àִ ǥ¸é, ±× ´ÙÀ½Àº ¿øº» À̹ÌÁöÀÇ TRect ÇüÀÇ
 »ç°¢ ±¸°£, ±×¸®°í ¸¶Áö¸·ÀÇ DWORD ´Â Àü¼ÛÇϴ ŸÀÔÀ» ¼³Á¤ÇÏ´Â ºÎºÐÀÌ´Ù.

   < Àü¼Û ŸÀÔ >

     DDBLTFAST_DESTCOLORKEY
        : Àü¼ÛµÉ °÷ÀÇ Åõ¸í»öÀ» Àû¿ëÇÑ´Ù.
     DDBLTFAST_NOCOLORKEY
        : Åõ¸í»ö ¾øÀÌ ±×³É Âï´Â´Ù.
     DDBLTFAST_SRCCOLORKEY
        : Àü¼ÛÇÏ´Â °÷ÀÇ Åõ¸í»öÀ» Àû¿ëÇÑ´Ù.
     DDBLTFAST_WAIT
        : ¸¸¾à ÇÔ¼ö¿¡¼­ ¿¡·¯ ¶Ç´Â ´ë±â°¡ ¹ß»ýÇÏ´õ¶óµµ °è¼Ó ½ÇÇàÇÑ´Ù.

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

(4) ¿ì¸®°¡ È­¸é¿¡ ÂïÀ» µÎ¹ø° À̹ÌÁö

  ¿ì¸®°¡ óÀ½ ÂïÀº À̹ÌÁö´Â ±×·¡ÇÈ Ä«µåÀÇ ¸Þ¸ð¸®¿¡ µû¸¥ Flip ¹æ¹ýÀ» ³ªÅ¸
 ³» ÁÖ´Â ¼öÁØ¿¡ ºÒ°úÇß´Ù. ±×¸®°í ±âº»ÀûÀÎ ºí·Ï Àü¼Û ÇÔ¼öÀÎ BltFast ¿¡ ´ë
 Çؼ­µµ ´Ù·ç¾î º¸¾Ò´Ù.  À̹ø¿¡ ÂïÀ» À̹ÌÁö ¿ª½Ã º°·Î »õ·Î¿ï °Ô ¾ø´Â °ÍÀ¸
 ·Î¼­, Blt ÇÔ¼ö·Î À̹ÌÁö¸¦ È®´ëÇØ º¸´Â ¿¹Á¦¸¦ ¸¸µé¾î º¸°Ú´Ù.

|  procedure TBasic.DrawScreen;
|  begin
|     repeat
|     until MakeItSo(BackBuffer.Blt(
|                    Rect(0,0,random(52*3)+52,random(95*3)+95),Image[1],
|                    Rect(0,26,52,95),DDBLT_KEYSRC,PDDBLTFX(nil)^));
|  end;

  ÀÌÀüÀÇ DrawScreen ÇÔ¼ö¸¦ ÀÌ·¸°Ô ´Ù½Ã ¹Ù²Ù¾î ½á º¸ÀÚ.  ÀÌ°ÍÀ» ½ÇÇà ½ÃÅ°
 ¸é  ³×ÅäÀÇ ±×¸²ÀÌ °¡·Î ¼¼·Î ºÒ±ÔÄ¢ÇÑ ÇüÅ·Π´Ã¾î³ª¼­ ÂïÈú °ÍÀÌ´Ù.  ÀÌ·±
 ±â´ÉÀº BltFast ¿¡´Â ¾ø¾ú´Ù.  ±×·¡¼­ Blt ÇÔ¼ö¿¡¼­´Â BltFast °¡ ÂïÈú °÷ÀÇ
 (x,y) ÁÂÇ¥¸¸À» ³Ñ°Ü ÁÖ´Â °Í¿¡ ¹ÝÇØ ÀÌ ÇÔ¼ö´Â °¡·Î ¼¼·Î ±æÀÌ Á¤º¸±îÁö ´ã
 À» ¼ö ÀÖ´Â TRect ÇüÀ¸·Î ÂïÈú °÷ÀÇ ÁÂÇ¥¸¦ ³Ñ°Ü ÁÖ°Ô µÈ´Ù.  ±×·¯¸é ¾Ë¾Æ¼­
 À̹ÌÁö¸¦ ¿ø·¡ °Í¿¡¼­ ´ÃÀ̰ųª ÁÙ¿©¼­ ±× »ç°¢Çü¿¡ ÀÚµ¿À¸·Î ¸ÂÃß¾î ÁØ´Ù.
 BltFast ¿¡¼­ DDBLTFAST_SRCCOLORKEY ¿¡ ÇØ´çÇÏ´Â °ÍÀº DDBLT_KEYSRC ÀÌ´Ù.
 ÂïÈú °÷ÀÇ Åõ¸í»öÀ» Àû¿ëÇÏ·Á¸é DDBLT_KEYDEST ¸¦ »ç¿ëÇÏ¸é µÈ´Ù. Blt ÀÇ Àü
 ¼Û ŸÀÔ ¼³Á¤Àº ²Ï³ª ¸¹À¸´Ï °¢ÀÚÀÇ Ã¥À̳ª Help ¸¦ Âü°íÇϱ⠹ٶõ´Ù.  ±×¸®
 °í ¸¶Áö¸·¿¡ ³Ö¾îÁÖ´Â Àμö´Â TDDBLTFX Çü º¯¼öÀÇ ÁÖ¼Ò¸¦ ³Ñ°ÜÁÖ´Â °ÍÀÌÁö¸¸
 ¿ì¸®´Â ÀÌ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏÁö ¾ÊÀ¸¹Ç·Î nil ÀÌ ´ã°ÜÁø º¯¼ö¸¦ ³Ö¾î¾ß ÇÑ´Ù.
 ÇÏÁö¸¸ ¹Ù·Î nil À» ¾²¸é  ÆĽºÄ®ÀÇ °­·ÂÇÑ Å¸ÀÔ Ã¼Å© ´öºÐ¿¡ ¿¡·¯¸¦ ³»°í¸¸
 ´Ù.  ±×·¡¼­ Æí¹ýÀ» µ¿¿øÇÏ¿© nil À» TDDBLTFX ÇüÀÇ Æ÷ÀÎÅͶó°í ¼ÓÀÎ ÈÄ '^'
 ·Î º¯¼ö°¡ ÀÖ´Â °Íó·³ ¸¸µé¾î ³½´Ù. ÇÊÀÚ´Â ÁÖ·Î ÀÌ·± ¹æ¹ýÀ¸·Î ÄÄÆÄÀÏ·¯¸¦
 ¼ÓÀÌÁö¸¸(?) ÀÌ°ÍÀÌ Á¤È®ÇÑ ¹æ¹ýÀÎÁö´Â ¾Ë ¼ö°¡ ¾ø´Ù. ÃÖ¼ÒÇÑ ¿¡·¯´Â ¾È³ª´Ï
 ¹®Á¦´Â ¾øÀ» µí ½Í´Ù.

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (5) - °ÔÀÓÀ» À§ÇÑ ±âº» Ŭ·¡½º ±¸¼º(1)
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 ÀÌÁ¦±îÁö ´Ù·é °ÍÀº DX ¿¡¼­ ±âº»Àû·Î ÇÏ¿©¾ß ÇÒ ¸ðµç ºÎºÐÀ» ¸ðµÎ ¾ð±ÞÇß´Ù
°í º»´Ù.  ( ¹°·Ð ¼ö¹Ú °ÑÇӱ⠽ÄÀ¸·Î ³Ñ¾î°¬Áö¸¸ ÀÚ¼¼ÇÑ °øºÎ¿¡ ´ëÇÑ Ã¥ÀÓÀº
¿©·¯ºÐµé¿¡°Ô ÀÖ´Â °ÍÀÌ´Ù. )

 À̹øÀÇ °­Á´ ¿ø·¡ÀÇ °­ÀÇ °èȹ¿¡µµ ¾ø¾ú°í  °­ÀÇ ÃëÁö¿¡µµ ¸ÂÁö ¾Ê´Â ºÎºÐ
ÀÌÁö¸¸ ´ÙÀ½ ºÎºÐ °­ÀÇ·Î ³Ñ¾î°¡±â À§Çؼ­´Â ²À ÀÖ¾î¾ß ÇÑ´Ù°í »ý°¢Çϱ⿡ ÀÌ
·¸°Ô '5Àå' À̶ó´Â ºÎºÐÀ¸·Î ÇÒ´çÀ» Çß´Ù.

 ´Ù¸§ÀÌ ¾Æ´Ï¶ó Á¦¸ñ°ú °°ÀÌ '°ÔÀÓ Å¬·¡½º' ±¸¼ºÀÌ´Ù.  µµ½º¶§³ª  À©µµ¿ì¶§³ª
DX ¶§³ª ¸Õ ¹Ì·¡¿¡¼­³ª...  ¸ðµÎ À̹ø¿¡ ÀÛ¼ºÇÒ Å¬·¡½º¿Í °°Àº °ÍÀ» ¸¸µé¾î¾ß
Çϱ⶧¹®¿¡ °ÔÀÓ Å¬·¡½º ±¸¼º¿¡ ´ëÇÑ ÀÌÇظ¦ µ½°íÀÚ °£´ÜÇÏ°Ô ³ª¸¶ ÇÊÀÚ°¡ ¶Ò
µü °Å·Á º» °ÍµéÀÌ´Ù.

 À̹ø¿¡´Â »õ·Î¿î À¯´ÖÀÌ Çϳª ÇÊ¿äÇÏ°Ô µÈ´Ù.  ÀÌ Å¬·¡½ºµéÀ» Á¤ÀÇÇÏ°í ±×°Í
¿¡ µû¸¥ ¸Þ¼ÒµåÀÇ Äڵ嵵 ÇÔ²² µé¾î°¡´Â À¯´ÖÀÌ´Ù.

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

(1) ´Ù¼¸¹ø° ÇÁ·ÎÁ§Æ®ÀÇ ½ÃÀÛ

  ¸ÕÀú ÀÌÀü¿¡ Á¦ÀÛÇÑ DX24Bit4.Dpr À» ÀÐ¾î µéÀδÙ.  Save Project As ¸¦ ¼±
 ÅÃÇÏ¿© ÀúÀå½Ã¿¡ À̸§À» DX24Bit5.Dpr ·Î ¹Ù²Û´Ù.  Save As ·Î MainUnt4.Pas
 µµ MainUnt5.Pas ·Î ¹Ù²Û´Ù.

  File ¸Þ´º¿¡¼­ New ¸¦ ¼±ÅÃÇÏ°í ´Ù½Ã Unit ¸¦ ¼±ÅÃÇÏ¿© »õ·Î¿î À¯´ÖÀ» Çϳª
 »ý¼ºÇÑ´Ù. ¾Æ¸¶µµ ¼³··ÇÑ ¸î ÁÙÀÇ Äڵ常ÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù.

  ¸ÕÀú ÀÌ À¯´ÖÀ» MainUnt5.Pas ¿¡ ¿¬°áÇϱâ À§Çؼ­  MainUnt5.Pas ÀÇ ¼Ò½ºÀÇ
 À¯´Ö ¼±¾ð ºÎºÐ¿¡ SubUnit5 ¸¦ Ãß°¡ÇÑ´Ù.

  ´ÙÀ½¿¡´Â SubUnit5.Pas ºÎºÐ¿¡¼­ MainUnt5.Pas ¸¦ ¼±¾ðÇϱâ À§Çؼ­ À¯´Ö ¼±
 ¾ð ºÎºÐÀ» °íÃÄ¾ß Çϴµ¥... ²À implementaion ºÎºÐ¿¡ uses MainUnt5; ¸¦ ÇØ
 ¾Ö¸¸ ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é Circular Reference ¿¡ °É¸®±â ¶§¹®ÀÌ´Ù. ( ÀÌ ºÎ
 ºÐÀº ÆĽºÄ®ÀÇ À¯´Ö ±¸Á¶ÀÇ Æ¯¼º ¶§¹®À̱⠶§¹®¿¡  C À¯Àú´Â ±íÀÌ ¾Ë ÇÊ¿ä´Â
 ¾øÀ» °Í °°´Ù. Âü°í·Î C ´Â ÀÌ·± °ÍÀ» extern À¸·Î ÇØ°áÇÑ´Ù. )

  ±×¸®°í SubUnit5.Pas ÀÇ interface ºÎºÐ¿¡ ¾Æ·¡ÀÇ °ÍÀ» Ãß°¡ÇÑ´Ù.

|  uses
|     Windows, DDraw;

  ÀÌ·¸°Ô ÇÏ¸é »õ·Î¿î À¯´Ö¿¡ ´ëÇÑ ¸ðµç ±âº»ÀûÀÎ ¼±¾ðÀº ³¡³ª°Ô µÈ´Ù.

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

(2) SubUnit5.Pas ¿¡ ¾²ÀÏ Å¸ÀÔ°ú »ó¼ö ¼±¾ð

|  type
|     TTileInfo = (tiFireBall, tiFlame, tiEnergyBall, tiNeTo1, tiNeTo2,
|                  tiDemon);
|
|  const
|     TileInfo : array[TTileInfo] of TRect = (
|        (Left :   0; Top :   0; Right :  27; Bottom :  11),
|        (Left :  30; Top :   0; Right :  70; Bottom :  22),
|        (Left :  73; Top :   0; Right :  84; Bottom :  11),
|        (Left :   0; Top :  26; Right :  52; Bottom :  95),
|        (Left :  56; Top :  26; Right : 108; Bottom :  95),
|        (Left :   7; Top :  99; Right : 257; Bottom : 369)
|     );

  À§ÀÇ Å¸ÀÔ°ú »ó¼ö ÁöÁ¤Àº image[1]¿¡ ÀúÀåµÈ ºñÆ®¸Ê ±×¸²¿¡ ´ëÇÑ °æ°è ¿µ¿ª
 ÀÇ ÁöÁ¤ÀÌ´Ù. 6 °³ÀÇ Å¸ÀÏ Á¤º¸¿¡ ´ëÇÑ °æ°è ÁÂÇ¥´Â ÇÊÀÚ°¡ µð·°½º ÆäÀÎÅÍ¿¡
 ¼­ ³ë°¡´Ù·Î ¾Ë¾Æ³½ ÁÂÇ¥µéÀÌ´Ù. ( ^_^ )

  °¢°¢ÀÇ enum Çü ŸÀÏ¿¡ ´ëÇÑ ¼³¸íÀº ´ÙÀ½°ú °°´Ù.

     tiFireBall   : ³×Åä°¡ ¹ß»çÇÏ´Â È­¿°Åº
     tiFlame      : ³×ÅäÀÇ ÇÊ»ì±âÀÎ ÆĶõ ºÒ²É
     tiEnergyBall : Àû º¸½º°¡ ¹ß»çÇÏ´Â ÀÛÀº ¿¡³ÊÁö ±¸
     tiNeTo1      : ³×ÅäÀÇ ±×¸² ÇÁ·¹ÀÓ 1
     tiNeTo2      :    "     "    "    2
     tiDemon      : Àû º¸½ºÀÇ ±×¸² ( °Å´ë ij¸¯ÅÍÀÓ.. )

  Âü°í·Î tiDemon ÀÇ ±×¸²Àº ÇÊÀÚÀÇ °ÔÀÓÀÎ '´ëº¯ ÆÄÀÌÅÍ'¿¡¼­´Â ¿ë·® ¹®Á¦·Î
 »ó¹Ý½Å¸¸ ³ª¿Ô´ø ºÒ¿ìÇÑ Ä³¸¯ÅÍÀÌÁö¸¸ À̹ø¿¡´Â º» ¸ð½ÀÀ» µå·¯³½´Ù. ±â´ëÇÏ
 ¼Åµµ ÁÁÀ» °ÍÀÌ´Ù.. ÈÄÈÄ..


 1) TCharacter Á¤ÀÇ

|  type
|
|     PCharacter = ^TCharacter;
|     TCharacter = object
|
|        constructor create(number : TTileInfo; x, y, HP : integer);
|        destructor  destroy;
|        procedure   DisplaySelf; virtual;
|        function    DoAction : boolean; virtual;
|
|     private
|        m_number   : TTileInfo;
|        m_x_size   : integer;
|        m_y_size   : integer;
|        m_x, m_y   : integer;
|        m_sx, m_sy : real;
|        m_HP       : integer;
|        m_Tile     : TRect;
|      procedure setmX (x : integer);
|        procedure setmY (y : integer);
|        procedure setmSX(x : real);
|        procedure setmSY(y : real);
|
|     public
|        property  mNumber : TTileInfo  read m_number write m_number;
|        property  mXSize  : integer    read m_x_size write m_x_size;
|        property  mYSize  : integer    read m_y_size write m_y_size;
|        property  mX      : integer    read m_x      write setmX;
|        property  mY      : integer    read m_ywrite setmY;
|        property  mSX     : real       read m_sx     write setmSX;
|        property  mSY     : real       read m_sy     write setmSY;
|        property  mHP     : integer    read m_HP     write m_HP;
|        property  mTile   : TRect      read m_Tile   write m_Tile;
|
|     end;

  ÀÌ°ÍÀÌ ¹Ù·Î ¸ðµç ij¸¯ÅÍÀÇ ÃÖ°í ¼±Á¶( superclass ) ÀÎ TCharacter ÀÌ´Ù.
  °¢°¢ÀÇ ¼³¸íÀº ´ÙÀ½°ú °°´Ù.

     constructor create(number : TTileInfo; x, y, HP : integer);
       : »ý¼ºÀÚÀÌ´Ù. ŸÀÏ Á¤º¸¿Í»ý¼º½Ã (x,y) ¿Í ü·ÂÀ» Àμö·Î ¹Þ´Â´Ù.

     destructor  destroy;
       : ¼Ò¸êÀÚÀÌ´Ù. ¿©±â¼­´Â Äڵ尡 ÇÊ¿ä ¾ø°í ´Ù¸¸ °¡»ó ¸Þ¼Òµå Å×À̺íÀ»
         Á¦°ÅÇÏ´Â Á¤µµÀÇ ±â´É¸¸À» ÇÒ °ÍÀÌ´Ù.

     procedure   DisplaySelf; virtual;
       : ÀÚ½ÅÀ» È­¸é¿¡ Ç¥½ÃÇÑ´Ù. virtual ·Î ¼±¾ðµÇ¾î¼­ Èļտ¡¼­ ÀçÁ¤ÀÇ°¡
         °¡´ÉÇÏ°Ô µÇ¾î ÀÖ´Ù.

     function    DoAction : boolean; virtual;
       : ±× ij¸¯ÅÍ°¡ ÇÏ´Â ¸ðµç ÇൿÀ» ÇÏ°Ô ÇÑ´Ù.  FALSE °¡ ¸®ÅÏµÈ´Ù¸é ±×
         Ä³¸¯ÅÍ°¡ ¼Ò¸êµÇ¾î¾ß ÇÏ´Â Á¶°ÇÀÓÀ» ¾Ë·ÁÁØ´Ù.  ¿ª½Ã virtual ·Î ¼±
         ¾ðµÇ¾ú±â ¶§¹®¿¡ Èļտ¡¼­ ÀçÁ¤ÀÇ°¡ °¡´ÉÇÒ »Ó¸¸ ¾Æ´Ï¶ó  ¹«Á¶°Ç Àç
         Á¤ÀÇ µÇ¾î¾ß ÇÏ´Â ÇÔ¼öÀÌ´Ù.

  ±×·³ À̹ø¿¡´Â public ¼±¾ð ºÎºÐÀÌ´Ù.  ¿©±â´Â ¸ðµÎ private ºÎºÐÀÇ Çʵåµé
 À» Á¦¾îÇϱâ À§ÇÑ property µé·Î ±¸¼ºµÇ¾î ÀÖ´Ù.

     property  mNumber : TTileInfo  read m_number write m_number;
       : m_number ¸¦ ¹Ù·Î ÀÐ°í ¾²´Â property ÀÌ´Ù. m_number ´Â ÀÚ½ÅÀÇ Å¸
         ÀÏ Á¤º¸¸¦ ¾Ë ¼ö ÀÖ´Â TTileInfo Çü º¯¼öÀÌ´Ù.

     property  mXSize  : integer    read m_x_size write m_x_size;
     property  mYSize  : integer    read m_y_size write m_y_size;
       : ÀÚ½ÅÀÇ X ¿Í Y ±æÀ̸¦ integer ÇüÀ¸·Î ÁöÁ¤ÇÏ´Â º¯¼öÀÎ m_x_size ¿Í
         m_y_size ¸¦ ÀÐ°í ¾²°Ô ÇÏ´Â property ÀÌ´Ù.

     property  mX      : integer    read m_x      write setmX;
     property  mY      : integer    read m_y      write setmY;
       : ÇöÀçÀÇ È­¸é »óÀÇ ÀÚ½ÅÀÇ ÁÂÇ¥ÀÎ (m_x,m_y) ¿¡ ´ëÇÑ Á¤º¸¸¦ ÀÐ°í ¾²
         ´Â property ·Î,  ÀÐÀ» ¶§´Â ¹Ù·Î º¯¼ö¿¡ Á¢±ÙÇÏÁö¸¸ ¾µ ¶§´Â setmX
         ¿Í setmY¸¦½ÇÇà½ÃŲ´Ù.  ±× ÇÔ¼öµéÀº m_x ¿Í m_y °¡ ºÒ°¡´ÉÇÑ °÷¿¡
         ÁöÁ¤µÇÁö ¾Ê°Ô ÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù.

     property  mSX     : real       read m_sx     write setmSX;
     property  mSY     : real       read m_sy     write setmSY;
       : ÇöÀçÀÇ È­¸é»óÀÇ ÀÚ½ÅÀÇ ÁÂÇ¥¿¡ ´ëÇÑ real ÇüÀÇ Á¤È®ÇÑ Á¤º¸¸¦ °¡Áö
         °í ÀÖ´Â µÎ °³ÀÇ º¯¼öÀÎ m_sx ¿Í m_sy ¸¦ ÀÐ°í ±â·ÏÇÑ´Ù. ³ªÁß¿¡ ÈÄ
         ¼Õ¿¡¼­ Á¤ÀǵǴ ¼Óµµ¿Í °¡¼Óµµ¿¡ ´ëÇÑ °ÍÀ» °í·ÁÇϱâ À§ÇØ ¸¸µç °Í
         À¸·Î½á, ¿©±â¼­ real °ªÀ¸·Î ÁöÁ¤ÇÏ´õ¶óµµ Ç×»ó m_x ¿Í m_y ¿¡ Á¤¼ö
         ÇüÀ¸·Î ¿µÇâÀ» ¹ÌÄ£´Ù. setmSX ¿Í setmSY ´Â À§ÀÇ ¿¹¿Í °°´Ù.

     property  mHP     : integer    read m_HP     write m_HP;
       : ÇöÀç ÀÚ½ÅÀÇ  Hit Point ( <- ´Ù¿ëµµ·Î »ç¿ë °¡´É ) ¸¦ °¡Áö°í ÀÖ´Â
         Á¤¼öÇü º¯¼öÀÎ m_HP ¿¡ ´ëÇØ ÀÐ°í ¾²´Â property ÀÌ´Ù.

     property  mTile   : TRect      read m_Tile   write m_Tile;
       : ÀÚ½ÅÀÇ ¿øÇü À̹ÌÁö°¡ ÀÖ´Â  image[1] »ó¿¡¼­ÀÇ TRect Çü ÁÂÇ¥¸¦ ±â
         ¾ïÇÏ´Â m_Tile À» ÀÐ°í ¾²´Â º¯¼öÀÌ´Ù.


 2) ±×·³ ´ÙÀ½¿¡´Â TCharacter ·ÎºÎÅÍ ÆÄ»ýµÈ TObjects ¿¡ ´ëÇؼ­ ³íÇغ¸ÀÚ.
  ¿ª½Ã type ºÎºÐ¿¡ °è¼ÓÇؼ­ ¾²¸é µÈ´Ù.

|     PObjects = ^TObjects;
|     TObjects = object(TCharacter)
|
|        constructor create(number : TTileInfo; x, y, HP : integer;
|                           vx, vy, ax, ay : real);
|        destructor  destroy;
|        function    DoAction : boolean;  virtual;
|
|     private
|        m_vx, m_vy : real;
|        m_ax, m_ay : real;
|
|     public
|        property  mVX : real  read m_vx  write m_vx;
|        property  mVY : real  read m_vy  write m_vy;
|        property  mAX : real  read m_ax  write m_ax;
|        property  mAY : real  read m_ay  write m_ay;
|
|     end;

  TObjects = object(TCharacter) ¶ó´Â ºÎºÐ¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ TObjects °´Ã¼
 ´Â TCharacter ÀÇ ¸ðµç °ÍÀ» »ó¼Ó ¹Þ´Â´Ù.  ÀÌ °´Ã¼ÀÇ ¾²ÀÓÀº ÁÖ·Î ºÒ¶ËÀ̳ª
 ¿¡³ÊÁö º¼ °°ÀÌ Ã¢Á¶ÀÚ¿¡°Ô¼­ ¶³¾îÁ® ³ª°¡  ÀÚ¿¬ÀÇ ¿îµ¿ ¹ýÄ¢¿¡ ÀÇÇØ ÇൿÀÌ
 °áÁ¤µÇ´Â °´Ã¼µé¿¡°Ô Àû¿ëµÈ´Ù.

     constructor create(number : TTileInfo; x, y, HP : integer;
                   vx, vy, ax, ay : real);
       : »ý¼ºÀÚ¿¡¼­´Â À§ÀÇ TCharacter ¿Í´Â ´Þ¸®  Ãʱ⠼ӵµ¿Í Ãʱ⠰¡¼Óµµ
         ¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Â º¯¼ö°¡ µµÀԵǾú´Ù.  ³ª¸ÓÁö Ư¼ºÀº ¸ðµÎ ¼±Á¶¿Í
         °°Àº °³³äÀ¸·Î »ç¿ëµÈ´Ù.

  DoAction Àº ¿ª½Ã ÀçÁ¤ÀÇ µÇ¾ú°í ( DoAction Àº Èļտ¡¼­ ¹«Á¶°Ç ÀçÁ¤ÀÇ ÇØ
 ¾ß ÇÏ´Â ÇÔ¼ö.. ),  DisplaySelf ¶ó´Â °ÍÀº ¼±Á¶ÀÇ °ÍÀ» ±×´ë·Î »ç¿ëÇϱâ À§
 Çؼ­ ¿©±â¼­´Â ÀçÁ¤ÀÇ µÇÁö ¾Ê¾Ò´Ù.

     property  mVX : real  read m_vx  write m_vx;
     property  mVY : real  read m_vy  write m_vy;
     property  mAX : real  read m_ax  write m_ax;
     property  mAY : real  read m_ay  write m_ay;
       : À̰͵éÀº ¸ðµÎ  ¼Óµµ (m_vx, m_vy) ¿Í °¡¼Óµµ (m_ax, m_ay) ¸¦ À§ÇÑ
         property ·Î¼­ ±×´ë·Î º¯¼ö¸¦ ÀÐ°í ¾²°Ô µÈ´Ù.


 3) À̹ø¿¡´Â ¶Ç TObjects ¿¡¼­ ÆÄ»ýµÈ µÎ °³ÀÇ Å¬·¡½º¸¦ º¸ÀÚ.
 TEnemy ´Â Àû º¸½º¸¦ Á¤ÀÇÇÑ °ÍÀÌ°í EFriend ´Â ¾Æ±º ( ³×Åä ) À» Á¤ÀÇÇÑ °Í
 ÀÌ´Ù.

|     PEnemy = ^TEnemy;
|     TEnemy = object(TObjects)
|
|        constructor create(number : TTileInfo; x, y, HP : integer);
|        destructor  destroy;
|        function    DoAction : boolean; virtual;
|
|     end;
|
|     PFriend = ^TFriend;
|     TFriend = object(TObjects)
|
|        constructor create(number : TTileInfo; x, y, HP : integer);
|        destructor  destroy;
|        procedure   DisplaySelf; virtual;
|        function    DoAction : boolean; virtual;
|
|     private
|        FShapeCount : integer;
|        FShapeDelay : integer;
|
|     end;

  TEnemy ´Â TObjects ¿¡¼­ »ó¼ÓÀ» ¹ÞÁö¸¸ ´Ù¸¥ Á¡À̶ó°í´Â DoAction À» ÀûÀÇ
 ÆÐÅÏ¿¡ ¸Â°Ô ÀçÁ¤ÀÇ ÇÑ °Í»ÓÀÌ´Ù.

  TFriend ¿ª½Ã Àڽſ¡ ¸Â°Ô ( Å°º¸µå ÀԷµî. ) DoAction À» ÀçÁ¤ÀÇ Çß°í ÀÚ
 ½ÅÀÇ ³¯°³¿¡ ´ëÇÑ 2 ÇÁ·¹ÀÓ ¶§¹®¿¡ Ãâ·Â ·çƾÀÎ DisplaySelf µµ ÀçÁ¤ÀÇ Çß´Ù.
 FShapeCount ¿Í FShapeDelay °¡ °¢°¢ ÇÁ·¹ÀÓ¿¡ ´ëÇÑ Ä«¿îÆ®¿Í µô·¹ÀÌÀÌ´Ù.
 ÀÌ º¯¼ö´Â ĸ½¶È­¿¡ ´ëÇÑ º¸¾ÈÀÌ ÇÊ¿äÇÏÁö ¾Ê´Â ´Ü¼ø º¯¼öÀ̹ǷΠproperty¸¦
 »ç¿ëÇÏÁö ¾Ê°í ¹Ù·Î Á¢±ÙÇϵµ·Ï ¸¸µé¾ú´Ù.

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

 (3) SubUnit5.Pas ¿¡ ¾²ÀÏ º¯¼ö¿Í ÇÔ¼ö ¼±¾ð

|  const
|     MAX_CHARACTER = 50;
|  var
|     Objects : array[1..MAX_CHARACTER] of PCharacter;

  ¿©±â Objects ¶ó´Â ¹è¿­ º¯¼ö¿¡ ÀÌÁ¦ ¸ðµç °ÔÀÓÀÇ °´Ã¼°¡ ¼±¾ðµÇ°Ô µÈ´Ù.
 °´Ã¼ÀÇ ÃÖ°í °³¼ö´Â º¸´Â ¹Ù¿Í °°ÀÌ 50 °³À̸ç PCharacter ·Î ¼±¾ðµÇ¾ú±â ¶§
 ¹®¿¡ TCharacter ¿Í ±× ÈļÕÀ̶ó¸é ¾î¶² ÇüÀ¸·Îµµ Á¤ÀÇ°¡ °¡´ÉÇÏ´Ù.

|  implementation
|
|  uses
|     MainUnt4;

  ¾Õ¿¡¼­ ¸»ÇÑ Circular Reference ¸¦ ¸·À¸¸é¼­ MainUnt4.Pas ¿Í °áÇÕÇϱâ À§
 ÇÑ ÄÚµåÀÌ´Ù.

|  function GetFreeObjects(var number : integer) : boolean;
|  var
|     i : integer;
|  begin
|     for i := 1 to MAX_CHARACTER do begin
|         if objects[i] = nil then begin
|            number := i;
|            getFreeObjects := TRUE;
|            exit;
|         end;
|     end;
|     getFreeObjects := FALSE;
|  end;

  ÀÌ ÇÔ¼ö´Â Ŭ·¡½º ¼±¾ð¿¡ ´ëÇÑ ºÎ·Ï ÇÔ¼öÂë µÇ´Â °ÍÀ¸·Î ÇöÀçÀÇ Objects º¯
 ¼ö¿¡¼­ ºñ¾îÀÖ´Â ( Áï, °´Ã¼¸¦ ÇÒ´ç ¹ÞÀ» ¼ö ÀÖ´Â ) °÷À» ã¾Æ¼­  ±× ¹øÈ£¸¦
 reference ÀμöÀÎ number ¿¡ µ¹·ÁÁØ´Ù.  ¸¸¾à 50°³ÀÇ °´Ã¼°¡ ¸ðµÎ »ý¼º µÇ¾ú
 À¸¸é FALSE ¸¦ ¸®ÅÏÇÑ´Ù.

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

 (4) TCharacter ÀÇ ¼Ò½º

|  constructor TCharacter.create(number : TTileInfo; x, y, HP : integer);
|  begin
|     mNumber  := number;
|     m_Tile   := TileInfo[number];
|     m_x_size := TileInfo[number].Right-TileInfo[number].Left;
|     m_y_size := TileInfo[number].Bottom-TileInfo[number].Top;
|     mX       := x;
|     mY       := y;
|     mHP      := HP;
|     m_sx     := x;
|     m_sy     := y;
|  end;

  »ý¼ºÀÚ´Â Áö±Ý º¸µíÀÌ ´Ü¼øÇÑ private º¯¼öÀÇ ¼¼Æÿ¡ ±×Ä£´Ù.  m_x_size ¿Í
 m_y_size ´Â ŸÀÏ Á¤º¸ÀÇ TRect ÇüÀ¸·ÎºÎÅÍ ¾ò¾î³¿À» ¾Ë ¼ö ÀÖ´Ù.

|  destructor  TCharacter.destroy;
|  begin
|  end;

  ¼Ò¸êÀÚ´Â ¾Æ¹«·± Äڵ嵵 ¾øÁö¸¸ ¼Ò¸êÀÚ¶ó´Â ÀÚü¸¸À¸·Î °¡»ó ¸Þ¼Òµå Å×À̺í
 À» ÇØÁ¦Çϱ⠶§¹®¿¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù.

|  procedure   TCharacter.setmX(x : integer);
|  begin
|     if (x >= 0) and (x + mXSize < MAX_X_LINE) then begin
|        m_x  := x;
|        m_sx := x;
|     end;
|  end;
|
|  procedure   TCharacter.setmY(y : integer);
|  begin
|     if (y >= 0) and (y + mYSize < MAX_Y_LINE) then begin
|        m_y  := y;
|        m_sy := y;
|     end;
|  end;

  x ¿Í y ÀÇ ¹üÀ§¸¦ È­¸éÀÇ ¹üÀ§·Î Á¦¾ÈÇÑ´Ù. º¸´Â ¹Ù¿Í °°ÀÌ x ¿Í y °¡ ¼¼ÆÃ
 µÉ ¶§ real ÇüÀÎ m_sx ¿Í m_sy µµ °°ÀÌ ¼¼Æõȴٴ Á¡¸¸ ÁÖÀÇÇÏÀÚ.

|  procedure   TCharacter.setmSX(x : real);
|  begin
|     if x < 0 then x := 0;
|     if x >= MAX_X_LINE - mXSize then x := MAX_X_LINE - mXSize - 1;
|     m_sx := x;
|     m_x  := Trunc(x+0.5);
|  end;
|
|  procedure   TCharacter.setmSY(y : real);
|  begin
|     if y < 0 then y := 0;
|     if y >= MAX_Y_LINE - mYSize then y := MAX_Y_LINE - mYSize - 1;
|     m_sy := y;
|     m_y  := Trunc(y+0.5);
|  end;

  ÀÌ°ÍÀº real ÇüÀÎ m_sx ¿Í m_sy ¿¡ ´ëÇÑ ¼¼Æà ÇÔ¼ö·Î¼­  ¿ª½Ã Á¤¼öÇüÀÎ m_x
 ¿Í m_y ¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. real ÇüÀ» Á¤¼öÇüÀ¸·Î ¹Ù²Ü ¶§ Round (¹Ý¿Ã¸²) ÀÌ
 ¾Æ´Ñ Trunc (ÀÚ¸§) À» »ç¿ëÇÑ ÀÌÀ¯´Â µ¨ÆÄÀÌ°¡ ¦¼ö ¹Ý¿Ã¸²¿¡ ¹ö±×°¡ ÀÖ´Ù°í
 ¾Ë·ÁÁ³±â ¶§¹®¿¡ ( ¿¹> Round(12.5) -> 12 ·Î ÆÇ´Ü )  Trunc(r+0.5) ·Î ´ë½Å
 ÇÑ °ÍÀÌ´Ù. ( ´Ü, µ¨ÆÄÀÌ 2 ÀÇ ¹ö±×À̹ǷΠµ¨ÆÄÀÌ 3 ¿¡¼­´Â °íÃÄÁ³À» °¡´É¼º
 µµ.. )

|  procedure   TCharacter.DisplaySelf;
|  begin
|     with Basic do repeat
|     until MakeItSo(BackBuffer.BltFast(mX,mY,Image[1],mTile,
|                    DDBLTFAST_SRCCOLORKEY));
|  end;

  ÀÚ½ÅÀÇ À̹ÌÁö¸¦ ¹é ¹öÆÛ¿¡ Âï´Â ÇÔ¼öÀÌ´Ù. º°·Î ƯÀÌÇÒ °Ç ¾ø´Ù.

|  function    TCharacter.DoAction;
|  begin
|     DoAction := TRUE;
|  end;

  ¾ÆÁ÷Àº Á¤ÀÇ µÇÁö ¾Ê°í Èļտ¡¼­ Á¤ÀÇ µÉ ÇÔ¼ö·Î,  ÇöÀç´Â Ç×»óTRUE ¸¸ ¸®
 ÅÏÇϵµ·Ï µÇ¾îÀÖ´Ù.

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

 (5) TObjects ÀÇ ¼Ò½º

|  constructor TObjects.create(number : TTileInfo; x, y, HP : integer;
|                              vx, vy, ax, ay : real);
|  begin
|     inherited create(number,x,y,HP);
|     mVX := vx;  mVY := vy;
|     mAX := ax;  mAY := ay;
|  end;

  »ý¼ºÀÚ¿¡¼­´Â ¼±Á¶¿¡¼­ ¼±¾ðµÈ º¯¼ö¿Í ÀÌ °´Ã¼¿¡¼­ ¾²ÀÏ ¼Óµµ, °¡¼Óµµ¿¡ ´ë
 ÇÑ Á¤º¸¸¦ ¹Þ´Â´Ù.  inherited ·Î ÀÌÀü ¼±Á¶ÀÇ »ý¼ºÀÚ¸¦±×´ë·Î »ç¿ëÇÏ°í ³ª
 ¸ÓÁö´Â Á÷Á¢ º¯¼ö¿¡ ´ëÀÔÇÑ´Ù.

|  destructor  TObjects.destroy;
|  begin
|  end;

   ¿ª½Ã TCharacter ¿Í °°´Ù.

|  function    TObjects.DoAction;
|  begin
|     DoAction := TRUE;
|
|     if ((mX + mVX) < 0) or ((mX + mVX) >= MAX_X_LINE-mXSize) or
|       ((mY + mVY) < 0) or ((mY + mVY) >= MAX_Y_LINE-mYSize) then begin
|        DoAction := FALSE;
|     end else begin
|        mSX := mSX  + mVX;
|        mSY := mSY  + mVY;
|        mVX := mVX + mAX;
|        mVY := mVY + mAY;
|     end;
|  end;

   TCharacter ´Â ÁÖ·Î ºÒ¶Ë°°Àº °ÍÀ» ó¸®ÇϹǷΠȭ¸é ¹ÛÀ¸·Î »ç¶óÁö°Ô µÇ¸é
  °´Ã¼°¡ ¼Ò¸êµÇ´Â Á¶°ÇÀÌ µÈ´Ù. ±×¸®°í °´Ã¼°¡ À¯È¿ÇÏ´Ù¸é À§Ä¡¿¡ ¼Óµµ¸¦ ´õ
  ÇÏ°í, ¼Óµµ¿¡´Â ÇöÀçÀÇ °¡¼Óµµ¸¦ ´õÇÑ´Ù.

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (6) - °ÔÀÓÀ» À§ÇÑ ±âº» Ŭ·¡½º ±¸¼º(2)
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 À̹øÀÇ ÀåÀº ¾Õ¿¡¼­ ¸ø´ÙÇÑ ºÎºÐÀÇ ¿¬¼ÓÀ¸·Î °ÔÁ¦ÇÏ°Ú´Ù.  ÇÏÀÌÅÚ¿¡¼­ ÇÑ °Ô
½Ã¹°ÀÇ ¶óÀÎ ÇÑ°è ¶§¹®¿¡ ÀÌ·¸°Ô µÎ ºÎºÐÀ¸·Î ³ª´« °ÍÀÌ´Ù.

 ±×·³ °è¼Ó ¼³¸íÀ» ÇÏ°Ú´Ù.

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

 (6) TEnemy ÀÇ ¼Ò½º

|  constructor TEnemy.create(number : TTileInfo; x, y, HP : integer);
|  begin
|     inherited create(number,x,y,HP,2,2,0,0);
|  end;

  »ý¼ºÀÚ´Â TObjects ÀÇ °ÍÀ» ±×´ë·Î »ç¿ëÇÏÁö¸¸ ¼Óµµ´Â 2·Î °¡¼Óµµ´Â 0 À¸·Î
 °íÁ¤µÇ¾î ÀÖ´Ù.  ¿©±â¼­ ¼Óµµ´Â °´Ã¼°¡ Çѹø¿¡ ¿òÁ÷ÀÌ´Â °Å¸®¸¦ ³ªÅ¸³»¸ç °¡
 ¼Óµµ´Â ¾ÆÁ÷ Á¤ÀÇ µÇÁö ¾Ê¾Ò´Ù.  ( °¡¼Óµµ´Â ¿ÜºÎÀÇ Ãæ°ÝÀ̳ª ¹Ù¶÷µî¿¡ ÀÇÇÑ
 º¯È­ ¿ä¼Ò °°Àº °É·Î ¾²¸é µÉ°ÍÀÌ´Ù. È®ÀåÀº ¿©·¯ºÐ¿¡°Ô ¸Ã±ä´Ù. )

|  destructor  TEnemy.destroy;
|  begin
|  end;

  ¼Ò¸êÀÚÀÌ´Ù..

|  function    TEnemy.DoAction;
|  var
|     i : integer;
|  begin
|     DoAction := TRUE;
|
|     mX := mX + (random(3)-1);
|     mY := mY + (random(3)-1);
|
|     if random(10) = 0 then begin
|        if GetFreeObjects(i) then begin
|           Objects[i] := new(PObjects,Create(tiEnergyBall,mX,mY+100,10,
|                                             -10,random(5)-3,0,0));
|        end;
|     end;
|  end;

  TEnemy Çü °´Ã¼¿¡ ´ëÇÑ Çൿ ÇÔ¼öÀÌ´Ù.  ¿ª½Ã FALSE °¡ µ¹¾Æ¿À¸é °´Ã¼ÀÇ ¼Ò
 ¸ê Á¶°ÇÀ» ¸¸Á·ÇßÀ½À» ¾Ë¸®°Ô µÈ´Ù.  ( ÇöÀç´Â ¼Ò¸ê Á¶°ÇÀÌ ¾øÁö¸¸ ³ªÁß¿¡´Â
 HP °¡ 0 º¸´Ù ÀÛÀ¸¸é ¼Ò¸ê µÉ °ÍÀÌ´Ù.

  Çൿ ÆÐÅÏÀº ´ÙÀ½°ú °°´Ù.

    1) ·£´ýÀ¸·Î (-1..1, -1..1) ¸¸Å­ ¿òÁ÷ÀδÙ.
    2) 10¹ø¿¡ Çѹø ²Ã·Î tiEnegyBall À» ¹ß»çÇÑ´Ù.

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

 (7) TFriend ÀÇ ¼Ò½º

|  constructor TFriend.create(number : TTileInfo; x, y, HP : integer);
|  begin
|     inheritedcreate(number,x,y,HP,2,2,0,0);
|     FShapeCount := 0;
|     FShapeDelay := 0;
|  end;

  TEnemy ¶§¿Í °°´Ù.  ±×¸®°í private ³»ºÎ º¯¼öÀÎ FShapeCount, FShapeDelay
 ¸¦ 0 À¸·Î ÃʱâÈ­ÇÑ´Ù.  ( ¾Æ¸¶ ½ÇÁ¦·Ð ÃʱâÈ­ ¾ÈÇصµ 0 À¸·Î µÉ °ÍÀÌ´Ù. ÇÏ
 Áö¸¸ ÀÌ·¸°Ô Àû¾îÁÖ´Â °ÍÀÌ ÇÁ·Î±×·¥ »óÀ¸·Î ´õ ¸íÈ®ÇÏ´Ù. )

|  destructor  TFriend.destroy;
|  begin
|  end;

  ¼Ò¸êÀÚ... ±× ÀÌ»óµµ ÀÌÇϵµ ¾Æ´Ñ ¼Ò¸êÀÚÀÏ»Ó... ÀÌ°ÍÀº ¼Ò¸êÀÚ¸¸ÀÌ °¡Áö´Â
 ¼÷¸íÀ̶ó°í ÇÒ¼ö ÀÖÀ»±î... !

|  procedure   TFriend.DisplaySelf;
|  begin
|
|  inc(FShapeDelay);
|     if FShapeDelay = 5 then begin
|        FShapeCount := FShapeCount xor 1;
|        FShapeDelay := 0;
|     end;
|
|     with Basic do repeat
|     until MakeItSo(BackBuffer.BltFast(mX,mY,Image[1],
|                    TileInfo[TTileInfo(ord(mNumber)+FShapeCount)],
|                    DDBLTFAST_SRCCOLORKEY));
|  end;

  TFriend ÇüÀÇ °´Ã¼¸¦ Ãâ·ÂÇÏ´Â ÇÔ¼öÀÌ´Ù.  ¿ª½Ã ÀçÁ¤ÀÇ µÇ¾ú°í Àǹ̸¦ ¾Ë¾Æ
 º¸¸é ´ÙÀ½°ú °°´Ù.

  µô·¹À̸¦ Çϳª¾¿ Áõ°¡½ÃÄѼ­ 5 °¡ µÇ¾úÀ»¶§ Ãâ·ÂµÉ À̹ÌÁö¸¦Åä±ÛÇÑ´Ù.  Ãâ
 ·ÂµÉ À̹ÌÁö´Â tiNeTo1 °ú tiNeTo2 °¡ µÉ °ÍÀÌ´Ù. ( ±×·¡¼­ 5 ÇÁ·¹ÀÓ¿¡ Çѹø
 ¾¿ ³¯°³¸¦ ÆÞ·°ÀÏ °ÍÀÌ´Ù.

|  function    TFriend.DoAction;
|  var
|     i : integer;
|  begin
|     DoAction := TRUE;
|
|     if GetAsyncKeyState(VK_LEFT) <> 0 then mSX := mSX - mVX;
|     if GetAsyncKeyState(VK_RIGHT)<> 0 then mSX := mSX + mVX;
|     if GetAsyncKeyState(VK_UP)   <> 0 then mSY := mSY - mVY;
|     if GetAsyncKeyState(VK_DOWN) <> 0 then mSY := mSY + mVY;
|
|     if GetAsyncKeyState(VK_CONTROL) <> 0 then begin
|        if GetFreeObjects(i) then begin
|           Objects[i] := new(PObjects,Create(tiFireBall,mX+15,mY+25,10,
|                                                            16,0,0,0));
|        end;
|     end;
|
|     if GetAsyncKeyState(VK_MENU) <> 0 then begin
|        if GetFreeObjects(i) then begin
|           Objects[i] := new(PObjects,Create(tiFlame,mX,mY,10,16,0,0,0));
|        end;
|     end;
|  end;

  ÀÌ°ÍÀº ¸ðµç °´Ã¼ÀÇ ¸Þ¼Òµå Áß °¡Àå Áß¿äÇÑ ÇÔ¼öÀÌ´Ù. ¿ì¸®°¡ Á÷Á¢ Á¶Á¾ °¡
 ´ÉÇÑ ³×ÅäÀÇ Çൿ ÇÔ¼öÀ̱⠶§¹®ÀÌ´Ù.

  °¡Àå À§¿¡ ÀÖ´Â 4 °³ÀÇ Å° ÇÔ¼ö´Â È­»ìÇ¥ Å°¸¦ ´­·¶À» ¶§  ¼Óµµ¸¸Å­ ³×Å並
 À̵¿½ÃÅ°´Â ¿ªÇÒÀÌ´Ù.

  VK_CONTROL Àº Ctrl À» ´­·¶À» ¶§ ºÒ¶ËÀÌ ¹ß»çµÇ°Ô ÇÏ´Â ·çƾÀ¸·Î,  »õ·Î¿î
 °´Ã¼¸¦ ¾ò¾î¼­ ±×°ÍÀ» TObject ÇüÀ¸·Î ¼±¾ðÇÏ¿© ÃʱâÈ­ ÇÑ´Ù.

  VK_MENU ´Â Alt Å°¸¦ ´­·¶À» ¶§ Ǫ¸¥»ö ºÒ²ÉÀÌ ³ª°¡°Ô ÇÏ´Â ·çƾÀ¸·Î, À§¿¡
 ¼³¸íÇÑ °Í°ú ´Ù¸¦¹Ù ¾ø´Â °ÍÀÌ´Ù.

  ¿ª½Ã ¿©±âµµ ¼Ò¸ê Á¶°ÇÀÌ ¾øÁö¸¸  ³ªÁß¿¡ HP °¡ 0 º¸´Ù ÀÛÀ» ¶§´Â ¼Ò¸êÇϵµ
 ·Ï ÇؾßÇÑ´Ù.

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

 (8) SubUnit5.Pas ÀÇ ÃʱâÈ­ ÄÚµå

|  var
|     i : integer;
|  begin
|     for i := 1 to MAX_CHARACTER do begin
|        Objects[i] := nil;
|     end;
|  end.

  ÀÌ°ÍÀº À¯´ÖÀ» ÃʱâÈ­ÇÏ´Â ÄÚµå·Î  ¸ðµç Objects ÀÇ ¹è¿­ ÀÎÀÚ¸¦ nil ·Î ÃÊ
 ±âÈ­ ÇÑ´Ù.

  È¤½Ã³ª ÆĽºÄ®¿¡ Àͼ÷ÇÏÁö ¾ÊÀº ºÐµéÀ» À§Çؼ­ ¼³¸íÇÏÀÚ¸é... ¿ø·¡..

|  .....
|  end.

  ¶ó°í µÇ´Â ºÎºÐÀÌ ¸¶Áö¸·¿¡ ÀÖ´Ù. ±×·±µ¥ ±× ºÎºÐÀÇ ¾Õ¿¡ begin À» ½áº¸ÀÚ.

|  begin
|  end.

  ÀÌ·¸°Ô ÇÏ¿© ±× begin °ú end. »çÀÌ¿¡ ¾î¶² Äڵ带 ³ÖÀ¸¸é ÇÁ·Î±×·¥ ½ÇÇà½Ã
 ±× ¾ÈÀÇ ³»¿ëÀÌ ½ÇÇàµÇ°Ô µÇ¾î ÃʱâÈ­°¡ ÁøÇàµÈ´Ù.
  ´ëºÎºÐ ±× À¯´Ö¿¡ ÀÖ´Â º¯¼ö¸¦ ÃʱâÈ­ ÇÒ ¶§ »ç¿ëµÇ´Â °ÍÀÌ´Ù.

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

 (9) MainUnt5.Pas ÀÇ ¼öÁ¤µÉ ÄÚµåµé

  TBasic = class(TForm) ÀÇ public ¿¡´Â »õ·Î¿î µÎ°³ÀÇ ¸Þ¼Òµå°¡ Ãß°¡µÈ´Ù.

|        procedure InitializeGame;
|        procedure FinalizeGame;

  ÀÌ ¸Þ¼ÒµåµéÀº °ÔÀÓÀÇ ÃʱâÈ­¿Í µÞ󸮸¦ ´ã´çÇØÁÖ´Â ºÎºÐÀ¸·Î ¿©±â¼­´Â °Ô
 ÀÓÀÇ Ãʱ⿡ »ý¼ºµÉ 2 °³ÀÇ °´Ã¼ ( ³×Åä¿Í µ¥¸ó ) À» ÀÚµ¿ »ý¼ºÇÏ°Ô µÇ°í ¸¶
 Áö¸·¿¡´Â ÇöÀç »ý¼ºµÈ °´Ã¼¸¦ ¸ðµÎ ¼Ò¸ê ½ÃÅ°´Â ¿ªÇÒÀ» ÇÑ´Ù.

  °¢°¢ È£ÃâµÇ´Â ºÎºÐÀº ´ÙÀ½°ú °°´Ù.

  InitializeGame Àº TBasic.FormShow ºÎºÐ¿¡¼­ Çø®ÇÎÀ» °¡´ÉÇÏ°Ô ÇÏ´Â ºÎºÐ
 ÀÇ ¹Ù·Î ¾Õ¿¡ ¿Â´Ù ÄÚµå »óÀ¸·Î µûÁ®º¸¸é ÀÌ·¸´Ù.

|     InitializeGame;     // ¿©±â¿¡ µé¾î°£´Ù.
|
|     FlippingEnabled := TRUE;
|  end;

  FinalizeGame Àº  TBasic.FormDestroy ºÎºÐ¿¡¼­  Çø®ÇÎÀ» ºÒ°¡´ÉÇÏ°Ô ÇÏ´Â
 ºÎºÐÀÇ ÄÚµå ´ÙÀ½¿¡ ¿Â´Ù.

|  begin
|     FlippingEnabled := FALSE;
|
|     FinalizeGame;       // ¿©±â¿¡ µé¾î°£´Ù.


  ±×·³ °¢°¢ÀÇ ¸Þ¼ÒµåÀÇ ¼Ò½º¸¦ º¸ÀÚ.

|  procedure TBasic.InitializeGame;
|  begin
|     Objects[1] := new(PFriend,Create(tiNeto1,100,200,100));
|     Objects[2] := new(PEnemy ,Create(tiDemon,300,100,100));
|  end;
|
|  procedure TBasic.FinalizeGame;
|  var
|     i : integer;
|  begin
|     for i := 1 to MAX_CHARACTER do begin
|        if assigned(Objects[i]) then begin
|           dispose(Objects[i],destroy);
|           Objects[i] := nil;
|        end;
|     end;
|  end;

  InitializeGame Àº ³×Å並 TFriend °´Ã¼·Î,  µ¥¸óÀ» TEnemy °´Ã¼·Î °¢°¢ ÃÊ
 ±âÈ­ ½ÃŲ´Ù.  Objects[] ÀÚü°¡ TCharacter É£«£Ã¼ÀÇ Æ÷ÀÎÅÍ·Î ¼³Á¤µÇ¾î ÀÖÀ¸
 ¹Ç·Î TCharacter ÀÇ ÈļÕÀÎ TFriend ¿Í TEnemy ´Â ¸ðµÎ Objects[] ¿¡¼­ ¼±¾ð
 ÀÌ °¡´ÉÇÏ´Ù.

  FinalizeGame Àº ¸ðµç Objects[] ¿¡ ´ëÇؼ­ °´Ã¼°¡ Á¸ÀçÇÒ¶§´Â °´Ã¼¸¦ ¼Ò¸ê
 ½ÃÅ°´Â ¿ªÇÒÀ» ÇÑ´Ù.


  ±×·³ À̹ø¿¡´Â MainUnt5.Pas ¿¡¼­ °¡Àå Áß¿äÇÑ DrawScreen ¸Þ¼Òµå¸¦ º¸ÀÚ.
 ÀÌÀüÀÇ ÄÚµå´Â ¹Ì·Ã¾øÀÌ Áö¿ö¹ö¸®°í ¾Æ·¡ÀÇ ¼Ò½º¸¦ ŸÀÌÇÎÇÑ´Ù.

|  procedure TBasic.DrawScreen;
|  var
|     i : integer;
|  begin
|     repeat
|     until MakeItSo(BackBuffer.BltFast(0,0,Image[2],Rect(0,0,640,480),
|                    DDBLTFAST_NOCOLORKEY));
|
|     for i := MAX_CHARACTER downto 1 do begin
|        if assigned(Objects[i]) then begin
|           if Objects[i]^.DoAction then begin
|              Objects[i]^.DisplaySelf;
|           end else begin
|              dispose(Objects[i],destroy);
|              Objects[i] := nil;
|         end
|        end;
|     end;
|  end;

  ¾Õ ºÎºÐ¿¡¼­ BltFast ·Î Image[2] ¸¦ ¹é ¹öÆÛ·Î Àü¼ÛÇÏ´Â Äڵ尡 ÀÖ´Ù.  ÀÌ
 °ÍÀº Image[2] ¿¡ µé¾îÀÖ´Â ¹è°æÀ» Àü¼ÛÇÏ´Â ºÎºÐÀÌ´Ù.  ¿©±â¼­ ÁÖ¸ñÇØ¾ß ÇÏ
 ´Â °ÍÀÌ ¹Ù·Î BltFast ÀÇ Àü¼Û ŸÀÔ Áß¿¡ ÇϳªÀÎ DDBLTFAST_NOCOLORKEY ÀÌ´Ù.
 ÀÌ°ÍÀº Åõ¸í»ö¿¡ ´ëÇØ ÀüÇô °í·ÁÇÏÁö É®¤¾°í ´ÜÁö À̹ÌÁö·Î½á ¼­·Î Àü¼ÛÇ϶ó´Â
 Àǹ̸¦ ´ã°íÀÖ´Ù. ±×·¡¼­ ¹è°æÀ» º¹»çÇÒ ¶§ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù.

  ±× ´ÙÀ½ÀÇ ÄÚµå´Â Á÷Á¢ ¼³¸íÇϵµ·Ï ÇÏ°Ú´Ù.

     for i := MAX_CHARACTER downto 1 do begin  // ¸ðµç Object[] ¿¡ ´ëÇØ
        if assigned(Objects[i]) then begin     // °´Ã¼°¡ À¯È¿Çϸé
           if Objects[i]^.DoAction then begin  // Çൿ ÇÔ¼ö¸¦ ½ÇÇàÇÏ°í
              Objects[i]^.DisplaySelf;         // ÇൿÀÌ À¯È¿Çϸé Ãâ·Â
           end else begin                      // °´Ã¼°¡ ¼Ò¸ê Á¶°ÇÀ̸é
              dispose(Objects[i],destroy);     // °´Ã¼¸¦ ¼Ò¸ê ½ÃÅ°°í
              Objects[i] := nil;               // Object[] º¯¼ö ÃʱâÈ­
           end
        end;
     end;

  DoAction °ú DisplaySelf ÀÇ °æ¿ì¿¡´Â °´Ã¼ Çü¿¡ µû¶ó¼­  °¢°¢ ÀçÁ¤ÀÇ µÇ¾ú
 À¸¹Ç·Î  TFriend ¿¡¼­ÀÇ DoAction °ú TEnemy ¿¡ ´ëÇÑ DoAction ÀÌ ´Ù¸£°Ô µÈ
 ´Ù. ÇÏÁö¸¸ ¿ì¸®´Â °´Ã¼ ÁöÇâÀ̶ó´Â ÀÕÁ¡ ¶§¹®¿¡ ¸í·É¸¸ ³»·ÁÁÖ¸é ÄÄÀÌ ³»ºÎ
 ÀûÀ¸·Î ´Ù ÇØ°áÇØ ¹ö¸°´Ù. ¾ó¸¶³ª Æí¸®ÇÑ °³³äÀΰ¡...

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

 (10) µåµð¾î ½ÇÇà

  ÀÚ.. Èûµé°Ô ÀÌÇØÇϼÌÀ»Áöµµ ¸ð¸¦ ÇÊÀÚÀÇ Äڵ带 ½ÇÇàÇÒ Â÷·ÊÀÌ´Ù.
 ½ÇÇà ½ÃÅ°¸é ÀÌÁ¦¿Í´Â ´Ù¸¥ °ÔÀÓ ºñ½º¹«¸®ÇÑ °ÍÀÌ ³ªÅ¸³¯ °ÍÀÌ´Ù. È­»ìÇ¥ Å°
 ·Î ³×Å並 À̵¿ ½ÃÅ°±âµµ ÇÏ°í Ctrl °ú Alt ·Î ºÒ¶Ëµµ ¹ß»çÇØ º¸ÀÚ.

  ÇÏÁö¸¸ ¾ÆÁ÷ ³×Åä¿Í µ¥¸ó¿¡ ´ëÇÑ ¼Ò¸ê Á¶°ÇÀÌ ¾ø´Âµ¥´Ù°¡ Ãæµ¹ üũµµ ¾ø±â
 ¶§¹®¿¡ °ÔÀÓÀ¸·Î¼± ¹«¸®°¡ ÀÖ´Ù. ±×·± ºÎ¼öÀûÀÎ °ÍÀº Â÷ÈÄ¿¡ ³Öµµ·Ï ÇÑ´Ù.

  ±×¸®°í ¼Óµµµµ ¹«Áö ´À¸°µ¥´Ù°¡  Æ®·çÄ÷¯¿¡ ´ëÇÑ ¿ä¼Ò´Â ÀüÇô »ç¿ëÇÏÁö ¾Ê
 ¾Ò´Ù. ( Æ®·çÄ÷¯¶ó¼­ ¼Óµµ°¡ ´À¸° °ÍÀº ¾î¿ ¼ö ¾ø´Â ÀÏ... ÀÚ½ÅÀÇ PC ¿¡°Ô
 ºÐ³ë¸¦ ¹ß»êÇÏÁö ¸»±â ¹Ù¶õ´Ù. )

 

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

                  ÇÏÀÌÅÚ °ÔÀÓ Á¦ÀÛ µ¿È£È¸ ( GO GMA )

------------------------------------------------------------------------
### DIRECT X Æ®·çÄ÷¯ °ÔÀÓ (7) - Á÷Á¢ ºñµð¿À ¸Þ¸ð¸®¿¡ Âï±â
------------------------------------------------------------------------
                                    ÀÛ¼ºÀÚ : ¾È¿µ±â ( HiTEL ID : SMgal )


 µåµð¾î À̹ø ÀåºÎÅÍ Æ®·çÄ÷¯¿¡ ´ëÇÑ DX °­Á°¡ ½ÃÀ۵ȴÙ. µµ½º¿¡¼­ VESA Æ®
·çÄ÷¯¸¦ Á¦¾îÇÏ´Â °Í°ú °°Àº °³³äÀ¸·Î Á÷Á¢ ºñµð¿À ¸Þ¸ð¸®¿¡ ´ëÇÑ Á¢±ÙÀ» ½Ã
µµÇÒ °ÍÀÌ´Ù. ÀÌÀåÀº Æ®·çÄ÷¯ ÇÁ·Î±×·¡¹ÖÀ» Çϴ óÀ½ÀÌÀÚ ¸¶Áö¸· ÀåÀÌ´Ù.

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

 (1) ¿ì¸®°¡ ¸¸µé ÃÖÁ¾ ¼Ò½ºÀÇ »ê¹° DX24Bit7.Exe.

  ¿©±â¼­´Â Á÷Á¢ ¹Ù²ï ÄÚµåµéÀ» ¾ð±ÞÇÏÁö ¾Ê°Ú´Ù. ¸ðµç °ÍÀº MainUnt7.Pas ¿Í
 SubUnit7.Pas ¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. ÀÌ°ÍÀº ÃÖÁ¾ÀûÀ¸·Î ÇÊÀÚ°¡ ¸¸µç ÄÚµåÀ̸ç
 °¡Àå °£´ÜÇÑ °ÔÀÓÀÇ ÇüŸ¦ °®Ãß¾ú´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. ( À¯ÀÏÇÏ°Ô EXE ÆÄÀÏ
 ÀÌ Æ÷ÇԵǾî ÀÖÀ» °ÍÀÌ´Ù. )

  ÀÌÇظ¦ ºü¸£°Ô Çϱâ À§Çؼ­´Â °á°ú¹°À» ¸ÕÀú ºÁµÎ´Â ÆíÀÌ ÁÁÀ» °ÍÀÌ´Ù. ¾Æ
 ¸¶µµ DX24Bit5.Exe ¿Í´Â °ÅÀÇ °°Àº ¸ð½ÀÀ» º¸ÀÏ °ÍÀÌ´Ù. ¹Ù²ïÁ¡À» º¸ÀÚ¸é ÀÌ
 ·¯ÇÏ´Ù.

    1) Ctrl Àº ºÒ¶Ë, Alt ´Â ¹ÝÅõ¸íÀÇ Çª¸¥ È­¿°,  Shift ´Â ÇÑ ¹ø¿¡ 5 °³ÀÇ
       ¹ÝÅõ¸í È­¿°ÀÌ ²¿¸®¸¦ ²ø¸ç Áö³ª°£´Ù.
    2) 'µ¥¸ó'Àº ³×Å並 °Ü³ÉÇÏ¿© ¿¡³ÊÁö º¼À» ³­»çÇÒ °ÍÀÌ´Ù.
       ( Á¤Á¶ÁØÀ» ÇÏÁö ¾ÊÀº ÀÌÀ¯´Â ¿¡³ÊÁö º¼¿¡ ·£´ýÀÇ °¡¼Óµµ ¿ä¼Ò¸¦ ³Ö¾ú
         ±â ¶§¹®ÀÌ´Ù. )
    3) ºÒ¶Ë°ú µ¥¸ó°£¿¡ Ãæµ¹ üũ°¡ ÀÌ·ç¾îÁö°í HP °¡ 0 ÀÌÇÏ°¡ µÇ¸é µ¥¸óÀº
       ¼Ò¸êÇÑ´Ù.

  ¿©±â¼­ Æ®·çÄ÷¯ ÇÁ·Î±×·¡¹ÖÀÌ µé¾î °£°ÍÀÌ ¹Ù·Î Shift ¸¦ ´©¸£¸é ÃâÇöÇÏ´Â
 ÆĶõ»ö ¹ÝÅõ¸í È­¿°ÀÌ´Ù. ±×·¡¼­ ´Ù¸¥ °ÍµéÀº ´ëÃæ ¼³¸íÇÏ°í ±× ºÎºÐ¸¸ ÁßÁ¡
 ÀûÀ¸·Î ´Ù·ç°Ú´Ù.

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

 (2) Lock °ú Unlock ÇÔ¼öÀÇ ÀÇÀÇ

  ÀÚ½ÅÀÌ ¸¸ÀÏ µµ½º¿¡¼­ Á÷Á¢ ±×·¡ÇÈ ¸Þ¸ð¸® ( A000:0000 ) ¸¦ ÅëÇØ ±×·¡ÇÈÀ»
 ÇØ º¸¾Ò´Ù¸é ±Ý¹æ ÀÌÇØµÉ ºÎºÐÀÌ´Ù.  Æ¯È÷ 13h packed ¸ðµå ( 320 * 200 * 8
 bpp ) ¿¡¼­ Á¡À» Âï¾îº» °æÇèÀÌ ÀÖ´Ù¸é  ¸î°¡Áö ÁÖÀÇ »çÇ׸¸ ¾Ë¸é °ÅÀÇ °°Àº
 °³³äÀ¸·Î ÀÛ¾÷ÀÌ °¡´ÉÇÏ´Ù. µµ¸®¾î plane À̳ª bank °¡¾ø¾î¼­ ÇÁ·Î±×·¡¸ÓÀÇ
 ÀÔÀå¿¡¼­´Â ¹«Ã´À̳ª Æí¸®ÇÏ´Ù°í º¼ ¼ö ÀÖ´Ù.

  12h ¸ðµå³ª 13h ÀÇ plane ¸ðµå¿¡ ÀÖ´Â plane À» ÀÌÇØÇϱâ À§ÇØ ¸Ó¸®¸¦ ½Î¸Å
 ½Å ºÐµéÀ̳ª, VESA ¿¡¼­ ¼±Çü ¾îµå·¹½º ¸ðµå¸¦ ±¸ÇöÇÏ°íÀÚ ¶¡ È긮½Å ºÐµé¿¡
 °Õ ³Ê¹«³ªµµ Ç㹫ÇÒÁöµµ ¸ð¸¦ Á¤µµ·Î ½±°Ô µÇ¾î ÀÖ´Â°Ô »ç½ÇÀÌ´Ù.

  Lock °ú Unlock ÀÇ »ç¿ë¹ýÀº °­ÁÂ(3) ¿¡¼­ ´Ù·ç¾úÀ¸¹Ç·Î ¿©±â¼­ ¾ð±ÞÇÏÁö´Â
 ¾Ê°Ú°í, ´Ù¸¸ ¸ðµå ±¸Á¶¿Í ÁÖÀÇÁ¡À» ¸»ÇØ µÎ°Ú´Ù.

  Lock ¿¡ ÇÊ¿äÇÑ TDDSurfaceDesc ±¸Á¶Ã¼¿¡´Â, ¾Õ¿¡µµ ¸»ÇßµíÀÌ lpSurface ¿Í
 lPitch ¶ó´Â Áß¿äÇÑ ·¹Äڵ带 °¡Áö°íÀÖ´Ù. lpSurface ´Â GlobalAlloc() À¸·Î
 ¾òÀº ¸Þ¸ð¸®¸¦ GlobalLock() À¸·Î ¸Þ¸ð¸®¸¦ °íÁ¤½ÃÄÑ ±× ÁÖ¼Ò¸¦ ¾ò´Â °³³ä°ú
 µ¿ÀÏÇÏ´Ù. lpSurface ´Â Lock ÀÇ Ã¹¹ø° ÀμöÀÎ lpDestRect ÀÇ °¡Àå ¿ÞÂÊ »ó
 ´ÜÀÇ ÁÖ¼Ò¸¦ µ¹·ÁÁØ´Ù.  ±×¸®°í lPitch ´Â ´ÙÀ½ ¶óÀαîÁöÀÇ ¹ÙÀÌÆ® ¼öÀ̹ǷÎ
 y Áõ°¡½Ã¿¡´Â Ç×»ó ´õÇØÁÖ¾î¾ß ÇÑ´Ù.

  µû¶ó¼­ lpDestRect ¿¡ µû¸¥ ³í¸® ÁÂÇ¥ (x,y) ´Â,

     longint(LockDesc.lpSurface) + y * LockDesc.lPitch + x * BPP)

 °¡ µÇ´Â °ÍÀÌ´Ù.  ¿©±â¼­ BPP ´Â Çȼ¿´ç ¹ÙÀÌÆ®¼ö¸¦ ÀǹÌÇϹǷΠ24ºñÆ® Æ®·ç
 Ä÷¯¿¡¼­´Â 3 ( = 24 / 8 ) ÀÌ µÈ´Ù.

  ÇÏÁö¸¸ Lock °ú Unlock À» »ç¿ëÇÔ¿¡ À־, ±²ÀåÈ÷ Áß¿äÇÑ ´ÜÁ¡ Çϳª°¡ ¼û
 ¾îÀÖ´Ù´Â °ÍÀ» ¾Ë¾Æ¾ßÇÑ´Ù.  À©µµ¿ì 95 ´Â 32 bit ¿î¿µÃ¼Á¦¶ó°í ÇÏÁö¸¸ ÇÏÀ§
 È£È¯À» À§Çؼ­ »ó´ç¼öÀÇ ÀÚ¿øÀ» Win16 °ú °ø¿ëÇÏ°í ÀÖ´Ù. ƯÈ÷ Lock °°Àº °æ
 ¿ì°¡ ´ëÇ¥ÀûÀε¥.. Ç¥¸éÀÌ Lock µÇ¾î ÀÖ´Â µ¿¾È¿¡ Win32 ÀÇ GDI Ãâ·ÂÀÌ ½ÇÇà
 µÈ´Ù¸é ½ÊÁßÆȱ¸ ´Ù¿îÀÌ µÇ¾î ¹ö¸°´Ù. ±×·¡¼­ ÇïÇÁ¿¡¼­´Â Lock °ú Unlock »ç
 ÀÌÀÇ ½Ã°£À» ÃÖ´ëÇÑ ´ÜÃà ½ÃÄѶó°í ³ª¿ÍÀÖ´Ù.

  ¶ÇÇÑ ÁÖÀÇÇØ¾ß ÇÏ´Â ºñ½ÁÇÑ ÇÔ¼ö·Î´Â GetDC ¿Í ReleaseDC°¡ ÀÖ´Ù.  GDI ÀÇ
 ÇÔ¼ö¿Í À̸§ÀÌ °°Àº¸¸Å­ ¿ªÇÒµµ À¯»çÇÏ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. ¸¸¾à GetDC ÇÔ¼ö
 ·Î ¹é ¹öÆÛÀÇ µð¹ÙÀ̽º ÄÁÅؽºÆ®¸¦ ¾ò´Â´Ù¸é, ´ç½ÅÀÌ Á¤ÀÇÇÑ TCanvas °´Ã¼ÀÇ
 Handle ¿¡ DC ¸¦ ´ëÀÔÇغ¸¶ó.  ±×·¯¸é °ÅÀÇ ¸ðµç Canvas °´Ã¼¿¡ ÀÖ´Â GDI ÇÔ
 ¼ö¿Í ¿¬°áÀÌ µÈ´Ù. ÇÑ±Û Ãâ·Â°°Àº ±×·± ·ù¿¡ ¾È¼º¸ÂÃãÀÌ´Ù. ÇÏÁö¸¸ GetDC ´Â
 ³»ºÎÀûÀ¸·Î Lock ÇÔ¼ö¸¦ È£ÃâÇϹǷΠ¿ª½Ã ReleaseDC ¸¦ Çϱâ Àü¿¡ ´Ù¸¥ µð½º
 Ç÷¹ÀÌ ÄÁÅؽºÆ®ÀÇ GDI Ãâ·ÂÀÌ ¹ß»ýÇÏ¸é ¿ª½Ã ´Ù¿îµÈ´Ù.

  ±×·¡¼­ °á·ÐÀ» ¸»ÇÏÀÚ¸é Lock °ú Unlock ... GetDC ¿Í ReleaseDC »çÀÌÀÇ ½Ã
 °£Àº µÇµµ·ÏÀ̸é ª°Ô ÇÏ´Â °ÍÀÌ ÇÁ·Î±×·¥ÀÇ ¾ÈÁ¤¼ºÀ» ³ôÀÌ´Â ±æÀ̸ç,  ¸¸¾à
 Lock À» ÀÌ¿ëÇØ ¸ðµç Ãâ·ÂÀ» ÇÏ´Â °ÔÀÓÀ» ¸¸µç´Ù¸é ¾Æ¿¹ ½Ã½ºÅÛ Å°¸¦ »ç¿ëÇÒ
 ¼ö ¾ø°Ô ÇÏ¿© Alt-Tab °ú °°Àº °Í¿¡ ÀÇÇØ ´Ù¿î µÇÁö ¾Ê°Ô ÇØ¾ß ÇÑ´Ù.

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

 (3) ¹Ù²ï ºÎºÐ¿¡ ´ëÇÑ ÀÌÇØ

  ¾Æ·¡´Â MainUnt7.Pas ¿¡¼­ ¹Ù²ï °ÔÀÓ ÃʱâÈ­ ºÎºÐÀÌ´Ù. ÀÌ ºÎºÐ¿¡¼­´Â Á÷Á¢
 ¸Þ¸ð¸®¿¡ Á¢±ÙÇϱâ À§ÇÑ  À̹ÌÁöÀÇ µ¥ÀÌÅÍ ÇüÀ» ¸¸µå´Â ÄÚµå·Î½á,  µµ½º¶§ÀÇ
 ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅÍ¿Í °°Àº << X±æÀÌ(2bytes) + Y±æÀÌ(2bytes) + ºñ¾ÐÃà µ¥ÀÌ
 ÅÍ >> ½ÄÀÇ µ¥ÀÌÅÍ ±¸Á¶ÀÌ´Ù.  ´Ü ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù¸é µµ½º¶§´Â ºñ¾ÐÃà µ¥ÀÌŸ
 °¡ 1 byte Àε¥ ºñÇØ ¿©±â¼­´Â DWORD ÀÎ 4 bytes ¸¦ ¾´´Ù´Â Á¡ÀÌ´Ù.  ±×·¯¹Ç
 ·Î µ¥ÀÌÅ͸¦ ¸¸µé±â À§ÇÑ °ø°£Àº << X ±æÀÌ * Y ±æÀÌ * sizeof(DWORD) + 4 (
 Çì´õ¿¡ ¾²ÀÎ 4 bytes ) >> °¡ µÈ´Ù.  ¿©±â¼­´Â ´ë»óÀÌ µÇ´Â tiFlame ¿¡ ´ëÇÑ
 µ¥ÀÌÅ͸¸ DOWRD Çü Æ÷ÀÎÅÍ Àü¿ª º¯¼öÀÎ flame_image ¿¡ ¸¸µç´Ù.

  Á÷Á¢ ¼Ò½º¿¡ ÁÖ¼®À» ´Þ¸é¼­ ¼³¸íÇÏ°Ú´Ù.

|  procedure TBasic.InitializeGame;
|  var
|     i,j  : integer;
|     LWord : DWORD;
|     PLong : PDWORD;
|     Desc  : TDDSurfaceDesc;
|  begin
|     with TileInfo[tiFlame] do begin
|        GetMem(flame_image,(Right-Left)*(Bottom-Top)*sizeof(DWORD)+4);
           // À§¿¡¼­ ¼³¸íÇÑ °ª¸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´ç ¹Þ´Â´Ù.
|        PLong  := flame_image;
           // PLong Àº flame_image ÀÇ ¹øÁö¸¦ °®´Â´Ù.
|        LWord  := (Right-Left) or ((Bottom-Top) shl 16);
           // Çì´õ Á¤º¸¸¦ DWORD º¯¼ö¿¡ ¸¸µç´Ù.
|        PLong^ := LWord;
           // Çì´õ Á¤º¸¸¦ PLong ÀÌ °¡¸®Å°´Â ¹øÁö¿¡ ³Ö´Â´Ù.
|
|        Desc.dwSize := SizeOf(TDDSurfaceDesc);
|        repeat
|        until Basic.MakeItSo(Basic.Image[1].Lock(Rect(0,0,MAX_X_LINE,
|           MAX_Y_LINE),Desc,DDLOCK_SURFACEMEMORYPTR + DDLOCK_WAIT, 0));
           // image[1] ÀÇ Ç¥¸éÀ» °íÁ¤½ÃŲ´Ù.
|
|        for j := Top to pred(Bottom) do
|        for i := Left to pred(Right) do begin
|           inc(PLong);
|           LWord  := PDWORD(longint(Desc.lpSurface)+j*Desc.lPitch+i*BPP)^
|          and longint($00FFFFFF);
|           PLong^ := LWord;
|        end;
           // image[1] ÀÇ ¿µ¿ªÁß ÇÊ¿äÇÑ »ç°¢Çü¿¡¼­ µ¥ÀÌŸ¸¦ »Ì¾Æ³½´Ù.
           // ³ªÁß¿¡ Lock ÇßÀ»¶§ÀÇ ¸Þ¸ð¸® ÁÖÁ¶¸¦ ¾Ë·ÁÁÖ°Ú´Ù.
|
|        Basic.Image[1].UnLock(Desc.lpSurface);
           // image[1] ÀÇ Ç¥¸é °íÁ¤À» ÇØÁ¦ÇÑ´Ù.
|
|     end;
|
|     Objects[1] := new(PFriend,Create(tiNeto1,100,200,5000));
|     Objects[2] := new(PEnemy ,Create(tiDemon,350,100,10000));
        // ÀÌÀü°ú ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù¸é ¿¡³ÊÁö°¡ °¢°¢5000 °ú 10000 À¸·Î ¸í½Ã
        // µÇ¾îÁ³´Ù´Â Á¡ÀÌ´Ù.
|  end;


  ¾Æ·¡´Â »õ·Ó°Ô »ý±ä 2 °³ÀÇ °´Ã¼¿¡ ´ëÇÑ ¼³¸íÀÌ´Ù.

|     PTransparency = ^TTransparency;
        // TTransparency ´Â Alt ¸¦ ´­·¶À» ¶§  Âª°Ô ³ª°¡´Â ÆĶõ ¹ÝÅõ¸í È­
        // ¿°À» Ç¥ÇöÇÏ´Â °´Ã¼ÀÌ´Ù.
|     TTransparency = object(TObjects)
        // ¸ðµç Ư¡Àº TObject ¿¡¼­ »ó¼Ó ¹Þ¾Ò´Ù.
|
|        procedure   DisplaySelf; virtual;
           // ÇÏÁö¸¸ DisplaySelf ´Â ÀçÁ¤ÀÇ Çß´Ù.  ÀÌÀ¯´Â ¹ÝÅõ¸í °´Ã¼¸¸ÀÇ
           // Ãâ·Â ·çƾÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù.
|
|     end;
|
|     PMotionBlur = ^TMotionBlur;
        // TMotionBlur ´Â Shift ¸¦ ´­·¶À» ¶§ ²¿¸®¸¦ ²ø¸ç ³ª°¡´Â  ÆĶõ ¹Ý
        // Åõ¸í È­¿°À» Ç¥ÇöÇÏ´Â °´Ã¼ÀÌ´Ù.
|     TMotionBlur = object(TObjects)
        // ¸ðµç Ư¡Àº TObject ¿¡¼­ »ó¼Ó ¹Þ¾Ò´Ù.
|
|        procedure   DisplaySelf; virtual;
|        function    DoAction : boolean;  virtual;
           // ¹ÝÅõ¸í È­¿°Àº ÀڽŸ¸ÀÇ Ãâ·Â°ú Çൿ ¹æ½ÄÀ» °¡Áö¹Ç·Î  ÀçÁ¤ÀÇ
           // µÇ¾î¾ß ÇÑ´Ù.
 

  ¾Æ·¡´Â °¢°¢ÀÇ °´Ã¼¿¡¼­ ÀçÁ¤ÀÇ µÈ ºÎºÐÀÇ ¼Ò½º¸¸À» Ãß·Á³½ °ÍÀÌ´Ù.
 ÀÌÀüÀÇ DisplaySelf ´Â DX ÀÇ ³»Àå ÇÔ¼öÀÎ BltFast ¸¦ »ç¿ëÇ߱⠶§¹®¿¡ Åõ¸í
 »öÀ» Ç¥ÇöÇϱâ À§Çؼ­´Â ±× ÇÔ¼ö¸¦ ÀçÁ¤ÀÇ ÇÏ¿© ±×¿¡ µû¸¥ Åõ¸í»ö Ãâ·Â ÇÔ¼ö
 ¸¦ ¸¸µé¾î È£ÃâÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇÑ´Ù.

|  procedure   TTransparency.DisplaySelf;
|  begin
|     Basic.LockBackGround;
        // ¹é ¹öÆÛ¸¦ °íÁ¤½ÃŲ´Ù.
|     DisplayEffect(mX,mY,flame_image^,mHP);
        // DisplayEffect ¸¦ È£ÃâÇÑ´Ù. ( ÀÌ ÇÔ¼ö´Â ³ªÁß¿¡ ÀÚ¼¼È÷ ¼³¸í )
|     mHP := mHP - 8;
        // HP ¸¦ °¨¼Ò½ÃŲ´Ù.  HP ´Â Åõ¸í»öÀÇ °­µµ¿¡ ¿µÇâÀ» ÁÖ¸ç 0 ÀÌÇÏ°¡
        // µÇ¸é °´Ã¼ÀÇ ¼Ò¸êÀ» ¾Ë·ÁÁØ´Ù.
|     Basic.UnlockBackGround;
        // ¹é ¹öÆÛ °íÁ¤À» ÇØÁ¦ÇÑ´Ù.
|  end;

  TMotionBlur.displaySelf ´Â À§ÀÇ TTransparency ¿Í À¯»çÇÏ´Ù.

|  procedure   TMotionBlur.DisplaySelf;
|  begin
|     Basic.LockBackGround;
|     DisplayEffect(mX,mY,flame_image^,mHP);
|     mHP := mHP - 15;
|     Basic.UnlockBackGround;
|  end;


|  function    TMotionBlur.DoAction : boolean;
|  var
|     i : integer;
|  begin
|     if (mHP <= 0) or (mX < 0) or (mX >= MAX_X_LINE-mXSize) or
|                      (mY < 0) or (mY >= MAX_Y_LINE-mYSize) then begin
|        DoAction := FALSE;
|        exit;
|     end;
        // HP °¡ 0 ÀÌÇÏÀ̰ųª À̹ÌÁö°¡ È­¸é¿¡¼­ Á¶±ÝÀÌ¶óµµ ¹þ¾î³ª¸é ¼Ò¸ê
        // Á¶°ÇÀÌ µÈ´Ù.
|
|     if CheckCrash then begin;
|        if mHP = 100 then begin
|           if ((mX + mVX) > 0)                 and
|              ((mX + mVX) < MAX_X_LINE-mXSize) and
|              ((mY + mVY) > 0)          and
|              ((mY + mVY) < MAX_Y_LINE-mYSize) then begin
|              if GetFreeObjects(i) then begin
|                 Objects[i] := new(PMotionBlur,Create(tiFlame,
|    

                               Trunc(mSX+mVX+0.5),Trunc(mSY+mVY+0.5),
|                                   100,mVX,mVY,0,0));
|              end;
|           end;
|        end;
|        DoAction := TRUE;
|     end else begin
|        DoAction := FALSE;
|     end;
        // CheckCrash ´Â ÇöÀçÀÇ °´Ã¼°¡, ¿µÇâÀ» ÁÖ´Â ´Ù¸¥ °´Ã¼¿Í Ãæµ¹Çß´Â
        // °¡¸¦ ÆǺ°ÇÏ¿© µ¥¹ÌÁö¸¦ ÀÔÈ÷°í ÀÚ½ÅÀº ¼Ò¸êÇÏ´Â ±¸Á¶¸¦ °¡Áø´Ù.
        // FALSE °¡ µ¹¾Æ¿Â´Ù¸é ´Ù¸¥ °´Ã¼¿Í Ãæµ¹ÀÌ ÀϾ ÀÚ½ÅÀº ¼Ò¸êµÈ´Ù
        // ´Â °ÍÀ» ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù.
        // ¸¸¾à TRUE °¡ µ¹¾Æ ¿Ô´Ù¸é Á¦ÀÏ Ã³À½ ´Ü Çѹø¸¸ ( mHP = 100 ) ÀÚ
        // ½Å°ú °°Àº °´Ã¼¸¦ âÁ¶Çس»°í ÀÚ½ÅÀº HP ¸¦ ÁÙ¿© ³ª°¡´Â ¸ÞÄ«´ÏÁò
        // ÀÌ´Ù. âÁ¶ÇÑ °´Ã¼´Â ÀÚ½ÅÀÇ ¼Óµµ¸¸Å­ ¾Õ¼­¼­ »ý¼ºµÇ±â ¶§¹®¿¡ º¸
        // ´Â ÀÌ·Î ÇÏ¿©±Ý ±â´Ù¶õ ²¿¸®¸¦ ²ø¸ç ³¯¾Æ°¡´Â °Íó·³ º¸ÀÌ°ÔÇÑ´Ù.
        // ±×¸®°í HP °¡ Áٸ鼭 Åõ¸íµµ´Â ¶³¾îÁö°í  0 ÀÌÇÏ°¡ µÇ¸é ¼Ò¸êÇϹÇ
        // ·Î ¼­¼­È÷ »ç¶óÁö´Â È¿°úµµ º¼ ¼ö ÀÖ´Ù.
|
|  end;


  ±×·³ ¾Õ¿¡¼­ ³ª¿Â Ãâ·ÂÇÔ¼ö¸¦ º¸ÀÚ.  ÀÌ ÇÔ¼ö¾ß ¸»·Î  Æ®·çÄ÷¯¿¡ ÇØ´çÇÏ´Â
 À¯ÀÏÇÑ ÇÔ¼öÀÌ´Ù. Áï À̰͸¸ Á» ¹Ù²Ù°í ÃʱâÈ­¿¡¼­ 16bit ÇÏÀÌÄ÷¯·Î ÇÑ´Ù¸é
 ¿ª½Ã µ¿ÀÏÇÑ °á°ú°¡ ³ª¿Â´Ù´Â ¶æÀÌ´Ù. ( 32bit Æ®·çÄ÷¯µµ ¸¶Âù°¡Áö.. )
  ÀÌ Åõ¸í»ö ÇÔ¼ö´Â µµ½º¿¡ »ç¿ëÇÏ´ø °ÍÀ» ±×´ë·Î ÄÁ¹öÆÃÇÑ°Å¶ó  ¾à°£ ÁöÀúºÐ
 ÇÏÁö¸¸ ±×·¡µµ ÀÌÇØÇØ Áֱ⸦ ¹Ù¶õ´Ù.

|  procedure DisplayEffect(x, y : integer; var bitmap_data;
|                                                      ratio : integer);
        // x ¿Í y ´Â À̹ÌÁö¸¦ Ãâ·ÂÇÒ ¹é ¹öÆÛÀÇ ÁÂÇ¥ÀÌ°í,  bitmap_data ´Â
        // ½ºÇÁ¶óÀÌÆ®°¡ µé¾îÀÖ´Â º¯¼ö¸¦ reference ·Î ¹Þ´Â´Ù. ratio ´Â Åõ
        // ¸íµµÀÇ ºñÀ²·Î 0 - 100 Á¤µµÀÇ ¹üÀ§¸¦ °¡Áø´Ù.
|  var
|     r, g, b       : word;
|     _x, _y, x_len, y_len, x_len_half, y_len_half : word;
|     data          : longint;
|     pSour, pDest  : PDWORD;
|     temp          : DWORD;
|     tr1, tr2      : longint;
|     tr3, division : word;
|  begin
|     if (x < 0) or (y < 0) then exit;
        // x, y ÀÇ ¹üÀ§°¡ È­¸éÀ» ¹þ¾î³ª¸é ´Ù¿î±îÁöµµ µÈ´Ù.
|     if addr(bitmap_data) = nil then exit;
        // @bitmap_data °¡ nil À̶ó¸é ´ç¿¬È÷ exit.
|     pSour := PDWORD(@bitmap_data);
        // bitmap_

data ÀÇ ÁÖ¼Ò¸¦ DWORD ÀÇ Æ÷ÀÎÅÍ ÇüÀ¸·Î  Å¸ÀÔ Ä³½ºÆÃÇÏ¿©
        // pSour ÀÇ ÁÖ¼Ò·Î »ç¿ëÇÑ´Ù.
|     x_len := LoWord(pSour^);
|     y_len := HiWord(pSour^);
        // ù¹ø° DWORD ´Â Çì´õÀ̹ǷÎÇÏÀ§ ¿öµå´Â X ±æÀÌ, »óÀ§ ¿öµå´Â Y
        // ±æÀÌÀÌ´Ù.
|     inc(pSour);
        // pSour++ °ú °°À¸¹Ç·Î ³»ºÎÀûÀ¸·Î ÁÖ¼Ò°¡ 4 bytes Áõ°¡ÇÑ´Ù.
|     x_len_half := x_len div 2;
|     y_len_half := y_len div 2;
        // ¾à°£ÀÇ ¼Óµµ À̵æÀ» º¸°íÀÚ X, Y ÀÇ ±æÀÌ¿¡ ´ëÇÑ / 2 °ªÀ» º¯¼ö·Î
        // µÎ¾ú´Ù.
|
|     if (x_len = 0) or (y_len = 0) then exit;
        // X ±æÀ̳ª Y ±æÀÌ°¡ 0 À̶ó¸é ´ç¿¬È÷ exit.
|
|     if Basic.FPixelFormat = pfBGR then begin
|        if ColorInfo = ciRed then ColorInfo := ciBlue
|        else if ColorInfo = ciBlue then ColorInfo := ciRed;
|     end;
        // ¸¸¾à Çȼ¿ ±¸Á¶°¡ RGB °¡ ¾Æ´Ñ BGR À̶ó¸é ciRed ¿Í ciBlue ´Â ¼­
        // ·Î ½º¿ÍÇÎÇØ¾ß Á¦´ë·Î µÈ °á°ú°¡ ³ª¿Â´Ù.
|
|     division := x_len * y_len div ratio div 2;
        // °øÅëÀûÀ¸·Î ³ª´©¾îÁÙ ¼ö¸¦ ¹Ì¸® °è»êÇصдÙ.

|     for _y := 0 to pred(y_len) do begin
|        with Basic.LockDesc do
|           pDest := PDWORD(longint(lpSurface)+y*lPitch+x*BPP);
              // (X,Y) ¿¡ ´ëÇÑ ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¾ò´Â´Ù.
|        for _x := 0 to pred(x_len) do begin
|           data := pSour^; inc(pSour);
              // ÇöÀçÀÇ ½ºÇÁ¶óÀÌÆ® µ¥ÀÌÅ͸¦ Àо data ¶ó´Â º¯¼ö¿¡ µÐ´Ù.
              // ÀÚ½ÅÀº ´ÙÀ½ µ¥ÀÌÅ͸¦ Àбâ À§Çؼ­ ÇÑ ½ºÅÜ Áõ°¡½ÃŲ´Ù.
|           if data <> longint($0) then begin
              // ¸¸¾à data °¡ Åõ¸í»öÀ̶ó¸é....
|              temp   := pDest^;
                 // ÂïÈú °÷ÀÇ DWORD ¸¦ ¹Ì¸® Àоî temp ¿¡ ÀúÀåÇÑ´Ù.
|              r      := Byte(temp shr 16);
|              g      := Byte(temp shr  8);
|              b      := Byte(temp);
                 // temp ¿¡ µé¾î¿Â 4 bytes ÀÇ ÀڷḦ ºÐ¼®Çϸé ÀÌ·¸´Ù.
                 // [ #### rrrr gggg bbbb ] <- 16 Áø¼ö·Î Ç¥±â
                 // ÀÌ·¸±â ¶§¹®¿¡ ½¬ÇÁÆ® ¿¬»ê°ú ŸÀÔ Ä³½ºÆø¸À¸·Î °¢°¢ÀÇ
                 // RGB ¿ä¼Ò¸¦ ÃßÃâÇÒ ¼ö ÀÖ´Ù.
                 // ( ³ªÁß¿¡ #### À̶ó´Â ¿ä¼Ò°¡ ²À ÇÊ¿äÇÏ´Ù.. )
|              tr1    := (x_len_half - abs(integer(_x)- x_len_half));
|              tr2    := (y_len_half - abs(integer(_y)- y_len_half));
|              tr3    := (tr1 * tr2 div division) shl 2;
                 // ¾ó¸¶³ª ½ºÇÁ¶óÀÌÆ®ÀÇ Á߽ɿ¡ À§Ä¡Çߴ°¡¸¦ °è»ê ÇÏ´Â °Í
                 // À¸·Î tr3 ¶ó´Â ÃÖÁ¾ º¯¼öÀÇ °ªÀ» ¸¸µé¾î ³½´Ù.
|              inc(g,tr3);
|              inc(r,tr3);
|              inc(b,DWORD($FF) * ratio div 64);
                 // Ǫ¸¥»öÀÇ Åõ¸í»öÀ̹ǷΠ G ¿Í R Àº ±×³É µÎ°í B ¿¡ ´ëÇÑ
                 // °¡°ø¸¸À» ÇÑ´Ù.
|              if r > $FF then r := $FF;
|              if g > $FF then g := $FF;
|             if b > $FF then b := $FF;
                 // r,g,b ¸¦ word ·Î ¼±¾ðÇÑ ÀÌÀ¯°¡ À̶§¹®ÀÌ´Ù. ¸¸¾à »ö»ó
                 // ÀÇ ÃÖ°íÄ¡ÀÎ $FF(255) ¸¦ ³Ñ¾î°¡´Â ¼öÄ¡¶ó¸é  $FF ·Î ¸¸
                 // µé¾î ÁØ´Ù. ¸¸¾à byte ÇüÀ¸·Î ¼±¾ðÇß´Ù¸é ¿À¹ö Ç÷ο찡
                 // ÀϾ 0 ºÎÅÍ ´Ù½Ã ½ÃÀ۵ǾúÀ» °ÍÀÌ´Ù.
|              data   := (temp and $FF000000) or (longint(r) shl 16) or
|                        (longint(g) shl 8)   or longint(b);
                 // ´Ù½Ã¸¸µç r,g,b ¸¦ ´Ù½Ã DWORD ÇüÀ¸·Î ¸¸µç´Ù. ùºÎºÐ¿¡
                 // ´Â À§ÀÇ '####' ºÎºÐÀÇ gabage(?) ¸¦ or ·Î °áÇÕ ½ÃÅ°´Â
                 // ºÎºÐÀÌ ³ª¿Â´Ù. ÀÌ°ÍÀ» ¾ÈÇØÁÖ¸é ¹Ù·Î ¿À¸¥ÂÊ ¿·ÀÇ Çȼ¿
                 // ±îÁö ¿µÇâÀ» ¹ÌÄ£´Ù. ±Ã±ÝÇϸé (temp and $FF000000) or
                 // ºÎºÐÀ» »©°í ½ÇÇà ½ÃÄÑ º¸¶ó.
|              pDest^ := data;
                 // ÃÖÁ¾ °á°ú¹°ÀÎ DWORD º¯¼ö data ¸¦ ¹é ¹öÆÛ¿¡ ¾´´Ù.
|           end;
|           inc(longint(pDest),BPP);
              // pDest ¸¦ BPP ( = 3) ¸¸Å­ Áõ°¡½ÃŲ´Ù.  ½ÇÁ¦·Î pDest ´Â 4
              // bytes Çü Æ÷ÀÎÅÍÀ̹ǷΠ3 bytes ¸¸ ÁÖ¼Ò¸¦ Áõ°¡½ÃÅ°·Á¸é ÀÌ

              // ·¸°Ô ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
              // Âü°í·Î, µµ½ºÀÇ º£»ç ¸ðµå¿¡¼­´Â 3 bytes Àü¼ÛÀ» À§ÇØ 2 ¿Í
              // 1 ·Î ³ª´©¾î¼­ µÎ¹ø Àü¼ÛÇÏ´Â ¹æ¹ýÀ» ¾²°ïÇß´Ù.
|        end;
|        inc(y);
           // y ÁÂÇ¥¸¦ Çϳª Áõ°¡ÇÑ´Ù.
|     end;
|  end;

  ( ** À§ÀÇ ¼Ò½º´Â ÃÖÁ¾ ¹öÀü¿¡¼­ ¾à°£ÀÇ ¼öÁ¤ÀÌ ÀÖ¾ú´Ù. )

  ³ª¸ÓÁö ¼Ò½º¿¡ ´ëÇÑ ¾ð±ÞÀº ÇÇÇϵµ·Ï ÇÏ°Ú´Ù. ÀÌ°ÍÀº ÇÊÀÚÀÇ °ÔÀ¸¸§¿¡µµ Å«
 ¹®Á¦°¡ ÀÖ°ÚÁö¸¸ ÀÌ °­ÁÂÀÇ ÀÇÀǸ¦ µ¨ÆÄÀÌ ¹®¹ýÀ̳ª À©µµ¿ì ÇÁ·Î±×·¥ ÀÛ¼ºÀÌ
 ¾Æ´Ñ DX ¿ë¹ýÀ¸·Î ±¹ÇÑ ½ÃÅ°°íÀÚ ÇÏ´Â ÇÊÀÚÀÇ Àǵµ ¶§¹®ÀÌ´Ù.

  ÀÌÁ¦ ³²Àº °ÍÀº ´ç½ÅÀÌ ½º½º·Î °ø°³ÀÚ·á½Ç¿¡ ¿Ã¶ó¿Â ÇÊÀÚÀÇ ÃÖÁ¾ ¼Ò½º¸¦ ºÐ
 ¼®Çؼ­ Á¦´ë·Î µÈ Æ®·çÄ÷¯ °ÔÀÓÀ»  ¸¸µé¾î ³»´Â °ÍÀÌ´Ù.  ¸ðµç °ÍÀº ´ç½ÅÀÇ
 ³ë·ÂÀÇ ¿©ÇÏ¿¡ ´Þ·È´Ù.  ÇÊÀÚ°¡ °ÔÀÓ ÇÁ·Î±×·¡¹Ö¿¡¼­ ÁÖÀåÇÏ´Â °ÍÀº ¹Ù·Î ÀÌ
 '³ë·Â'À̶ó´Â °ÍÀÌ´Ù. óÀ½ºÎÅÍ ÇÁ·Î±×·¡¹ÖÀ» À§ÇØ Å¸°í³­ µÎ³ú¸¦ ¼ÒÀ¯ÇÑ ÀÚ
 µµ ºÐ¸íÀÖ°ÚÁö¸¸  ±× ¿ª½Ãµµ ³²º¸´Ù °úÁ¤ÀÌ Á¶±Ý ´õ ½¬¿üÀ»»Ó ÀڽŸ¸ÀÇ ³ë·Â
 À» °ÔÀ»¸® ÇÏÁö ¾Ê¾ÒÀ» °ÍÀ̶ó´Â »ý°¢ÀÌ´Ù.

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

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

 Áö±Ý±îÁö Áö·çÇÏ´Ù¸é Áö·çÇÑ ¼³¸íÀ» Àоî ÁÖ´À½Ã¶ó°í ¼ö°íÇϼ̽À´Ï´Ù.
 ¿ø·¡ °­Á °èȹ°ú´Â ´Þ¸® ÀÏ¹Ý Ã¥¿¡¼­ ¾ð±ÞÇÏ´Â ¼öÁØÀ» ¸ø ¹þ¾î ³µ±º¿ä.  ±×
³É DX ÃʱâÈ­ÇÏ°í  À̹ÌÁö Âï´Â ¼öÁØ¿¡ ±×Ãļ­ Àúµµ ¾Èµû±î¿ï µû¸§ÀÔ´Ï´Ù. Áö
±ÝºÎÅÍ 2 ½Ã°£Èĸé ÀÌ ¾ÆÀ̵𰡠À¯º¸µÇ¾î ¹ö¸®´Â ¹Ù¶÷¿¡  °­Á¸¦ ½Ã°£¿¡ ¦i°Ü
¸¶ÃĹö·Á¼­ Àú ¿ª½Ã ¾ÈŸ±î¿î ¸¶À½À» ±ÝÇÒ ¼ö ¾ø±º¿ä.

 ¹ÌõÇÑ ÀúÀÇ °­Á¸¦ ÅëÇØ DX ¿¡ ´ëÇÑ ÀÌÇظ¦ ³ÐÇô °¡½Ç ºÐÀÌ  ¸î¸î ºÐÀ̶óµµ
µÈ´Ù¸é Á¦°¡ ÀÌ °­Á ŸÀÌÇÎ ÇÏ´À¶ó º¸³½ 1 ÁÖÀÏÀÇ ½Ã°£Àº ÃæºÐÈ÷ º¸»óµÇ°íµµ
³²À» °ÍÀÔ´Ï´Ù.

 ¸¸¾à, ¶Ç ÀÌ·± ±âȸ°¡ ã¾Æ¿Â´Ù¸é ´õ¿í ´õ ½Éµµ ±íÀº ³»¿ëÀ¸·Î ´Ù°¡ ¼­°í ½Í
Àºµ¥.... ¾ÆÁ÷ ½Ç·Âµµ ºÎÁ·ÇÏ°í... °ÔÀÓ ÇÁ·Î±×·¡¹Ö¿¡ ÅõÀÚÇÒ ½Ã°£µµ ÀÌÁ¨ ¾ø
°í...

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

          " A mountain is a mountain, Water is water. "
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                                         98.1.31  ¾È¿µ±â