home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 December / PCWKCD1296.iso / vjplusb / activex / inetsdk / samples / axscript / spruuids / src / spr.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-15  |  13.0 KB  |  376 lines

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