home *** CD-ROM | disk | FTP | other *** search
/ Speelhal Klassiekers - Hits des Salles de Jeux / Arcade.bin / games / Xonix32 / SRC / XPOINT.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-04  |  4.8 KB  |  192 lines

  1.  
  2. //===========================
  3. // XPoint.cpp
  4. // by SA VanNess
  5. // 08 Mar 97
  6. // for the Win32 platform
  7. //===========================
  8. // Point-class objects
  9. // Class implementations
  10. //===========================
  11. // Copyright (C) 1997  SA VanNess
  12. // <savanness@pipeline.com>
  13. //
  14. // For copyright information, see the file gnu_license.txt included
  15. // with this source code distribution.
  16. //
  17. // This program is free software; you can redistribute it and/or modify
  18. // it under the terms of the GNU General Public License as published by
  19. // the Free Software Foundation; either version 2 of the License, or
  20. // (at your option) any later version.
  21. //
  22. // This program is distributed in the hope that it will be useful,
  23. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25. // GNU General Public License for more details.
  26. //
  27. // You should have received a copy of the GNU General Public License
  28. // along with this program; if not, write to the Free Software
  29. // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  30. //===========================
  31.  
  32. #include <afxwin.h>
  33. #include <afxcmn.h>
  34. #include <afxres.h>
  35.  
  36. #include "macros.h"
  37. #include "xbitmap.h"
  38. #include "xpoint.h"
  39.  
  40. //===========================
  41. // XPoint
  42.  
  43. //-----------------
  44. void XPoint::Randomize(CRect rc, UINT iMinD, UINT iMaxD)
  45. {
  46. x = (rand()%(rc.right-rc.left)) + rc.left;
  47. y = (rand()%(rc.bottom-rc.top)) + rc.top;
  48. dx = ((rand()%(iMaxD-iMinD+1)) + iMinD); if (rand()%2) dx = -dx;
  49. dy = ((rand()%(iMaxD-iMinD+1)) + iMinD); if (rand()%2) dy = -dy;
  50. }
  51.  
  52. //-----------------
  53. BOOL XPoint::Clip(CRect rc)
  54. {
  55. int xx=x+dx;
  56. int yy=y+dy;
  57.  
  58. if (xx < rc.left || xx >= rc.right) return TRUE;
  59. if (yy < rc.top || yy >= rc.bottom) return TRUE;
  60.  
  61. return FALSE;
  62. }
  63.  
  64. //-----------------
  65. BOOL XPoint::Update(XBitmap &xBmp)
  66. {
  67. //Black/blue boundary cld
  68. Incr();
  69.  
  70. if ((m_bBlueBase) == (BOOL)(xBmp.GetPixel(x,y)&XBC_BLUEGRN)) return FALSE;
  71.  
  72. //We hit a boundary, so backup and poke around
  73. int xx,yy;
  74. xx = x; yy = y;
  75. Decr();
  76. if ((m_bBlueBase) == (BOOL)(xBmp.GetPixel(x,yy)&XBC_BLUEGRN)) dx = -dx; //if new y is okay, flip x
  77. if ((m_bBlueBase) == (BOOL)(xBmp.GetPixel(xx,y)&XBC_BLUEGRN)) dy = -dy; //if new x is okay, flip y
  78. if ((m_bBlueBase) == (BOOL)(xBmp.GetPixel(x-dx,y-dy)&XBC_BLUEGRN)) { dx = -dx; dy = -dy; }
  79. Incr();
  80. return TRUE;
  81. }
  82.  
  83. //===========================
  84. // XPointNoRed
  85.  
  86. //-----------------
  87. BOOL XPointNoRed::CldRed(XBitmap &xBmp, BOOL bThorough)
  88. {
  89. UINT xx,yy;
  90. xx = x+dx;
  91. yy = y+dy;
  92. if (dx)
  93.    {
  94.    if (xBmp.GetPixel(xx,yy)&XBC_RED) return TRUE;
  95.    if (bThorough && (xBmp.GetPixel(xx,yy+OBJ_OFFSET)&XBC_RED)) return TRUE;
  96.    if (bThorough && (xBmp.GetPixel(xx,yy-OBJ_OFFSET)&XBC_RED)) return TRUE;
  97.    }
  98. if (dy)
  99.    {
  100.    if (xBmp.GetPixel(xx,yy)&XBC_RED) return TRUE;
  101.    if (bThorough && (xBmp.GetPixel(xx+OBJ_OFFSET,yy)&XBC_RED)) return TRUE;
  102.    if (bThorough && (xBmp.GetPixel(xx-OBJ_OFFSET,yy)&XBC_RED)) return TRUE;
  103.    }
  104. return FALSE;
  105. }
  106.  
  107. //===========================
  108. // XGuy
  109.  
  110. //-----------------
  111. BOOL XGuy::Clip(CRect rc)
  112. {
  113. if (!XPoint::Clip(rc))
  114.    return FALSE;
  115.  
  116. if (dx < 0) x = rc.left+OBJ_OFFSET;
  117. if (dx > 0) x = rc.right-OBJ_OFFSET-1;
  118. if (dy < 0) y = rc.top+OBJ_OFFSET;
  119. if (dy > 0) y = rc.bottom-OBJ_OFFSET-1;
  120.  
  121. dx = dy = 0;
  122.  
  123. return TRUE;
  124. }
  125.  
  126. //-----------------
  127. BOOL XGuy::Update(CDC &DC, XBitmap &xBmp, BOOL bDraw)
  128. {
  129. UINT ox,oy,xx,yy,cc = XBC_NONE;
  130.  
  131. //Stopped?
  132. if (!dx && !dy) return bDraw;
  133.  
  134. ox = x; oy = y;
  135. Incr();
  136.  
  137. //Edge detection to prevent redline slippage ;)
  138. if (bDraw)
  139.    if (dx)
  140.       {
  141.       if (xBmp.GetPixel(x,y+OBJ_OFFSET)&XBC_BLUEGRN) cc = XBC_BLUEGRN;
  142.       if (xBmp.GetPixel(x,y-OBJ_OFFSET)&XBC_BLUEGRN) cc = XBC_BLUEGRN;
  143.       }
  144.    else //dy
  145.       {
  146.       if (xBmp.GetPixel(x+OBJ_OFFSET,y)&XBC_BLUEGRN) cc = XBC_BLUEGRN;
  147.       if (xBmp.GetPixel(x-OBJ_OFFSET,y)&XBC_BLUEGRN) cc = XBC_BLUEGRN;
  148.       }
  149.  
  150. if (xBmp.GetPixel(x,y)&XBC_BLUEGRN) cc = XBC_BLUEGRN;
  151.  
  152. //Draw the redline onto the DC and mark the xbmp with XBC_RED
  153. if (bDraw || (cc == XBC_NONE))
  154.    {
  155.    for(xx=x-2;xx<=x+2;xx++)
  156.       {
  157.       for(yy=y-2;yy<=y+2;yy++)
  158.          DC.SetPixel(xx,yy,RGB_RED);
  159.       xBmp.VLine(xx,y-2,y+2,XBC_RED,TRUE);
  160.       }
  161. /*   if (!bDraw) //apply extra XBC_RED sealant for those rough edges  ;)
  162.       {
  163.       bDraw = TRUE;
  164.       for(xx=ox-2;xx<=ox+2;xx++)
  165.          xBmp.VLine(xx,oy-2,oy+2,XBC_RED,TRUE);
  166.       }*/
  167.    }
  168.  
  169. if (cc == XBC_NONE)
  170.    return TRUE; //drawing
  171. else
  172.    return FALSE; //not drawing
  173. }
  174.  
  175. //===========================
  176. // XBDot
  177.  
  178. //-----------------
  179. BOOL XBDot::Clip(CRect rc)
  180. {
  181. if (!XPoint::Clip(rc))
  182.    return FALSE;
  183.  
  184. int xx=x+dx;
  185. int yy=y+dy;
  186.  
  187. if (xx < rc.left || xx > rc.right-1) dx = -dx;
  188. if (yy < rc.top || yy > rc.bottom-1) dy = -dy;
  189.  
  190. return TRUE;
  191. }
  192.