home *** CD-ROM | disk | FTP | other *** search
/ Chip: Shareware for Win 95 / Chip-Shareware-Win95.bin / ostatni / delphi / delphi2 / wowsrc.exe / MOVEIT.PAS < prev    next >
Pascal/Delphi Source File  |  1996-01-14  |  5KB  |  203 lines

  1. unit Moveit;
  2.  
  3. interface
  4. Uses
  5.   WinTypes, WinProcs, Graphics, Classes, IniFiles, StdCtrls;
  6.  
  7. const
  8.    NULL = 0;
  9. var
  10.    mHBMImage:       HBITMAP;
  11.    mHBMMask:        HBITMAP;
  12.    mHBMSave:        HBITMAP;
  13.    mX, mY:          Integer;
  14.    mWidth, mHeight: Integer;
  15.  
  16.    { Supposed to be in Moveto function }
  17.    HMemDC:  HDC;
  18.    HMemDCHold: HDC;
  19.  
  20. Function Initialize (HBMMask: TBitmap; HBMImage: TBitmap): Boolean;
  21. Function MoveTo (HDc: HDC; X: Integer; Y: Integer): Boolean;
  22.  
  23. implementation
  24.  
  25. Function Initialize (HBMMask: TBitmap; HBMImage: TBitmap): Boolean;
  26. { assigns the bitmaps containing the sprite image and
  27.   prepares the sprite object for a new animation sequence; may
  28.   be called more than once for a given object}
  29. var
  30.    HDCScreen:  HDC;
  31.    HBMSave: HBITMAP;
  32.    ImageBM: TBitmap;
  33.    MaskBM: TBitmap;
  34.    GetResult: Integer;
  35. Begin
  36.    ImageBM := TBitmap.Create;
  37.    MaskBM  := TBitmap.Create;
  38.    {get and compare the sizes of the mask and image bitmaps: }
  39.  
  40.    MaskBM.Assign(HBMMask);
  41.    ImageBM.Assign(HBMImage);
  42.  
  43.    { return an error code if sizes are unequal: }
  44.    if (MaskBM.Width <> ImageBM.Width) or
  45.       (MaskBM.Height <> ImageBM.Height) then
  46.       Result := FALSE;
  47.    
  48.    { create the "save" bitmap for saving and restoring screen
  49.      graphics: }
  50.    HDCScreen := GetDC (NULL);
  51.    HBMSave := CreateCompatibleBitmap
  52.       (HDCScreen,
  53.       MaskBM.Width,    { same size as mask and image bitmaps }
  54.       MaskBM.Height);
  55.    ReleaseDC (NULL, HDCScreen);
  56.    if (HBMSave = NULL) then
  57.       Result := FALSE;
  58.       
  59.    { delete prior "save" bitmap, if any: }
  60.    if (mHBMSave <> 0) then
  61.       DeleteObject (mHBMSave);
  62.                                          
  63.    { function is successful; now assign values to data members: }
  64.    mHBMSave := HBMSave;
  65.    mHBMMask := HBMMask.Canvas.Handle;
  66.    mHBMImage := HBMImage.Canvas.Handle;
  67.    mWidth := MaskBM.Width;
  68.    mHeight := MaskBM.Height;
  69.    mX := 0;
  70.    mY := 0;
  71.  
  72.    ImageBM.Free;                                      { Free the Bitmap }
  73.    MaskBM.Free;
  74.    Result := FALSE;
  75. End;
  76.  
  77. Function MoveTo (HDc: HDC; X: Integer; Y: Integer): Boolean;
  78. { moves the sprite to a new position }
  79. Var
  80.    HBMHold: HBITMAP;
  81.    RectNew: TRect;
  82.    RectOld: TRect;
  83.    RectUnion: TRect;
  84.  
  85. Begin
  86.    { (1) create temporary hold bitmap: }
  87.  
  88.    { calculate coordinates of entire affected screen area: }
  89.    RectOld := Rect(mX, mY, mX + mWidth, mY + mHeight);
  90.    RectNew := Rect(X, Y, X + mWidth, Y + mHeight);
  91.  
  92.    UnionRect(RectUnion, RectOld, RectNew);
  93.    RectUnion.left := RectUnion.left - RectUnion.left MOD 8;
  94.  
  95.    HBMHold := CreateCompatibleBitmap
  96.       (HDc,
  97.       RectUnion.right - RectUnion.left,
  98.       RectUnion.bottom - RectUnion.top);
  99.    if (HBMHold <> 0) then
  100.       Result := FALSE;
  101.  
  102.    { (2) copy affected area of screen into hold bitmap: }
  103.    
  104.    HMemDCHold := CreateCompatibleDC (HDc);
  105.    SelectObject (HMemDCHold, HBMHold);
  106.  
  107.    BitBlt
  108.       (HMemDCHold,
  109.       0,
  110.       0,
  111.       RectUnion.right - RectUnion.left,
  112.       RectUnion.bottom - RectUnion.top,
  113.       HDc,
  114.       RectUnion.left,
  115.       RectUnion.top,
  116.       SRCCOPY);
  117.  
  118.    { (3) erase sprite in hold bitmap: }
  119.  
  120.    HMemDC := CreateCompatibleDC (HDc);
  121.    SelectObject (HMemDC, mHBMSave);
  122.    
  123.    BitBlt
  124.       (HMemDCHold,
  125.       mX - RectUnion.left,
  126.       mY - RectUnion.top,
  127.       mWidth,
  128.       mHeight,
  129.       HMemDC,
  130.       0,
  131.       0,
  132.       SRCCOPY);
  133.  
  134.    { (4) save screen graphics at new sprite position: }
  135.    
  136.    BitBlt
  137.       (HMemDC,
  138.       0,
  139.       0,
  140.       mWidth,
  141.       mHeight,
  142.       HMemDCHold,
  143.       X - RectUnion.left,
  144.       Y - RectUnion.top,
  145.       SRCCOPY);
  146.  
  147.    { (5) transfer mask bitmap: }
  148.  
  149.    SelectObject (HMemDC, mHBMMask);
  150.    BitBlt
  151.       (HMemDCHold,
  152.       X - RectUnion.left,
  153.       Y - RectUnion.top,
  154.       mWidth,
  155.       mHeight,
  156.       HMemDC,
  157.       0,
  158.       0,
  159.       SRCAND);
  160.  
  161.    { (6) transfer image bitmap: }
  162.  
  163.    SelectObject (HMemDC, mHBMImage);
  164.    BitBlt
  165.       (HMemDCHold,
  166.       X - RectUnion.left,
  167.       Y - RectUnion.top,
  168.       mWidth,
  169.       mHeight,
  170.       HMemDC,
  171.       0,
  172.       0,
  173.       SRCINVERT);
  174.  
  175.    { (7) copy hold bitmap back to screen: }
  176.  
  177.    BitBlt
  178.       (HDc,
  179.       RectUnion.left,
  180.       RectUnion.top,
  181.       RectUnion.right - RectUnion.left,
  182.       RectUnion.bottom - RectUnion.top,
  183.       HMemDCHold,
  184.       0,
  185.       0,
  186.       SRCCOPY);
  187.  
  188.    { delete the memory device contexts: }
  189.    DeleteDC (HMemDCHold);
  190.    DeleteDC (HMemDC);
  191.  
  192.    { (8) delete hold bitmap: }
  193.    DeleteObject (HBMHold);
  194.  
  195.    { (9) save coordinates of new sprite position: }
  196.    mX := X;
  197.    mY := Y;
  198.  
  199.    Result := TRUE;
  200. End;
  201.  
  202. end.
  203.