📄 astarpathview.cpp
字号:
// AstarPathView.cpp : implementation of the CAstarPathView class
//
#include "stdafx.h"
#include "AstarPath.h"
#include "MainFrm.h"
#include "AstarPathDoc.h"
#include "AstarPathView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView
IMPLEMENT_DYNCREATE(CAstarPathView, CView)
BEGIN_MESSAGE_MAP(CAstarPathView, CView)
//{{AFX_MSG_MAP(CAstarPathView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView construction/destruction
CAstarPathView::CAstarPathView()
{
// TODO: add construction code here
m_Player = new int[ROWCOUNT*ROWCOUNT];
for (int i=0; i<COLCOUNT*ROWCOUNT; i++)
{
m_Player[i] = 0;
}
m_nX1 = -1;
m_nY1 = -1;
}
CAstarPathView::~CAstarPathView()
{
//*
if(m_Player)
delete [] m_Player;//*/
}
BOOL CAstarPathView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView drawing
void CAstarPathView::OnDraw(CDC* pDC)
{
CAstarPathDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//CClientDC dc(this);
for (int i=0; i<COLCOUNT*ROWCOUNT; i++)
{
m_Player[i] = 0;
}
//*
DrawRect(pDC,RGB(20,20,240));
m_astar.InitMap(m_Player);
//*/
}
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView printing
BOOL CAstarPathView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CAstarPathView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CAstarPathView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView diagnostics
#ifdef _DEBUG
void CAstarPathView::AssertValid() const
{
CView::AssertValid();
}
void CAstarPathView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CAstarPathDoc* CAstarPathView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAstarPathDoc)));
return (CAstarPathDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAstarPathView message handlers
//画方格
void CAstarPathView::DrawRect(CDC *pDC,COLORREF cr)
{
HPEN pen,oldpen;
int r,g,b;
COLORREF cr1;
r=GetRValue(cr);
g=GetGValue(cr);
b=GetBValue(cr);
cr1=RGB(min(255,r+40),min(255,g+40),min(255,b+40));
pen=CreatePen(PS_SOLID,0,cr1);
oldpen=(HPEN)pDC->SelectObject(pen);
pDC->SelectObject(pen);
//画边框
pDC->MoveTo(XC[0]-3,YC[0]-3);
pDC->LineTo(XC[0]-3,YC[0]+3+BWA*COLCOUNT);
pDC->LineTo(XC[0]+3+BWA*ROWCOUNT,YC[0]+3+BWA*COLCOUNT);
pDC->LineTo(XC[0]+3+BWA*ROWCOUNT,YC[0]-3);
pDC->LineTo(XC[0]-3,YC[0]-3);
//画竖线
int n;
for( n=1;n<COLCOUNT;n++)
{
pDC->MoveTo(XC[0],YC[0]+BWA*n);
pDC->LineTo(XC[0]+BWA*ROWCOUNT,YC[0]+BWA*n);
}
for( n=1;n<ROWCOUNT;n++)
{
pDC->MoveTo(XC[0]+BWA*n,YC[0]);
pDC->LineTo(XC[0]+BWA*n,YC[0]+BWA*COLCOUNT);
}
pDC->SelectObject(oldpen);
DeleteObject(pen);
//随机填充方块
DrawRandRect(pDC);
}
void CAstarPathView::DrawRandRect(CDC *pDC)
{
srand(time(NULL));
//随机产生方块,作为障碍物
for(int i=0; i<MAXRECT; i++)
{
CBrush *pBrush = new CBrush;
pBrush->CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256));
//随机产生坐标
int sx = rand()%ROWCOUNT;
int sy = rand()%COLCOUNT;
//填充方块
pDC->FillRect(CRect(XC[0]+sx*BWA,
YC[0]+sy*BWA,
XC[0]+(sx+1)*BWA,
YC[0]+(sy+1)*BWA),pBrush);
//对填充的方块设标记
m_Player[sy*ROWCOUNT+sx] = 1;
delete pBrush;
}
}
void CAstarPathView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(!IsInRect(point))
{
AfxMessageBox("不在区域内!");
return;
}
//转化坐标,
int x = (point.x-15)/BWA + ((point.x-15)%BWA?1:0) - 1;
int y = (point.y-15)/BWA + ((point.y-15)%BWA?1:0) - 1;
//判断所鼠标所点的方块是否存在障碍物
if(m_Player[y*ROWCOUNT+x] == 0)
{
//对所选择的方块画圆
CClientDC dc(this);
CBrush brush(RGB(255,0,0));
dc.SelectObject(&brush);
dc.Ellipse(x*BWA+20,y*BWA+20,(x+1)*BWA+10,(y+1)*BWA+10);
m_Player[y*ROWCOUNT+x] = 1;
//对第一次选择的方块坐标赋值
if(m_nX1 < 0)
{
m_nX1 = x;
m_nY1 = y;
}
else
{
//添加一条路径
if(m_astar.NewPath(m_nX1,m_nY1,x,y))
{
//取(m_nX1,m_nY1)的父亲结点
m_astar.PathNextNode();
int X1 = m_astar.GetNodeX();
int Y1 = m_astar.GetNodeY();
//判断是否到达目标结点
while(X1 != x || Y1 != y)
{
//对m_nX1,m_nY1父亲结点画圆m_nX1,m_nY1
CBrush br(RGB(0,255,0));
dc.SelectObject(&br);
dc.Ellipse(X1*BWA+20,Y1*BWA+20,(X1+1)*BWA+10,(Y1+1)*BWA+10);
m_astar.PathNextNode();
X1 = m_astar.GetNodeX();
Y1 = m_astar.GetNodeY();
}//*/
}
m_nX1 = -1;
m_nY1 = -1;
}
}
CView::OnLButtonDown(nFlags, point);
}
void CAstarPathView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
}
//判断是否在规定的矩形框内
BOOL CAstarPathView::IsInRect(CPoint point)
{
if(point.x < 15 || point.y < 15)
return FALSE;
if(point.x > BWA*ROWCOUNT+15 || point.y > BWA*COLCOUNT+15)
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -