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

  1. //---------------------------------------------------------------------------
  2. // SprOA.cpp
  3. //---------------------------------------------------------------------------
  4. // Sprite handler, OLE Automation support
  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. #include "Main.h"
  15. #include "Spr.h"
  16. #include "DispIDs.h"
  17. #include <math.h>
  18.  
  19.  
  20. //---------------------------------------------------------------------------
  21. // DEBUG info
  22. //---------------------------------------------------------------------------
  23. SZTHISFILE
  24.  
  25.  
  26. //***************************************************************************
  27. //***************************************************************************
  28. //**
  29. //**  SpriteClass Class
  30. //**
  31. //***************************************************************************
  32. //***************************************************************************
  33.  
  34.  
  35. //***************************************************************************
  36. // Fire ISpriteClassEvents Events
  37. //***************************************************************************
  38.  
  39. //---------------------------------------------------------------------------
  40. // 
  41. //---------------------------------------------------------------------------
  42. void CSpriteClass::FireInit
  43. (
  44.   CSprite *pspr,
  45.   VARIANT *pvarUser
  46. )
  47. {
  48.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  49.   VARIANTARG  var[2];
  50.  
  51.   VariantInit(&var[1]);
  52.   var[1].vt = VT_DISPATCH;
  53.   var[1].pdispVal = pspr->GetDispatch();
  54.   pspr->AddRef();
  55.   VariantInit(&var[0]);
  56.   VariantCopy(&var[0], pvarUser);
  57.  
  58.   for (; ppdisp < &m_cp.m_rgpdisp[SC_cADVISE]; ppdisp++)
  59.     if (*ppdisp)
  60.       InvokeEvent(*ppdisp, DISPID_SpriteClassEvents_Init, var, 2);
  61.  
  62.   pspr->Release();    // For var[1].pdispVal
  63.   VariantClear(&var[0]);
  64. }
  65.  
  66.  
  67. //---------------------------------------------------------------------------
  68. // 
  69. //---------------------------------------------------------------------------
  70. void CSpriteClass::FireTick
  71. (
  72.   CSprite *pspr
  73. )
  74. {
  75.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  76.   VARIANTARG  var[1];
  77.  
  78.   VariantInit(&var[0]);
  79.   var[0].vt = VT_DISPATCH;
  80.   var[0].pdispVal = pspr->GetDispatch();
  81.   pspr->AddRef();
  82.  
  83.   for (; ppdisp < &m_cp.m_rgpdisp[SC_cADVISE]; ppdisp++)
  84.     if (*ppdisp)
  85.       InvokeEvent(*ppdisp, DISPID_SpriteClassEvents_Tick, var, 1);
  86.  
  87.   pspr->Release();    // For var[0].pdispVal
  88. }
  89.  
  90.  
  91. //---------------------------------------------------------------------------
  92. // 
  93. //---------------------------------------------------------------------------
  94. void CSpriteClass::FireBorder
  95. (
  96.   CSprite *pspr,
  97.   BRD      brd
  98. )
  99. {
  100.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  101.   VARIANTARG  var[2];
  102.  
  103.   VariantInit(&var[1]);
  104.   var[1].vt = VT_DISPATCH;
  105.   var[1].pdispVal = pspr->GetDispatch();
  106.   pspr->AddRef();
  107.   VariantInit(&var[0]);
  108.   var[0].vt = VT_I4;
  109.   var[0].lVal = brd;
  110.  
  111.   for (; ppdisp < &m_cp.m_rgpdisp[SC_cADVISE]; ppdisp++)
  112.     if (*ppdisp)
  113.       {
  114.       BOOL f;
  115.       HRESULT hr = InvokeEvent(*ppdisp, DISPID_SpriteClassEvents_Border, var, 2);
  116.       if (hr)
  117.         f = TRUE;
  118.       }
  119.  
  120.   pspr->Release();    // For var[1].pdispVal
  121. }
  122.  
  123.  
  124. //---------------------------------------------------------------------------
  125. // 
  126. //---------------------------------------------------------------------------
  127. void CSpriteClass::FireTerm
  128. (
  129.   CSprite *pspr
  130. )
  131. {
  132.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  133.   VARIANTARG  var[1];
  134.  
  135.   VariantInit(&var[0]);
  136.   var[0].vt = VT_DISPATCH;
  137.   var[0].pdispVal = pspr->GetDispatch();
  138.   pspr->AddRef();
  139.  
  140.   for (; ppdisp < &m_cp.m_rgpdisp[SC_cADVISE]; ppdisp++)
  141.     if (*ppdisp)
  142.       InvokeEvent(*ppdisp, DISPID_SpriteClassEvents_Term, var, 1);
  143.  
  144.   pspr->Release();    // For var[0].pdispVal
  145. }
  146.  
  147.  
  148. //---------------------------------------------------------------------------
  149. // 
  150. //---------------------------------------------------------------------------
  151. void CSpriteClass::FireLastTerm
  152. (
  153.   void
  154. )
  155. {
  156.   IDispatch **ppdisp = m_cp.m_rgpdisp;
  157.  
  158.   for (; ppdisp < &m_cp.m_rgpdisp[SC_cADVISE]; ppdisp++)
  159.     if (*ppdisp)
  160.       InvokeEvent(*ppdisp, DISPID_SpriteClassEvents_LastTerm, NULL, 0);
  161. }
  162.  
  163.  
  164. //***************************************************************************
  165. // ISpriteClass Interface
  166. //***************************************************************************
  167.  
  168. //---------------------------------------------------------------------------
  169. // 
  170. //---------------------------------------------------------------------------
  171. STDMETHODIMP CSpriteClass::get_Application
  172. (
  173.   ISpruuidsApp** ppRet
  174. )
  175. {
  176.   if (!ppRet)
  177.     return E_INVALIDARG;
  178.   return g_punkApplicationNA->QueryInterface(IID_ISpruuidsApp, (void **)ppRet);
  179. }
  180.  
  181.  
  182. //---------------------------------------------------------------------------
  183. // 
  184. //---------------------------------------------------------------------------
  185. STDMETHODIMP CSpriteClass::get_Parent
  186. (
  187.   IGame** ppRet
  188. )
  189. {
  190.   if (!ppRet)
  191.     return E_INVALIDARG;
  192.   return m_pdisp->m_punkParent->QueryInterface(IID_IGame, (void **)ppRet);
  193. }
  194.  
  195.  
  196. //---------------------------------------------------------------------------
  197. // 
  198. //---------------------------------------------------------------------------
  199. STDMETHODIMP CSpriteClass::CreateSprite
  200. (
  201.   int       x,
  202.   int       y,
  203.   VARIANT   arg,
  204.   ISprite **ppRet
  205. )
  206. {
  207.   CSprite *pspr = new CSprite(this, x, y, NULL, &arg);
  208.   if (!pspr)
  209.     return E_OUTOFMEMORY;
  210.   *ppRet = pspr;
  211.   (*ppRet)->AddRef();
  212.   return S_OK;
  213. }
  214.  
  215.  
  216. //---------------------------------------------------------------------------
  217. // 
  218. //---------------------------------------------------------------------------
  219. STDMETHODIMP CSpriteClass::get_Tag
  220. (
  221.   VARIANT* pRet
  222. )
  223. {
  224.   if (!pRet)
  225.     return E_INVALIDARG;
  226.   VariantInit(pRet);
  227.   return VariantCopy(pRet, &m_varTag);
  228. }
  229.  
  230.  
  231. //---------------------------------------------------------------------------
  232. // 
  233. //---------------------------------------------------------------------------
  234. STDMETHODIMP CSpriteClass::put_Tag
  235. (
  236.   VARIANT val
  237. )
  238. {
  239.   return VariantCopy(&m_varTag, &val);
  240. }
  241.  
  242.  
  243. //---------------------------------------------------------------------------
  244. // 
  245. //---------------------------------------------------------------------------
  246. STDMETHODIMP CSpriteClass::get_Image
  247. (
  248.   int* pRet
  249. )
  250. {
  251.   if (!pRet)
  252.     return E_INVALIDARG;
  253.   *pRet = m_iimg;
  254.   return S_OK;
  255. }
  256.  
  257.  
  258. //---------------------------------------------------------------------------
  259. // 
  260. //---------------------------------------------------------------------------
  261. STDMETHODIMP CSpriteClass::put_Image
  262. (
  263.   int val
  264. )
  265. {
  266.   if (val > 0 && val < m_pdisp->m_cimg)
  267.     m_iimg = val;
  268.   return S_OK;
  269. }
  270.  
  271.  
  272. //---------------------------------------------------------------------------
  273. // 
  274. //---------------------------------------------------------------------------
  275. STDMETHODIMP CSpriteClass::get_Border
  276. (
  277.   int* pRet
  278. )
  279. {
  280.   if (!pRet)
  281.     return E_INVALIDARG;
  282.   *pRet = m_brd;
  283.   return S_OK;
  284. }
  285.  
  286.  
  287. //---------------------------------------------------------------------------
  288. // 
  289. //---------------------------------------------------------------------------
  290. STDMETHODIMP CSpriteClass::put_Border
  291. (
  292.   int val
  293. )
  294. {
  295.   m_brd = val;
  296.   return S_OK;
  297. }
  298.  
  299.  
  300. //---------------------------------------------------------------------------
  301. // 
  302. //---------------------------------------------------------------------------
  303. STDMETHODIMP CSpriteClass::get_Collide
  304. (
  305.   int* pRet
  306. )
  307. {
  308.   if (!pRet)
  309.     return E_INVALIDARG;
  310.   *pRet = m_maskCollide;
  311.   return S_OK;
  312. }
  313.  
  314.  
  315. //---------------------------------------------------------------------------
  316. // 
  317. //---------------------------------------------------------------------------
  318. STDMETHODIMP CSpriteClass::put_Collide
  319. (
  320.   int val
  321. )
  322. {
  323.   m_maskCollide = val;
  324.   return S_OK;
  325. }
  326.  
  327.  
  328. //---------------------------------------------------------------------------
  329. // 
  330. //---------------------------------------------------------------------------
  331. STDMETHODIMP CSpriteClass::get_MaximumVelocity
  332. (
  333.   FLOAT* pRet
  334. )
  335. {
  336.   if (!pRet)
  337.     return E_INVALIDARG;
  338.  
  339.   *pRet = FLOATOFFULL(m_vFullMax);
  340.   return S_OK;
  341. }
  342.  
  343.  
  344. //---------------------------------------------------------------------------
  345. // 
  346. //---------------------------------------------------------------------------
  347. STDMETHODIMP CSpriteClass::put_MaximumVelocity
  348. (
  349.   FLOAT val
  350. )
  351. {
  352.   m_vFullMax = FULLOFFLOAT(val);
  353.   return S_OK;
  354. }
  355.  
  356.  
  357. //---------------------------------------------------------------------------
  358. // 
  359. //---------------------------------------------------------------------------
  360. STDMETHODIMP CSpriteClass::get_Friction
  361. (
  362.   FLOAT* pRet
  363. )
  364. {
  365.   if (!pRet)
  366.     return E_INVALIDARG;
  367.   *pRet = m_friction;
  368.   return S_OK;
  369. }
  370.  
  371.  
  372. //---------------------------------------------------------------------------
  373. // 
  374. //---------------------------------------------------------------------------
  375. STDMETHODIMP CSpriteClass::put_Friction
  376. (
  377.   FLOAT val
  378. )
  379. {
  380.   m_friction = val;
  381.   return S_OK;
  382. }
  383.  
  384.  
  385. //---------------------------------------------------------------------------
  386. // 
  387. //---------------------------------------------------------------------------
  388. STDMETHODIMP CSpriteClass::get_MaximumAcceleration
  389. (
  390.   FLOAT* pRet
  391. )
  392. {
  393.   if (!pRet)
  394.     return E_INVALIDARG;
  395.  
  396.   *pRet = FLOATOFFULL(m_aFullMax);
  397.   return S_OK;
  398. }
  399.  
  400.  
  401. //---------------------------------------------------------------------------
  402. // 
  403. //---------------------------------------------------------------------------
  404. STDMETHODIMP CSpriteClass::put_MaximumAcceleration
  405. (
  406.   FLOAT val
  407. )
  408. {
  409.   m_aFullMax = FULLOFFLOAT(val);
  410.   return S_OK;
  411. }
  412.  
  413.  
  414. //---------------------------------------------------------------------------
  415. // 
  416. //---------------------------------------------------------------------------
  417. STDMETHODIMP CSpriteClass::get_AccelerationFriction
  418. (
  419.   FLOAT* pRet
  420. )
  421. {
  422.   if (!pRet)
  423.     return E_INVALIDARG;
  424.   *pRet = m_frictionAccel;
  425.   return S_OK;
  426. }
  427.  
  428.  
  429. //---------------------------------------------------------------------------
  430. // 
  431. //---------------------------------------------------------------------------
  432. STDMETHODIMP CSpriteClass::put_AccelerationFriction
  433. (
  434.   FLOAT val
  435. )
  436. {
  437.   m_frictionAccel = val;
  438.   m_fFrictionAccel = (val != (FLOAT)1.0);
  439.   return S_OK;
  440. }
  441.  
  442.  
  443. //---------------------------------------------------------------------------
  444. // 
  445. //---------------------------------------------------------------------------
  446. STDMETHODIMP CSpriteClass::get_SpriteCount
  447. (
  448.   int* pRet
  449. )
  450. {
  451.   if (!pRet)
  452.     return E_INVALIDARG;
  453.   *pRet = m_cspr;
  454.   return S_OK;
  455. }
  456.  
  457.  
  458.  
  459. //***************************************************************************
  460. //***************************************************************************
  461. //**
  462. //**  Sprite Class
  463. //**
  464. //***************************************************************************
  465. //***************************************************************************
  466.  
  467.  
  468. //***************************************************************************
  469. // ISprite Interface
  470. //***************************************************************************
  471.  
  472. //---------------------------------------------------------------------------
  473. // 
  474. //---------------------------------------------------------------------------
  475. STDMETHODIMP CSprite::get_Application
  476. (
  477.   ISpruuidsApp** ppRet
  478. )
  479. {
  480.   if (!ppRet)
  481.     return E_INVALIDARG;
  482.   return g_punkApplicationNA->QueryInterface(IID_ISpruuidsApp, (void **)ppRet);
  483. }
  484.  
  485.  
  486. //---------------------------------------------------------------------------
  487. // 
  488. //---------------------------------------------------------------------------
  489. STDMETHODIMP CSprite::get_Parent
  490. (
  491.   ISpriteClass** ppRet
  492. )
  493. {
  494.   if (!ppRet)
  495.     return E_INVALIDARG;
  496.   return m_psc->QueryInterface(IID_ISpriteClass, (void **)ppRet);
  497. }
  498.  
  499.  
  500. //---------------------------------------------------------------------------
  501. // 
  502. //---------------------------------------------------------------------------
  503. STDMETHODIMP CSprite::MoveTo
  504. (
  505.   FLOAT x,
  506.   FLOAT y
  507. )
  508. {
  509.   this->MoveToFull(FULLOFFLOAT(x), FULLOFFLOAT(y), TRUE);
  510.   return S_OK;
  511. }
  512.  
  513.  
  514. //---------------------------------------------------------------------------
  515. // 
  516. //---------------------------------------------------------------------------
  517. STDMETHODIMP CSprite::MoveBy
  518. (
  519.   FLOAT dx,
  520.   FLOAT dy
  521. )
  522. {
  523.   this->MoveByFull(FULLOFFLOAT(dx), FULLOFFLOAT(dy), TRUE);
  524.   return S_OK;
  525. }
  526.  
  527.  
  528.  
  529. //---------------------------------------------------------------------------
  530. //
  531. //---------------------------------------------------------------------------
  532. STDMETHODIMP CSprite::MoveAtSprite
  533. (
  534.   ISprite* sprite,
  535.   float    dMax,
  536.   float    scale,
  537.   long     flags
  538. )
  539. {
  540.   if (!sprite)
  541.     return E_INVALIDARG;
  542.  
  543.   // Store parameters & do every tickMove ticks if MAS_REMEMBER set.
  544.   if (flags & MAS_REMEMBER)
  545.     {
  546.     if (m_psprAt)
  547.       {
  548.       m_psprAt->Release();
  549.       m_psprAt = NULL;
  550.       }
  551.     m_psprAt = (CSprite *)(void *)sprite;
  552.     if (!m_psprAt)
  553.       return S_OK;
  554.     m_psprAt->AddRef();
  555.     m_dMaxAt = dMax;
  556.     m_scaleAt = scale;
  557.     m_flagsAt = flags;
  558.     return S_OK;
  559.     }
  560.  
  561.   // Otherwise, do this right now.
  562.   this->DoMoveAt((CSprite *)(void *)sprite, dMax, scale, flags, FALSE);
  563.   return S_OK;
  564. }
  565.  
  566.  
  567.  
  568. //---------------------------------------------------------------------------
  569. // 
  570. //---------------------------------------------------------------------------
  571. STDMETHODIMP CSprite::Remove
  572. (
  573.   void 
  574. )
  575. {
  576.   this->MarkFree();
  577.   return S_OK;
  578. }
  579.  
  580.  
  581. //---------------------------------------------------------------------------
  582. // 
  583. //---------------------------------------------------------------------------
  584. STDMETHODIMP CSprite::Refresh
  585. (
  586.   void 
  587. )
  588. {
  589.   this->_FDraw(FALSE);
  590.   return S_OK;
  591. }
  592.  
  593.  
  594. //---------------------------------------------------------------------------
  595. // 
  596. //---------------------------------------------------------------------------
  597. STDMETHODIMP CSprite::IgnoreMove
  598. (
  599.   void 
  600. )
  601. {
  602.   m_fIgnoreMove = TRUE;
  603.   return S_OK;
  604. }
  605.  
  606.  
  607. //---------------------------------------------------------------------------
  608. // 
  609. //---------------------------------------------------------------------------
  610. STDMETHODIMP CSprite::get_Left
  611. (
  612.   FLOAT* pRet
  613. )
  614. {
  615.   if (!pRet)
  616.     return E_INVALIDARG;
  617.  
  618.   *pRet = FLOATOFFULL(m_xFull);
  619.   return S_OK;
  620. }
  621.  
  622.  
  623. //---------------------------------------------------------------------------
  624. // 
  625. //---------------------------------------------------------------------------
  626. STDMETHODIMP CSprite::put_Left
  627. (
  628.   FLOAT val
  629. )
  630. {
  631.   m_xFull = FULLOFFLOAT(val);
  632.   return S_OK;
  633. }
  634.  
  635.  
  636. //---------------------------------------------------------------------------
  637. // 
  638. //---------------------------------------------------------------------------
  639. STDMETHODIMP CSprite::get_Top
  640. (
  641.   FLOAT* pRet
  642. )
  643. {
  644.   if (!pRet)
  645.     return E_INVALIDARG;
  646.  
  647.   *pRet = FLOATOFFULL(m_yFull);
  648.   return S_OK;
  649. }
  650.  
  651.  
  652. //---------------------------------------------------------------------------
  653. // 
  654. //---------------------------------------------------------------------------
  655. STDMETHODIMP CSprite::put_Top
  656. (
  657.   FLOAT val
  658. )
  659. {
  660.   m_yFull = FULLOFFLOAT(val);
  661.   return S_OK;
  662. }
  663.  
  664.  
  665. //---------------------------------------------------------------------------
  666. // 
  667. //---------------------------------------------------------------------------
  668. STDMETHODIMP CSprite::get_Vx
  669. (
  670.   FLOAT* pRet
  671. )
  672. {
  673.   if (!pRet)
  674.     return E_INVALIDARG;
  675.  
  676.   *pRet = FLOATOFFULL(m_vxFull);
  677.   return S_OK;
  678. }
  679.  
  680.  
  681. //---------------------------------------------------------------------------
  682. // 
  683. //---------------------------------------------------------------------------
  684. STDMETHODIMP CSprite::put_Vx
  685. (
  686.   FLOAT val
  687. )
  688. {
  689.   m_vxFull = FULLOFFLOAT(val);
  690.   return S_OK;
  691. }
  692.  
  693.  
  694. //---------------------------------------------------------------------------
  695. // 
  696. //---------------------------------------------------------------------------
  697. STDMETHODIMP CSprite::get_Vy
  698. (
  699.   FLOAT* pRet
  700. )
  701. {
  702.   if (!pRet)
  703.     return E_INVALIDARG;
  704.  
  705.   *pRet = FLOATOFFULL(m_vyFull);
  706.   return S_OK;
  707. }
  708.  
  709.  
  710. //---------------------------------------------------------------------------
  711. // 
  712. //---------------------------------------------------------------------------
  713. STDMETHODIMP CSprite::put_Vy
  714. (
  715.   FLOAT val
  716. )
  717. {
  718.   m_vyFull = FULLOFFLOAT(val);
  719.   return S_OK;
  720. }
  721.  
  722.  
  723. //---------------------------------------------------------------------------
  724. // 
  725. //---------------------------------------------------------------------------
  726. STDMETHODIMP CSprite::get_Ax
  727. (
  728.   FLOAT* pRet
  729. )
  730. {
  731.   if (!pRet)
  732.     return E_INVALIDARG;
  733.  
  734.   *pRet = FLOATOFFULL(m_axFull);
  735.   return S_OK;
  736. }
  737.  
  738.  
  739. //---------------------------------------------------------------------------
  740. // 
  741. //---------------------------------------------------------------------------
  742. STDMETHODIMP CSprite::put_Ax
  743. (
  744.   FLOAT val
  745. )
  746. {
  747.   m_axFull = FULLOFFLOAT(val);
  748.   return S_OK;
  749. }
  750.  
  751.  
  752. //---------------------------------------------------------------------------
  753. // 
  754. //---------------------------------------------------------------------------
  755. STDMETHODIMP CSprite::get_Ay
  756. (
  757.   FLOAT* pRet
  758. )
  759. {
  760.   if (!pRet)
  761.     return E_INVALIDARG;
  762.  
  763.   *pRet = FLOATOFFULL(m_ayFull);
  764.   return S_OK;
  765. }
  766.  
  767.  
  768. //---------------------------------------------------------------------------
  769. // 
  770. //---------------------------------------------------------------------------
  771. STDMETHODIMP CSprite::put_Ay
  772. (
  773.   FLOAT val
  774. )
  775. {
  776.   m_ayFull = FULLOFFLOAT(val);
  777.   return S_OK;
  778. }
  779.  
  780.  
  781. //---------------------------------------------------------------------------
  782. // 
  783. //---------------------------------------------------------------------------
  784. STDMETHODIMP CSprite::get_FrictionX
  785. (
  786.   FLOAT* pRet
  787. )
  788. {
  789.   if (!pRet)
  790.     return E_INVALIDARG;
  791.  
  792.   *pRet = m_fx;
  793.   return S_OK;
  794. }
  795.  
  796.  
  797. //---------------------------------------------------------------------------
  798. // 
  799. //---------------------------------------------------------------------------
  800. STDMETHODIMP CSprite::put_FrictionX
  801. (
  802.   FLOAT val
  803. )
  804. {
  805.   m_fx = val;
  806.   m_fFriction = (m_fx != 1.0) || (m_fy != 1.0);
  807.   return S_OK;
  808. }
  809.  
  810.  
  811. //---------------------------------------------------------------------------
  812. // 
  813. //---------------------------------------------------------------------------
  814. STDMETHODIMP CSprite::get_FrictionY
  815. (
  816.   FLOAT* pRet
  817. )
  818. {
  819.   if (!pRet)
  820.     return E_INVALIDARG;
  821.  
  822.   *pRet = m_fy;
  823.   return S_OK;
  824. }
  825.  
  826.  
  827. //---------------------------------------------------------------------------
  828. // 
  829. //---------------------------------------------------------------------------
  830. STDMETHODIMP CSprite::put_FrictionY
  831. (
  832.   FLOAT val
  833. )
  834. {
  835.   m_fy = val;
  836.   m_fFriction = (m_fx != 1.0) || (m_fy != 1.0);
  837.   return S_OK;
  838. }
  839.  
  840.  
  841. //---------------------------------------------------------------------------
  842. // 
  843. //---------------------------------------------------------------------------
  844. STDMETHODIMP CSprite::get_Width
  845. (
  846.   int* pRet
  847. )
  848. {
  849.   if (!pRet)
  850.     return E_INVALIDARG;
  851.   *pRet = m_pimg->cx;
  852.   return S_OK;
  853. }
  854.  
  855.  
  856. //---------------------------------------------------------------------------
  857. // 
  858. //---------------------------------------------------------------------------
  859. STDMETHODIMP CSprite::get_Height
  860. (
  861.   int* pRet
  862. )
  863. {
  864.   if (!pRet)
  865.     return E_INVALIDARG;
  866.   *pRet = m_pimg->cy;
  867.   return S_OK;
  868. }
  869.  
  870.  
  871. //---------------------------------------------------------------------------
  872. // 
  873. //---------------------------------------------------------------------------
  874. STDMETHODIMP CSprite::get_Image
  875. (
  876.   int* pRet
  877. )
  878. {
  879.   if (!pRet)
  880.     return E_INVALIDARG;
  881.   *pRet = m_iimg;
  882.   return S_OK;
  883. }
  884.  
  885.  
  886. //---------------------------------------------------------------------------
  887. // 
  888. //---------------------------------------------------------------------------
  889. STDMETHODIMP CSprite::put_Image
  890. (
  891.   int val
  892. )
  893. {
  894.   if (val >= 0 && val < m_pdisp->m_cimg)
  895.     {
  896.     PIMG pimgCur = m_pimg;
  897.  
  898.     if (!m_fHidden)
  899.       this->_Erase();
  900.     m_iimg = val;
  901.     m_pimg = &(m_pdisp->m_prgimg[m_iimg]);
  902.     // Keep image centered, if Visible
  903.     if (!m_fHidden)
  904.       {
  905.       m_x += (pimgCur->cx - m_pimg->cx) >> 1;
  906.       m_y += (pimgCur->cy - m_pimg->cy) >> 1;
  907.       this->_FDraw(FALSE);
  908.       }
  909.     }
  910.   return S_OK;
  911. }
  912.  
  913.  
  914. //---------------------------------------------------------------------------
  915. // 
  916. //---------------------------------------------------------------------------
  917. STDMETHODIMP CSprite::get_TickMove
  918. (
  919.   int* pRet
  920. )
  921. {
  922.   if (!pRet)
  923.     return E_INVALIDARG;
  924.   *pRet = m_tickMoveMax;
  925.   return S_OK;
  926. }
  927.  
  928.  
  929. //---------------------------------------------------------------------------
  930. // 
  931. //---------------------------------------------------------------------------
  932. STDMETHODIMP CSprite::put_TickMove
  933. (
  934.   int val
  935. )
  936. {
  937.   m_tickMoveMax = val;
  938.   if (m_tickMove > m_tickMoveMax)
  939.     m_tickMove = m_tickMoveMax;
  940.   return S_OK;
  941. }
  942.  
  943.  
  944. //---------------------------------------------------------------------------
  945. // 
  946. //---------------------------------------------------------------------------
  947. STDMETHODIMP CSprite::get_TickEvent
  948. (
  949.   int* pRet
  950. )
  951. {
  952.   if (!pRet)
  953.     return E_INVALIDARG;
  954.   *pRet = m_tickEvtMax;
  955.   return S_OK;
  956. }
  957.  
  958.  
  959. //---------------------------------------------------------------------------
  960. // 
  961. //---------------------------------------------------------------------------
  962. STDMETHODIMP CSprite::put_TickEvent
  963. (
  964.   int val
  965. )
  966. {
  967.   m_tickEvtMax = val;
  968.   if (m_tickEvt > m_tickEvtMax)
  969.     m_tickEvt = m_tickEvtMax;
  970.   return S_OK;
  971. }
  972.  
  973.  
  974. //---------------------------------------------------------------------------
  975. // 
  976. //---------------------------------------------------------------------------
  977. STDMETHODIMP CSprite::get_Visible
  978. (
  979.   VARIANT_BOOL* pRet
  980. )
  981. {
  982.   if (!pRet)
  983.     return E_INVALIDARG;
  984.   *pRet = m_fHidden ? 0 : -1;
  985.   return S_OK;
  986. }
  987.  
  988.  
  989. //---------------------------------------------------------------------------
  990. // 
  991. //---------------------------------------------------------------------------
  992. STDMETHODIMP CSprite::put_Visible
  993. (
  994.   VARIANT_BOOL val
  995. )
  996. {
  997.   if (m_fLinked)
  998.     {
  999.     m_fHidden = !val;
  1000.     if (!m_fHidden)
  1001.       this->_Erase();
  1002.     else
  1003.       this->_FDraw(FALSE);
  1004.     }
  1005.   return S_OK;
  1006. }
  1007.  
  1008.  
  1009. //---------------------------------------------------------------------------
  1010. // 
  1011. //---------------------------------------------------------------------------
  1012. STDMETHODIMP CSprite::get_Tag
  1013. (
  1014.   VARIANT* pRet
  1015. )
  1016. {
  1017.   if (!pRet)
  1018.     return E_INVALIDARG;
  1019.   VariantInit(pRet);
  1020.   return VariantCopy(pRet, &m_varTag);
  1021. }
  1022.  
  1023.  
  1024. //---------------------------------------------------------------------------
  1025. // 
  1026. //---------------------------------------------------------------------------
  1027. STDMETHODIMP CSprite::put_Tag
  1028. (
  1029.   VARIANT val
  1030. )
  1031. {
  1032.   return VariantCopy(&m_varTag, &val);
  1033. }
  1034.  
  1035. //--- EOF -------------------------------------------------------------------
  1036.