home *** CD-ROM | disk | FTP | other *** search
/ AI Game Programming Wisdom / AIGameProgrammingWisdom.iso / SourceCode / 02 Useful Techniques / 07 Vykruta / ChildView.cpp next >
Encoding:
C/C++ Source or Header  |  2001-11-21  |  5.3 KB  |  218 lines

  1. // ChildView.cpp : implementation of the CChildView class
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "LOSGridDemo.h"
  6. #include "ChildView.h"
  7. #include "TransformMat.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. // Custom code
  16. CPaintDC* g_dc = NULL;
  17.  
  18. const int size = ELEMWID*10;
  19. const int origin1 = 50, origin2 = origin1 + 50 + size;
  20.  
  21. Layer g_Layer( 0, 0, size/ELEMWID,size/ELEMWID, 50.f);
  22.  
  23. RECT rcGrid1;
  24. RECT rcGrid2;
  25.  
  26. BOOL bHighlited = FALSE;
  27.  
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CChildView
  30.  
  31. CChildView::CChildView()
  32. {
  33. }
  34.  
  35. CChildView::~CChildView()
  36. {
  37. }
  38.  
  39.  
  40. BEGIN_MESSAGE_MAP(CChildView,CWnd )
  41.     //{{AFX_MSG_MAP(CChildView)
  42.     ON_WM_PAINT()
  43.     ON_WM_LBUTTONDOWN( )
  44.     ON_WM_RBUTTONDOWN( )
  45.     ON_WM_MOUSEMOVE ( )
  46.     //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48.  
  49.  
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CChildView message handlers
  52.  
  53. BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
  54. {
  55.     if (!CWnd::PreCreateWindow(cs))
  56.         return FALSE;
  57.  
  58.     cs.dwExStyle |= WS_EX_CLIENTEDGE;
  59.     cs.style &= ~WS_BORDER;
  60.     cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
  61.         ::LoadCursor(NULL, IDC_CROSS), HBRUSH(COLOR_WINDOW+1), NULL);
  62.  
  63.     SetRect(&rcGrid1, origin1, origin1, origin1 + size, origin1 + size);
  64.     SetRect(&rcGrid2, origin2, origin1, origin2 + size, origin1 + size);
  65.  
  66.     return TRUE;
  67. }
  68.  
  69. void DrawGrid(RECT &rcGrid)
  70. {
  71.     int x, y;
  72.     x = rcGrid.left;
  73.     y = rcGrid.top;
  74.  
  75.     while (x <= rcGrid.right)
  76.     {
  77.         g_dc->MoveTo(x, rcGrid.top);
  78.         g_dc->LineTo(x, rcGrid.bottom);
  79.         
  80.         g_dc->MoveTo(rcGrid.left, y);
  81.         g_dc->LineTo(rcGrid.right, y);
  82.         x += 20;
  83.         y += 20;
  84.     }
  85.  
  86.     int iLeft = rcGrid.left + (rcGrid.right - rcGrid.left)/2;
  87.     int iTop = rcGrid.top + (rcGrid.bottom - rcGrid.top)/2;
  88.     
  89.     RECT rcCenter;
  90.     SetRect(&rcCenter, iLeft-3, iTop-3, iLeft+3, iTop+3);
  91.     g_dc->Rectangle(&rcCenter);
  92. }
  93.  
  94. void DrawLine(VECTOR2D vOrig, VECTOR2D vLine, int iColorType)
  95. {
  96.     HPEN hpen, hpenold;
  97.  
  98.      COLORREF rgb = (COLORREF)(0xff << (iColorType << 3));
  99.     // Create a pen.
  100.     hpen = CreatePen(PS_SOLID, 2, rgb);
  101.  
  102.     // Select the new pen and brush, and then draw.
  103.     hpenold = (HPEN)g_dc->SelectObject( hpen);
  104.     
  105.     int iLeft = rcGrid1.left + (rcGrid1.right - rcGrid1.left)/2;
  106.     int iTop = rcGrid1.top + (rcGrid1.bottom - rcGrid1.top)/2;
  107.     g_dc->MoveTo(iLeft + vOrig.x,     iTop + vOrig.y);
  108.     g_dc->RoundRect(iLeft + vOrig.x, iTop + vOrig.y, iLeft + vOrig.x + 5, iTop + vOrig.y + 5, 5, 5);
  109.     g_dc->MoveTo(iLeft + vOrig.x,     iTop + vOrig.y);
  110.     g_dc->LineTo(iLeft + vOrig.x + vLine.x, iTop + vOrig.y + vLine.y);
  111.     
  112.     g_dc->SelectObject(hpenold);
  113.    DeleteObject(hpen);
  114. }
  115.  
  116. void DrawLine2(VECTOR2D vOrig, VECTOR2D vLine, int iColorType)
  117. {
  118.     HPEN hpen, hpenold;
  119.  
  120.      COLORREF rgb = (COLORREF)(0xff << (iColorType << 3));
  121.     // Create a pen.
  122.     hpen = CreatePen(PS_SOLID, 2, rgb);
  123.  
  124.     // Select the new pen and brush, and then draw.
  125.     hpenold = (HPEN)g_dc->SelectObject( hpen);
  126.     
  127.     int iLeft = rcGrid2.left + (rcGrid2.right - rcGrid2.left)/2;
  128.     int iTop = rcGrid2.top + (rcGrid2.bottom - rcGrid2.top)/2;
  129.     g_dc->MoveTo(iLeft + vOrig.x,     iTop + vOrig.y);
  130.     g_dc->RoundRect(iLeft + vOrig.x, iTop + vOrig.y, iLeft + vOrig.x + 5, iTop + vOrig.y + 5, 5, 5);    
  131.     g_dc->MoveTo(iLeft + vOrig.x,     iTop + vOrig.y);
  132.     g_dc->LineTo(iLeft + vOrig.x + vLine.x, iTop + vOrig.y + vLine.y);
  133.     
  134.     g_dc->SelectObject(hpenold);
  135.    DeleteObject(hpen);
  136. }
  137.  
  138. VECTOR2D vDir(50,-50);
  139. VECTOR2D vOrig (20,10);
  140. void CChildView::OnPaint() 
  141. {
  142.     CPaintDC dc(this); // device context for painting
  143.     g_dc = &dc;
  144.  
  145.     // select system font
  146.     HGDIOBJ hfnt; 
  147.     hfnt = GetStockObject(ANSI_FIXED_FONT); 
  148.     SelectObject(dc.m_hDC, hfnt);
  149.  
  150.     if (bHighlited)
  151.     {
  152.         RECT rcHL = rcGrid2;
  153.         rcHL.right += 2;
  154.         rcHL.bottom += 2;
  155.         g_dc->Rectangle(&rcHL);
  156.     }
  157.  
  158.     dc.TextOut( rcGrid2.left, rcGrid2.bottom + 5, "*Right/Left click to set ray");
  159.     dc.TextOut( rcGrid2.left + 20, rcGrid2.top - 20, "Real Grid Space");
  160.  
  161.     dc.TextOut( rcGrid1.left + 20, rcGrid1.top - 20, "Virtual Grid Space");
  162.     dc.TextOut( rcGrid2.left + 20, rcGrid2.top - 20, "Real Grid Space");
  163.     
  164.     DrawGrid(rcGrid1);
  165.     DrawGrid(rcGrid2);
  166.  
  167.     VECTOR3D vFrom, vTo, vImpact;
  168.     vFrom.Set(vOrig.x, 0, vOrig.y);
  169.     vFrom += g_Layer.GetOrigin();
  170.     
  171.     vTo.Set(vDir.x, 0, vDir.y);
  172.     vTo += vFrom;
  173.     vTo += g_Layer.GetOrigin();
  174.     
  175.     g_Layer.DoesElemCollideRay(vFrom, vTo, &vImpact);
  176. };
  177.  
  178.  
  179. inline VECTOR2D rectCenter(const RECT& rc)
  180. {
  181.     VECTOR2D vRet;
  182.     vRet.x = rc.left + (rc.right - rc.left)/2;
  183.     vRet.y = rc.top  + (rc.bottom - rc.top)/2;
  184.     return(vRet);
  185. }
  186.  
  187. void CChildView::OnLButtonDown(UINT nFlags, CPoint point) 
  188. {
  189.     if (PtInRect(&rcGrid2, point) )
  190.     {
  191.         VECTOR2D vTemp = vOrig + vDir;
  192.         vOrig = VECTOR2D(point.x,point.y) - rectCenter(rcGrid2);
  193.         vDir = vTemp - vOrig;
  194.     }
  195.  
  196.     Invalidate();
  197.     CWnd::OnRButtonDown(nFlags, point);
  198. }
  199.  
  200. void CChildView::OnRButtonDown(UINT nFlags, CPoint point) 
  201. {
  202.     if (PtInRect(&rcGrid2, point) )
  203.         vDir = VECTOR2D(point.x,point.y) - rectCenter(rcGrid2) - vOrig;
  204.  
  205.     Invalidate();
  206.     CWnd::OnLButtonDown(nFlags, point);
  207. }
  208.  
  209. void CChildView::OnMouseMove( UINT nFlags, CPoint point )
  210. {
  211.     if (bHighlited != PtInRect(&rcGrid2, point) )
  212.     {
  213.         bHighlited = !bHighlited;
  214.         Invalidate();
  215. //        SetCursor(LoadCursor(NULL, bHighlited ? IDC_CROSS : IDC_ARROW));
  216.     }
  217. }
  218.