⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 45mapmakerview.cpp

📁 一款45度2D游戏地图编辑器和大家一起分享啊!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					theApp->display->Blt(ix,iy,draw);
				}
				if((((j+mapBeginy)*mapWidth)+i+mapBeginx)==this->editarry&&this->editFront)
				{
					draw =theApp->GetCSurface("Tile",theApp->CurrentEditId);
					if(draw)
					{
						theApp->display->AlphaBlt(ix,iy,draw,100,RGB(255,0,255));
					}
				}
			}
			iy+=tileHeight;
		}
		ix=ixbegin+tileWidth/2;	//每次画完一列之后x坐标要向右移动
		ixbegin+=tileWidth/2;	//然后作一下纪录
		iy=hbegin+h1;			//iy要回到原来位置并且变动
		hbegin+=h1;
		h1 = -h1;
	}
}
void CMy45MapMakerView::DrawObject()
{
	
}
BOOL CMy45MapMakerView::OnEraseBkgnd(CDC* pDC)//不刷背景
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	return true;
}

void CMy45MapMakerView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
	// TODO: 在此添加专用代码和/或调用基类
	CMy45MapMakerDoc* pDoc = GetDocument();
	//CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp();
	//HRESULT hr = theApp->display->ChangeBackBufferSize(pDoc->m_myMap.width*pDoc->m_myMap.blockw,pDoc->m_myMap.height*pDoc->m_myMap.blockh);
	mapWidth = pDoc->m_myMap.width;
	mapHeight = pDoc->m_myMap.height;
	this->tileHeight = pDoc->m_myMap.blockh;
	this->tileWidth = pDoc->m_myMap.blockw;
	//if(hr)
		//MessageBox("Can't change DDraw BackBufferSzie!!","Error");
	CView::OnUpdate(pSender,lHint,pHint);
}

void CMy45MapMakerView::OnMouseMove(UINT nFlags, CPoint point)
{
	//在此添加消息处理程序代码和/或调用默认值
	//Sleep(1);
	if(mouse==0)
	{
	AfxGetApp()->m_pMainWnd->PostMessage(WM_MAP_POS,point.x+mapBeginx*tileWidth/2,point.y+mapBeginy*tileHeight);
	CMy45MapMakerDoc* pDoc = GetDocument();
	CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp();
	CRect rt;
	GetClientRect(&rt);
	if(point.x>rt.right||point.y>rt.bottom)
		return;
	int arryx,arryy; //定义数组的起始位置~
	arryx = this->mapBeginx+(point.x)/(tileWidth/2);
	arryy = this->mapBeginy+(point.y+tileHeight/2)/(tileHeight);
	if(arryx>=mapWidth||arryy>=mapHeight)
		return;
	int w,h;
	if(!this->editMode)//如果是画刷模式,,,,,
	{
		w = point.x%(tileWidth/2);
		if(arryx%2==0)
			w = (tileWidth/2)-w;
		int temp = ((point.y+(tileHeight/2))/tileHeight);
		temp = temp*tileHeight;
		h = temp-point.y;
		float w1 = w;
		float h1 = h;
		if(arryx%2==1)
		{
			if(w1==0)
			{
				if(h1<0)
					arryy--;
			}
			else
			{
				float result = (h1/w1);
				if(result>(0.5))
					arryy--;
				if(result<0.5&&result>-0.5)
					arryx++;
			}
		}
		else
		{	
			if(w1 == 0)
			{
				if(h1>0)
				{	arryy--;
					arryx++;
				}
			}
			else
			{
				float result = h1/w1;
				if(result>0.5)
				{	
					arryx++;
					arryy--;
				}
				if(result<-0.5)
				{
					arryx++;
				}
			}
		}
		editx = arryx;
		edity = arryy;
		AfxGetApp()->m_pMainWnd->PostMessage(WM_MAP_ARRAY,arryx,arryy);
		editarry = ((arryy*this->mapWidth)+arryx);
		if(brushed)
		{
			if(this->editFront) //刷地表
				*(pDoc->m_myMap.arr1+this->editarry) = theApp->CurrentEditId;
		//	else if(this->editSecond)
		//		*(pDoc->m_myMap.arr2+this->editarry) = theApp->CurrentEditId;
		}
		this->Invalidate();
	}
	else
	{
	}
	}
	mouse++;
	if(mouse==6)
		mouse = 0;
	//CView::OnMouseMove(nFlags, point);
}

void CMy45MapMakerView::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(editarry>(mapHeight*mapWidth)||editarry<0)
		return;
	CMy45MapMakerDoc* pDoc = GetDocument();
	CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp();
	if(!this->editMode)
	{
		if(this->editFront)
		{
			if(*(pDoc->m_myMap.arr1+this->editarry)<0)
				*(pDoc->m_myMap.arr1+this->editarry) = -theApp->CurrentEditId;
			else 
				*(pDoc->m_myMap.arr1+this->editarry) = theApp->CurrentEditId;
		}
		else if(this->editSecond)
		{
			//编辑第二层的时候,需要修改第一层某些东西咯
			//先得到第二层描述结构
			WallConfig* temp;
			theApp->m_myWall.find(theApp->CurrentEditId,temp);
			//然后检查是否有东西和它冲突,如果有冲突,就不画它
			std::vector<CPoint>::iterator is = temp->project.begin();
			if(*(pDoc->m_myMap.arr1+editarry)<0)
				return;
			//there is a arry Problem in here
			if(editx%2==0)
			{
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-(temp->centery))*this->mapWidth+((*is).x-temp->centerx);
					int p = (*is).x;
					int q = temp->centerx;
					if(q%2 == 1)
					{
					if((abs(p-q))%2==1)
						
						s-=mapWidth;
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					if(*(pDoc->m_myMap.arr1+s)<0)//如果冲突,直接返回
						return;
				}
				is = temp->project.begin();
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-temp->centery)*this->mapWidth+((*is).x-temp->centerx);
					int p = (*is).x;
					int q = temp->centerx;
					if(q%2==1)
					{
					if((abs((p-q)))%2==1)
						
							s-=mapWidth;
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					*(pDoc->m_myMap.arr1+s) = -(*(pDoc->m_myMap.arr1+s));
				}
			}
			else
			{
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-(temp->centery))*this->mapWidth+((*is).x-temp->centerx);
					if(temp->centerx%2==0)
					{
					if(abs((*is).x - temp->centerx)%2==1)
					{
						
							s+=mapWidth;
				
					}
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					if(*(pDoc->m_myMap.arr1+s)<0)//如果冲突,直接返回
						return;
				}
				is = temp->project.begin();
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-temp->centery)*this->mapWidth+((*is).x-temp->centerx);
					int p = (*is).x;
					int q = temp->centerx;
					if(temp->centerx%2==0)
					{
					if(abs((*is).x - temp->centerx)%2==1)
					{
						
							s+=mapWidth;
				
					}
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					*(pDoc->m_myMap.arr1+s) = -(*(pDoc->m_myMap.arr1+s));
				}
			}
			//修改当前值
			*(pDoc->m_myMap.arr1+editarry) = -*(pDoc->m_myMap.arr1+editarry);
			*(pDoc->m_myMap.arr2+this->editarry) = theApp->CurrentEditId;
		}
		brushed = false;
		this->Invalidate();
	}
	CView::OnLButtonUp(nFlags, point);
}

void CMy45MapMakerView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(!this->editMode)
		brushed = true;
	CView::OnLButtonDown(nFlags, point);
}
BOOL CMy45MapMakerView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
	// TODO: 在此添加专用代码和/或调用基类
		 
	if(CView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext))
	{
		return InitDirectDraw(this->m_hWnd);
	}
	else
		return false;
}

void CMy45MapMakerView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);
	//CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp(); //app
	//if(theApp->display)
	//theApp->display->UpdateBounds();
	// TODO: 在此处添加消息处理程序代码
}

void CMy45MapMakerView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
		switch(nSBCode){
		case SB_LINEUP:
			--mapBeginx;
			break;
		case SB_LINEDOWN:
			++mapBeginx;
			break;
		case SB_PAGEUP:
			mapBeginx-=10;
			break;
		case SB_PAGEDOWN:
			mapBeginx+=10;
			break;
		case SB_THUMBPOSITION:
			mapBeginx=nPos;
			break;
	}
	if(mapBeginx<0)
		mapBeginx=0;
	if(mapBeginx>mapWidth)
		mapBeginx = mapWidth;
	CView::OnHScroll(nSBCode, mapBeginx, pScrollBar);
	this->Invalidate();
}

void CMy45MapMakerView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
		switch(nSBCode){
		case SB_LINEUP:
			--mapBeginy;
			break;
		case SB_LINEDOWN:
			++mapBeginy;
			break;
		case SB_PAGEUP:
			mapBeginy-=10;
			break;
		case SB_PAGEDOWN:
			mapBeginy+=10;
			break;
		case SB_THUMBPOSITION:
			mapBeginy=nPos;
			break;
	}	
	if(mapBeginy<0)
		mapBeginy=0;
	if(mapBeginy>mapHeight)
		mapBeginy = mapHeight;
	CView::OnVScroll(nSBCode, mapBeginy, pScrollBar);
	this->Invalidate();
}

void CMy45MapMakerView::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(editarry>(mapHeight*mapWidth)||editarry<0)
		return;
	CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp();
	CMy45MapMakerDoc* pDoc = GetDocument();
