SPR.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:13k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. // Spr.h
  3. //---------------------------------------------------------------------------
  4. // Sprite handler
  5. //---------------------------------------------------------------------------
  6. // (C) Copyright 1992-1997 by Microsoft Corporation.  All rights reserved.
  7. //
  8. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
  9. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
  10. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
  11. // PARTICULAR PURPOSE.
  12. //---------------------------------------------------------------------------
  13. //---------------------------------------------------------------------------
  14. // Constants
  15. //---------------------------------------------------------------------------
  16. #define SPR_brdINLEFT       0x0001
  17. #define SPR_brdINTOP        0x0002
  18. #define SPR_brdINRIGHT      0x0004
  19. #define SPR_brdINBOTTOM     0x0008
  20. #define SPR_brdIN           0x000F
  21. #define SPR_brdOUTLEFT      0x0010
  22. #define SPR_brdOUTTOP       0x0020
  23. #define SPR_brdOUTRIGHT     0x0040
  24. #define SPR_brdOUTBOTTOM    0x0080
  25. #define SPR_brdOUT          0x00F0
  26. #define SPR_brdALL          0x00FF
  27. #define SPR_brdLEFT         0x0011
  28. #define SPR_brdTOP          0x0022
  29. #define SPR_brdRIGHT        0x0044
  30. #define SPR_brdBOTTOM       0x0088
  31. #define MAS_X               0x0001
  32. #define MAS_Y               0x0002
  33. #define MAS_POS             0x0004
  34. #define MAS_VEL             0x0008
  35. #define MAS_ACCEL           0x0010
  36. #define MAS_RECIPDIST       0x0020
  37. #define MAS_REMEMBER        0x0080
  38. //---------------------------------------------------------------------------
  39. // Macros
  40. //---------------------------------------------------------------------------
  41. #define tickOFSEC(sec)              ((int)(20*(sec)))
  42. #define PuserDEREF(type, pspr)      ((type)((pspr)->m_bUser))
  43. #define SPRITEOFI(psprite)          ((CSprite *)(void *)(psprite))
  44. //---------------------------------------------------------------------------
  45. // Typedefs
  46. //---------------------------------------------------------------------------
  47. class CDisplay;
  48. class CSpriteClass;
  49. class CSprite;
  50. typedef UINT BRD;
  51. typedef WORD IDBMP;
  52. typedef struct tagIMG *PIMG;
  53. typedef void (*PFNCOLLIDE)(CSprite *, CSprite *, int);
  54. #define FLOAT float
  55. #define FULLOFFLOAT(r8)   ((long)((r8) * (FLOAT)0x10000))
  56. #define FLOATOFFULL(i4)   ((FLOAT)(i4) / (FLOAT)0x10000)
  57. #define FIXED(full, sub, super) 
  58.   union                         
  59.     {                           
  60.     long full;                  
  61.     struct                      
  62.       {                         
  63.       USHORT sub;               
  64.       SHORT super;              
  65.       };                        
  66.     }
  67. //---------------------------------------------------------------------------
  68. // Image description
  69. //---------------------------------------------------------------------------
  70. typedef struct tagIMG
  71.   {
  72.   int   iimgNext;
  73.   int   x,  y;
  74.   int   cx, cy;
  75.   PIMG  pimgNext;
  76.   } IMG;
  77. #define iimgNONE      (-1)
  78. #define iimgREMOVE    (-2)
  79. //---------------------------------------------------------------------------
  80. // Display surface for sprites
  81. //---------------------------------------------------------------------------
  82. class CDisplay
  83.   {
  84.   friend class CSprite;
  85.   friend class CSpriteClass;
  86. public:
  87.   CDisplay(HINSTANCE hinst, HWND hwnd, HDC hdc, IUnknown *pparent, PFNCOLLIDE pfncollide, int cimg, PIMG prgimg, UINT idbmp);
  88.   ~CDisplay(void);
  89.   void DestroyAll(void);
  90.   void Timer(void);
  91.   void Paint(HDC hdc);
  92.   void Refresh(void);
  93.   void SetBackColor(COLORREF c);
  94.   void FireCollide(CSprite *psprLowId, CSprite *psprHighId, int);
  95.   HINSTANCE  m_hinst;
  96.   HWND       m_hwnd;
  97.   HDC        m_hdc;
  98.   int        m_cx, m_cy;
  99.   PFNCOLLIDE m_pfnCollide;    // Routine to handle spr collisions
  100.   CSprite   *m_psprFirst;
  101.   CSprite   *m_psprLast;
  102.   IUnknown  *m_punkParent;    // For get_Parent() on SpriteClass
  103.   COLORREF   m_colorBack;
  104.   HBRUSH    m_hbrushBack;
  105. protected:
  106.   int       m_cimg;
  107.   int       m_csc;
  108.   PIMG      m_prgimg;
  109.   IDBMP     m_idbmp;
  110.   HBITMAP   m_hbmp;
  111.   // DEBUG info
  112.   #define SIG_Display 'Disp'
  113.   DECLARE_SIGNATURE(SIG_Display);
  114.   };
  115. //---------------------------------------------------------------------------
  116. // Class description of different types of sprites
  117. //---------------------------------------------------------------------------
  118. class CSpriteClass : public ISpriteClass, public COleAuto,
  119.                      public IProvideClassInfo, public IConnectionPointContainer
  120.   {
  121.   friend class CDisplay;
  122.   friend class CSprite;
  123. public:
  124.   // *** Constructor/Destructor methods ***
  125.   static HRESULT Create(CDisplay *pdisp, CSpriteClass **ppscOut);
  126.   CSpriteClass(CDisplay *pdisp);
  127.   ~CSpriteClass(void);
  128.   void Close(void);
  129.   // *** Event methods ***
  130.   void FireInit(  CSprite *pspr, VARIANT *pvarUser);
  131.   void FireTick(  CSprite *pspr);
  132.   void FireBorder(CSprite *pspr, BRD brd);
  133.   void FireTerm(  CSprite *pspr);
  134.   void FireLastTerm(void);
  135.   // *** IUnknown methods ***
  136.   STDMETHOD(QueryInterface)(REFIID iid, void** ppvObjOut);
  137.   STDMETHOD_(ULONG, AddRef)(void);
  138.   STDMETHOD_(ULONG, Release)(void);
  139.   inline IUnknown  *GetUnknown(void)  {return (ISpriteClass *)this;};
  140.   inline IDispatch *GetDispatch(void) {return (ISpriteClass *)this;};
  141.   // *** IDispatch methods ***
  142.   DECLARE_STANDARD_DISPATCH();
  143.   // Override required by COleAuto:
  144.   virtual ITypeInfo **GetTinfoClsAddr(void) { return &g_ptinfoClsSpriteClass; };
  145.   virtual ITypeInfo **GetTinfoIntAddr(void) { return &g_ptinfoIntSpriteClass; };
  146.   virtual HRESULT GetTypeLibInfo(HINSTANCE *phinstOut, const GUID **pplibidOut, 
  147.                                  SHORT *pwMajLibOut, SHORT *pwMinLibOut,
  148.                                  const CLSID **ppclsidOut, const IID **ppiidOut,
  149.                                  ITypeLib ***ppptlOut);
  150.   virtual IDispatch *GetPrimary() {return this->GetDispatch(); };
  151.   // *** ISpriteClass methods ***
  152.   STDMETHOD(get_Application)(ISpruuidsApp** ppRet);
  153.   STDMETHOD(get_Parent)(IGame** ppRet);
  154.   STDMETHOD(CreateSprite)(int x, int y, VARIANT arg, ISprite** ppRet);
  155.   STDMETHOD(get_Tag)(VARIANT* pRet);
  156.   STDMETHOD(put_Tag)(VARIANT val);
  157.   STDMETHOD(get_Image)(int* pRet);
  158.   STDMETHOD(put_Image)(int val);
  159.   STDMETHOD(get_Border)(int* pRet);
  160.   STDMETHOD(put_Border)(int val);
  161.   STDMETHOD(get_Collide)(int* pRet);
  162.   STDMETHOD(put_Collide)(int val);
  163.   STDMETHOD(get_MaximumVelocity)(float* pRet);
  164.   STDMETHOD(put_MaximumVelocity)(float val);
  165.   STDMETHOD(get_Friction)(float* pRet);
  166.   STDMETHOD(put_Friction)(float val);
  167.   STDMETHOD(get_MaximumAcceleration)(float* pRet);
  168.   STDMETHOD(put_MaximumAcceleration)(float val);
  169.   STDMETHOD(get_AccelerationFriction)(float* pRet);
  170.   STDMETHOD(put_AccelerationFriction)(float val);
  171.   STDMETHOD(get_SpriteCount)(int* pRet);
  172.   // *** IProvideClassInfo methods ***
  173.   STDMETHOD(GetClassInfo)(ITypeInfo** pptinfoOut);
  174.   // *** IProvideClassInfo2 methods ***
  175.   STDMETHOD(GetGUID)(DWORD dwGuidKind, GUID* pGUID);
  176.   // *** IConnectionPointContainer methods ***
  177.   STDMETHOD(EnumConnectionPoints)(LPENUMCONNECTIONPOINTS* ppEnum);
  178.   STDMETHOD(FindConnectionPoint)(REFIID iid, LPCONNECTIONPOINT* ppCP);
  179.   class XCP : public IConnectionPoint
  180.     {
  181.     public:
  182.     XCP();
  183.     void Close(void);
  184.     // *** IUnknown methods ***
  185.     STDMETHOD(QueryInterface)(REFIID iid, void** ppvObjOut);
  186.     STDMETHOD_(ULONG, AddRef)(void);
  187.     STDMETHOD_(ULONG, Release)(void);
  188.     inline IUnknown *GetUnknown(void) {return (IConnectionPoint *)this;};
  189.     // *** IConnectionPoint methods ***
  190.     STDMETHOD(GetConnectionInterface)(IID* piid);
  191.     STDMETHOD(GetConnectionPointContainer)(IConnectionPointContainer** ppCPC);
  192.     STDMETHOD(Advise)(IUnknown* punkSink, DWORD* pdwCookie);
  193.     STDMETHOD(Unadvise)(DWORD dwCookie);
  194.     STDMETHOD(EnumConnections)(LPENUMCONNECTIONS* ppEnum);
  195.     // *** Member Variables ***
  196.     ULONG     m_cref;
  197. #define SC_cADVISE 5
  198.     IDispatch *m_rgpdisp[SC_cADVISE];     // Array of pdisps to call.
  199.     } m_cp;
  200.   // *** Member Variables ***
  201.   CDisplay *m_pdisp;
  202.   int       m_id;
  203.   int       m_brd;         // Mask indicates which borders to check collision with
  204.   int       m_maskCollide; // Mask indicates which other sprites can collide with
  205.   int       m_iimg;
  206.   int       m_cspr;
  207.   VARIANT   m_varTag;
  208.   FLOAT     m_friction;
  209.   FLOAT     m_frictionAccel;
  210.   BOOL      m_fFrictionAccel;
  211.   ULONG     m_cref;
  212.   FIXED(    m_vFullMax, m_vSubMax, m_vMax);
  213.   FIXED(    m_aFullMax, m_aSubMax, m_aMax);
  214. private:
  215.   // DEBUG info
  216.   static HRESULT s_hr;
  217.   #define SIG_SpriteClass 'SCls'
  218.   DECLARE_SIGNATURE(SIG_SpriteClass);
  219.   };
  220. //---------------------------------------------------------------------------
  221. // Definition of sprite
  222. //---------------------------------------------------------------------------
  223. class CSprite : ISprite, COleAuto
  224.   {
  225.   friend class CDisplay;
  226.   friend class CSpriteClass;
  227. public:
  228.   // *** Constructor/Destructor methods ***
  229.   CSprite(CSpriteClass *psc, int x, int y, CSprite *psprPrev, VARIANT *pvarUser);
  230.   ~CSprite();
  231.   // *** General Routines ***
  232.   CSprite *PsprMutate(CSpriteClass *psc, VARIANT *pvarUser);
  233.   void MarkFree();
  234.   BOOL MoveToFull(long xFull,  long yFull,  BOOL fCollide);
  235.   BOOL MoveByFull(long dxFull, long dyFull, BOOL fCollide);
  236.   BOOL DoMoveAt(CSprite *psprAt, float dMax, float scale, long flags, BOOL fCollide);
  237.   // *** IUnknown methods ***
  238.   STDMETHOD(QueryInterface)(REFIID riid, void** ppvObj);
  239.   STDMETHOD_(ULONG, AddRef)(void);
  240.   STDMETHOD_(ULONG, Release)(void);
  241.   inline IUnknown  *GetUnknown(void)  {return (ISprite *)this;};
  242.   inline IDispatch *GetDispatch(void) {return (ISprite *)this;};
  243.   // *** IDispatch methods ***
  244.   DECLARE_STANDARD_DISPATCH();
  245.   // Override required by COleAuto:
  246.   virtual ITypeInfo **GetTinfoClsAddr(void) { return &g_ptinfoClsSprite; };
  247.   virtual ITypeInfo **GetTinfoIntAddr(void) { return &g_ptinfoIntSprite; };
  248.   virtual HRESULT GetTypeLibInfo(HINSTANCE *phinstOut, const GUID **pplibidOut, 
  249.                                  SHORT *pwMajLibOut, SHORT *pwMinLibOut,
  250.                                  const CLSID **ppclsidOut, const IID **ppiidOut,
  251.                                  ITypeLib ***ppptlOut);
  252.   virtual IDispatch *GetPrimary() {return this->GetDispatch(); };
  253.   // *** ISprite methods ***
  254.   STDMETHOD(get_Application)(ISpruuidsApp** ppRet);
  255.   STDMETHOD(get_Parent)(ISpriteClass** ppRet);
  256.   STDMETHOD(MoveTo)(FLOAT x, FLOAT y);
  257.   STDMETHOD(MoveBy)(FLOAT dx, FLOAT dy);
  258.   STDMETHOD(MoveAtSprite)(ISprite *sprite, FLOAT dMax, FLOAT scale, long flags);
  259.   STDMETHOD(Remove)(void);
  260.   STDMETHOD(Refresh)(void);
  261.   STDMETHOD(IgnoreMove)(void);
  262.   STDMETHOD(get_Left)(FLOAT* pRet);
  263.   STDMETHOD(put_Left)(FLOAT val);
  264.   STDMETHOD(get_Top)(FLOAT* pRet);
  265.   STDMETHOD(put_Top)(FLOAT val);
  266.   STDMETHOD(get_Vx)(FLOAT* pRet);
  267.   STDMETHOD(put_Vx)(FLOAT val);
  268.   STDMETHOD(get_Vy)(FLOAT* pRet);
  269.   STDMETHOD(put_Vy)(FLOAT val);
  270.   STDMETHOD(get_Ax)(FLOAT* pRet);
  271.   STDMETHOD(put_Ax)(FLOAT val);
  272.   STDMETHOD(get_Ay)(FLOAT* pRet);
  273.   STDMETHOD(put_Ay)(FLOAT val);
  274.   STDMETHOD(get_FrictionX)(FLOAT* pRet);
  275.   STDMETHOD(put_FrictionX)(FLOAT val);
  276.   STDMETHOD(get_FrictionY)(FLOAT* pRet);
  277.   STDMETHOD(put_FrictionY)(FLOAT val);
  278.   STDMETHOD(get_Image)(int* pRet);
  279.   STDMETHOD(put_Image)(int val);
  280.   STDMETHOD(get_TickMove)(int* pRet);
  281.   STDMETHOD(put_TickMove)(int val);
  282.   STDMETHOD(get_TickEvent)(int* pRet);
  283.   STDMETHOD(put_TickEvent)(int val);
  284.   STDMETHOD(get_Visible)(VARIANT_BOOL* pRet);
  285.   STDMETHOD(put_Visible)(VARIANT_BOOL val);
  286.   STDMETHOD(get_Tag)(VARIANT* pRet);
  287.   STDMETHOD(put_Tag)(VARIANT val);
  288.   STDMETHOD(get_Width)(int* pRet);
  289.   STDMETHOD(get_Height)(int* pRet);
  290.   // *** Member Variables ***
  291.   CDisplay     *m_pdisp;
  292.   CSpriteClass *m_psc;
  293.   CSprite      *m_psprNext;
  294.   CSprite      *m_psprPrev;
  295.   FIXED(       m_xFull,  m_xSub,  m_x);
  296.   FIXED(       m_yFull,  m_ySub,  m_y);
  297.   FIXED(       m_vxFull, m_vxSub, m_vx);
  298.   FIXED(       m_vyFull, m_vySub, m_vy);
  299.   FIXED(       m_axFull, m_axSub, m_ax);
  300.   FIXED(       m_ayFull, m_aySub, m_ay);
  301.   BOOL         m_fFriction;
  302.   FLOAT        m_fx;    // Friction
  303.   FLOAT        m_fy;
  304.   long         m_tickEvt, m_tickEvtMax, m_tickMove, m_tickMoveMax;
  305.   int          m_iimg;
  306.   PIMG         m_pimg;
  307.   VARIANT      m_varTag;
  308.   // Support for MoveAtSprite()
  309.   CSprite     *m_psprAt;
  310.   float        m_dMaxAt;
  311.   float        m_scaleAt;
  312.   long         m_flagsAt;
  313. protected:
  314.   // *** Internal Routines ***
  315.   BOOL _FDraw(BOOL fCollide);
  316.   void _Erase();
  317.   void _Link();
  318.   void _Unlink(BOOL fFireEvt);
  319.   // *** Member Variables ***
  320.   BOOL    m_fNeedRefresh:1;
  321.   BOOL    m_fFree:1;
  322.   BOOL    m_fIgnoreMove:1;
  323.   BOOL    m_fLinked:1;
  324.   BOOL    m_fHidden;            // 2 = Implicitly hidden for _Init event
  325.   ULONG   m_cref;
  326.   // DEBUG info
  327.   #define SIG_Sprite 'Spr '
  328.   DECLARE_SIGNATURE(SIG_Sprite);
  329.   };
  330. //--- EOF -------------------------------------------------------------------