//CMy45MapMakerApp* theApp = (CMy45MapMakerApp*)AfxGetApp();
	if(!editMode)
	{
		if(this->editFront)
		{
			*(pDoc->m_myMap.arr1+this->editarry) = 0;
		}
		else if(this->editSecond)
		{
			if(*(pDoc->m_myMap.arr2+this->editarry))
			{
			WallConfig* temp;
			theApp->m_myWall.find(*(pDoc->m_myMap.arr2+this->editarry),temp);
			//然后检查是否有东西和它冲突,如果有冲突,就不画它
			std::vector<CPoint>::iterator is = temp->project.begin();
			
			//there is a arry Problem in here
			if(editx%2==0)
			{
			//	is = temp->project.begin();
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-temp->centery)*this->mapWidth+((*is).x-temp->centerx);
					int p = (*is).x;
					int q = temp->centerx;
					if(q%2==1)
					{
					if((abs((p-q)))%2==1)
						
							s-=mapWidth;
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					if(*(pDoc->m_myMap.arr1+s)<0)
						*(pDoc->m_myMap.arr1+s) = -(*(pDoc->m_myMap.arr1+s));
				}
			}
			else
			{				
				//is = temp->project.begin();
				for(;is!=temp->project.end();is++)
				{
					int s = this->editarry+((*is).y-temp->centery)*this->mapWidth+((*is).x-temp->centerx);
					int p = (*is).x;
					int q = temp->centerx;
					if(temp->centerx%2==0)
					{
					if(abs((*is).x - temp->centerx)%2==1)
					{
						
							s+=mapWidth;
				
					}
					}
					if(s<0||s>(mapWidth*mapHeight-1))
						continue;
					if(*(pDoc->m_myMap.arr1+s)<0)
					*(pDoc->m_myMap.arr1+s) = -(*(pDoc->m_myMap.arr1+s));
				}
			}
			//修改当前值
			if(*(pDoc->m_myMap.arr1+editarry)<0)
				*(pDoc->m_myMap.arr1+editarry) = -*(pDoc->m_myMap.arr1+editarry);
			*(pDoc->m_myMap.arr2+this->editarry) =0;
			}
		}
	}
	this->Invalidate();
	CView::OnRButtonDown(nFlags, point);
}

void CMy45MapMakerView::OnViewfront()
{
	// TODO: 在此添加命令处理程序代码
	viewFront =!viewFront;
}

void CMy45MapMakerView::OnUpdateViewfront(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(viewFront);
}

void CMy45MapMakerView::OnViewsecond()
{
	// TODO: 在此添加命令处理程序代码
	viewSecond = !viewSecond;
}

void CMy45MapMakerView::OnUpdateViewsecond(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(viewSecond);
}

void CMy45MapMakerView::OnViewblock()
{
	// TODO: 在此添加命令处理程序代码
	viewBlock = !viewBlock;
}


void CMy45MapMakerView::OnUpdateViewblock(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(viewBlock);
}

void CMy45MapMakerView::OnViewnet()
{
	// TODO: 在此添加命令处理程序代码
	viewNet = !viewNet;
}

void CMy45MapMakerView::OnUpdateViewnet(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(viewNet);
}

void CMy45MapMakerView::OnEditfront()
{
	// TODO: 在此添加命令处理程序代码
	this->editFront = true;
	this->editSecond = false;
	this->editBlock = false;
}

void CMy45MapMakerView::OnEditsecond()
{
	// TODO: 在此添加命令处理程序代码
	this->editSecond = true;
	this->editFront = false;
	this->editBlock = false;
}

void CMy45MapMakerView::OnEditblock()
{
	// TODO: 在此添加命令处理程序代码
	this->editBlock = true;
	this->editFront = false;
	this->editSecond = false;
}

void CMy45MapMakerView::OnUpdateEditfront(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetRadio(editFront);
}


void CMy45MapMakerView::OnUpdateEditsecond(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetRadio(editSecond);
}

void CMy45MapMakerView::OnUpdateEditblock(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetRadio(editBlock);
}

void CMy45MapMakerView::OnSelectmode()
{
	// TODO: 在此添加命令处理程序代码
	this->editMode = true;
}

void CMy45MapMakerView::OnBrushmode()
{
	// TODO: 在此添加命令处理程序代码
	this->editMode = false;
}

void CMy45MapMakerView::OnUpdateSelectmode(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetRadio(editMode);
}


void CMy45MapMakerView::OnUpdateBrushmode(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetRadio(!editMode);
}

void CMy45MapMakerView::OnViewsecondtarg()
{
	// TODO: 在此添加命令处理程序代码
	//this->ViewEditSecond = !ViewEditSecond;
	ViewEditSecond = !ViewEditSecond;
}

void CMy45MapMakerView::OnUpdateViewsecondtarg(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(ViewEditSecond);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -