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

📄 cmapeditor.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	m_adwSurfaceHeight[9]=640;
	m_adwSurfaceHeight[10]=480;							//AniTileSurface

	m_adwSurfaceColorKey[0]=RGB(255,0,255);
	m_adwSurfaceColorKey[1]=RGB(0,0,0);
	m_adwSurfaceColorKey[2]=RGB(255,0,255);
	m_adwSurfaceColorKey[3]=RGB(255,0,255);
	m_adwSurfaceColorKey[4]=RGB(255,0,255);
	m_adwSurfaceColorKey[5]=RGB(255,0,255);
	m_adwSurfaceColorKey[6]=RGB(255,0,255);
	m_adwSurfaceColorKey[7]=RGB(255,0,255);
	m_adwSurfaceColorKey[8]=RGB(0,0,0);
	m_adwSurfaceColorKey[9]=RGB(255,0,255);
	m_adwSurfaceColorKey[10]=RGB(255,0,255);
}
//-----------------------------------------------------------------------------------
//初始化表面
//-----------------------------------------------------------------------------------
BOOL CMapEditor::InitSurface(const char*szAniFile)
{
	SetSurfaceValue();
	char szBmpFile[1024];
	if(FAILED(m_pDisplay->CreateSurface(&m_pSurfGround,640,480)))
	{
		m_pLog->WriteMessage("Create Surface Ground...failed!\n");
		return false;
	}
	m_pSurfGround->SetColorKey(RGB(255,0,255));
	m_pLog->WriteMessage("Create Surface Ground...ok!\n");

	
	if(FAILED(m_pDisplay->CreateSurfaceFromBitmap(&m_pSurfBlock,"block.bmp",32,32)))
	{
		m_pLog->WriteMessage("Create Surface Block...failed!\n");
		return false;
	}
	m_pSurfBlock->SetColorKey(RGB(255,255,255));
	m_pLog->WriteMessage("Create Surface Block...ok!\n");

	for(DWORD i=0;i<10;i++)
	{
		memset(szBmpFile,0,1024);
		wsprintf(szBmpFile,"tiles\\tile%d.bmp",i);
		if(FAILED(m_pDisplay->CreateSurfaceFromBitmap(&m_aSurface[i],
													  szBmpFile,
													  0,//m_adwSurfaceWidth[i],
													  0)))//m_adwSurfaceHeight[i])))
		{
			m_pLog->WriteMessage("Create Surface(%d) from File<%s> Failed!\n",i,szBmpFile);
			return false;
		}
		m_pLog->WriteMessage("Create Surface(%d) from File<%s>...ok!\n",i,szBmpFile);
		m_aSurface[i]->SetColorKey(m_adwSurfaceColorKey[i]);
	}

	if(FAILED(m_pDisplay->CreateSurface(&m_aSurface[10],
										m_adwSurfaceWidth[10],
										m_adwSurfaceHeight[10])))
	{
		m_pLog->WriteMessage("Create Surface(10) (AniSurface) Failed!\n");
		return false;
	}
	m_aSurface[10]->SetColorKey(m_adwSurfaceColorKey[10]);


	m_pLog->WriteMessage("Create Surface(10) (AniSurface)...ok!\n");


	m_dwTileAniCount=::GetPrivateProfileInt("ani","count",0,szAniFile);
	m_pLog->WriteMessage("Get Map Ani Tile Count=%d From<%s>\n",m_dwTileAniCount,szAniFile);

	if(m_dwTileAniCount==0)
		return true;

	m_aTileAni=new STTileAni[m_dwTileAniCount];
	if(!m_aTileAni)
	{
		m_pLog->WriteMessage("New Tile Ani Failed!\n");
		return false;
	}
	int k,n;
	char szAppName[256];
	char szPosition[1024];
	for(i=0;i<m_dwTileAniCount;i++)
	{
		memset(szAppName,0,256);
		
		wsprintf(szAppName,"tile%d",i+1);
		m_aTileAni[i].dwDelay=::GetPrivateProfileInt(szAppName,"delay",200,szAniFile);
		m_aTileAni[i].dwFrames=::GetPrivateProfileInt(szAppName,"frames",0,szAniFile);
		m_aTileAni[i].dwPicID=::GetPrivateProfileInt(szAppName,"picid",0,szAniFile);
	
		m_aTileAni[i].dwCurrentFrame=0;
		m_aTileAni[i].dwOldTime=0;
		m_aTileAni[i].pPos=new POINT[m_aTileAni[i].dwFrames];
	
		if(!m_aTileAni[i].pPos)
		{
			m_pLog->WriteMessage("New Tile Ani Position Failed!\n");
			return false;
		}
		
		memset(szPosition,0,1024);
		::GetPrivateProfileString(szAppName,"posx","",szPosition,1024,szAniFile);
		
		for(DWORD j=0;j<m_aTileAni[i].dwFrames;j++)
		{
			m_aTileAni[i].pPos[j].x=0;
			m_aTileAni[i].pPos[j].y=0;
		}
		
		k=0;
		n=0;
		char tmp[32];

		while(szPosition[k])
		{
			j=0;
			memset(tmp,0,32);
			while(szPosition[k]!=',' && szPosition[k]!='\0')
			{
				tmp[j++]=szPosition[k];
				k++;
			}
			if(tmp[j]==',')
				tmp[j]='\0';
			k++;
 			sscanf(tmp,"%d",&m_aTileAni[i].pPos[n].x);
			n++;
		}
	 
		

		memset(szPosition,0,1024);
		::GetPrivateProfileString(szAppName,"posy","",szPosition,1024,szAniFile);
		
		k=0;
		n=0;
		
		while(szPosition[k])
		{
			j=0;
			memset(tmp,0,32);
			while(szPosition[k]!=',' && szPosition[k]!='\0')
			{
				tmp[j++]=szPosition[k];
				k++;
			}
			if(tmp[j]==',')
				tmp[j]='\0';
			k++;
			sscanf(tmp,"%d",&m_aTileAni[i].pPos[n].y);
			n++;
		}
		
		
	}

	m_pLog->WriteMessage("Init Surface...OK!\n");
	
	return true;
}
//-----------------------------------------------------------------------------------
//显示动态图块
//-----------------------------------------------------------------------------------
void CMapEditor::ShowAniTileToAniSurface()
{
	RECT rect;
	for(DWORD i=0;i<m_dwTileAniCount;i++)
	{
		if(timeGetTime()-m_aTileAni[i].dwOldTime > m_aTileAni[i].dwDelay)
		{
			m_aTileAni[i].dwOldTime=timeGetTime();
			::SetRect(&rect,
				  m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].x<<5,
				  m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].y<<5,
				  (m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].x+1)<<5,
				  (m_aTileAni[i].pPos[m_aTileAni[i].dwCurrentFrame].y+1)<<5);

			m_aSurface[10]->BltFast((i%20)<<5,
								(i/20)<<5,
								m_aSurface[ m_aTileAni[i].dwPicID],
								&rect,true);

			m_aTileAni[i].dwCurrentFrame++;
			if(m_aTileAni[i].dwCurrentFrame>=m_aTileAni[i].dwFrames)
				m_aTileAni[i].dwCurrentFrame=0;
		}
	}
}
//-----------------------------------------------------------------------------------
//显示选择图块的表面
//-----------------------------------------------------------------------------------
void CMapEditor::ShowSelectTileSurface()
{
	RECT rect={m_axSelectStart[m_dwCurrentSelectSurface],
			   m_aySelectStart[m_dwCurrentSelectSurface],
			   m_axSelectStart[m_dwCurrentSelectSurface]+640,
			   m_aySelectStart[m_dwCurrentSelectSurface]+480};
	m_pDisplay->ColorKeyBlt(0,0,
				m_aSurface[m_dwCurrentSelectSurface]->GetDDrawSurface(),
				&rect);
}
//-----------------------------------------------------------------------------------
//显示地表
//-----------------------------------------------------------------------------------
void CMapEditor::ShowGround()
{
	if(!m_bShowGround)
		return;
	m_pDisplay->ColorKeyBlt(0,0,m_pSurfGround->GetDDrawSurface());
}
//-----------------------------------------------------------------------------------
//显示编辑表面
//-----------------------------------------------------------------------------------
void CMapEditor::ShowEditSurface()
{
	ShowGround();
	if(!m_pMap->m_ppTile)
		return;
	RECT rect;
	for(DWORD x=0,i=m_xEditStart>>5;i<(m_xEditStart>>5)+20;i++,x++)
	{
		for(DWORD y=0,j=m_yEditStart>>5;j<(m_yEditStart>>5)+15;j++,y++)
		{
			if(m_pMap->m_ppTile[i][j].IDObj_1!=255 && m_bShowObj1)
			{
				::SetRect(&rect,((DWORD)(m_pMap->m_ppTile[i][j].xObj_1))<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].yObj_1))<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].xObj_1)+1)<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].yObj_1)+1)<<5);
				m_pDisplay->ColorKeyBlt(x<<5,y<<5,
										m_aSurface[m_pMap->m_ppTile[i][j].IDObj_1]->GetDDrawSurface(),
										&rect);
			}
			if(m_pMap->m_ppTile[i][j].IDObj_2!=255 && m_bShowObj2)
			{
				::SetRect(&rect,((DWORD)(m_pMap->m_ppTile[i][j].xObj_2))<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].yObj_2))<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].xObj_2)+1)<<5,
								((DWORD)(m_pMap->m_ppTile[i][j].yObj_2)+1)<<5);
				m_pDisplay->ColorKeyBlt(x<<5,y<<5,
										m_aSurface[m_pMap->m_ppTile[i][j].IDObj_2]->GetDDrawSurface(),
										&rect);
			}
			if(m_bShowBlockSign && false==m_pMap->m_ppTile[i][j].bCross)
				m_pDisplay->ColorKeyBlt(x<<5,y<<5,m_pSurfBlock->GetDDrawSurface());
			
		}
	}
}
//-----------------------------------------------------------------------------------
//显示格子
//-----------------------------------------------------------------------------------
void CMapEditor::ShowGrid()
{
	if(!m_bShowGrid)
		return;
	HDC hdc;
	m_pDisplay->GetBackBuffer()->GetDC(&hdc);
	HPEN hpen=::CreatePen(1,1,RGB(0,255,0));
	::SelectObject(hdc,(HGDIOBJ)hpen);
	for(int i=0;i<20;i++)
	{
		::MoveToEx(hdc,i<<5,0,NULL);
		::LineTo(hdc,i<<5,480);
	}
	for(i=0;i<15;i++)
	{
		::MoveToEx(hdc,0,i<<5,NULL);
		::LineTo(hdc,640,i<<5);
	}
	::DeleteObject(hpen);
	m_pDisplay->GetBackBuffer()->ReleaseDC(hdc);
}
//-----------------------------------------------------------------------------------
//刷新屏幕
//-----------------------------------------------------------------------------------
void CMapEditor::UpdateScreen()
{
	m_pDisplay->Clear();
	ShowAniTileToAniSurface();

	POINT pt;
	RECT rect;
	::GetCursorPos(&pt);
	::ScreenToClient(m_hWnd,&pt);
	::GetClientRect(m_hWnd,&rect);

	float tileWidth=((float)(rect.right-rect.left))/20.0f;
	float tileHeight=((float)(rect.bottom-rect.top))/15.0f;
	if(m_bIsEdit)
	{
		if(::PtInRect(&rect,pt))
		{
			m_xdwCurrentEditTile=(DWORD)(((float)(pt.x))/tileWidth);
			m_ydwCurrentEditTile=(DWORD)(((float)(pt.y))/tileHeight);
		}
		ShowEditSurface();
		if(m_xdwCurrentSelectTile!=0xffffffff
			&& m_ydwCurrentSelectTile!=0xffffffff)
		{
			::SetRect(&rect,m_xdwCurrentSelectTile<<5,
							m_ydwCurrentSelectTile<<5,
							(m_xdwCurrentSelectTile+1)<<5,
							(m_ydwCurrentSelectTile+1)<<5);
		
			m_pDisplay->AlphaBlt(
								 m_xdwCurrentEditTile<<5,
								 m_ydwCurrentEditTile<<5,
								 m_aSurface[m_dwCurrentSelectSurface]->GetDDrawSurface(),
								 &rect,true,8);
		
			
		}
	}
	else
	{
		ShowSelectTileSurface();
		DWORD TempX,TempY;
		if(::PtInRect(&rect,pt))
		{
		 	TempX=(DWORD)(((float)(pt.x))/tileWidth);
			TempY=(DWORD)(((float)(pt.y))/tileHeight);

			::SetRect(&rect,TempX<<5,
							TempY<<5,
							(TempX+1)<<5,
							(TempY+1)<<5);

			m_pDisplay->ColorAlphaBlt(RGB(255,0,255),&rect,16);
		}
	}
	ShowGrid();
	static DWORD fpsoldTime=timeGetTime();
	static int frames=0,fps=0;
	if(timeGetTime()-fpsoldTime<1000)
	{
		frames++;
	}
	else
	{
		fpsoldTime=timeGetTime();
		fps=frames;
		frames=0;
	}
	 
	char tmp[64];
	memset(tmp,0,64);
	wsprintf(tmp,"fps:%d",fps);
	HDC hdc;
	m_pDisplay->GetBackBuffer()->GetDC(&hdc);
	SetTextColor(hdc,RGB(255,255,255));
	SetBkMode(hdc,TRANSPARENT);
	::TextOut(hdc,10,10,tmp,strlen(tmp));
	char editstat[32];
	memset(editstat,0,32);
	if(this->m_bIsEdit)
	{
		if(this->m_dwCurrentEditLayer==LOA_MAP_LAYER_GROUND)
			wsprintf(editstat,"地表层");
		else if(this->m_dwCurrentEditLayer==LOA_MAP_LAYER_OBJ_1)
			wsprintf(editstat,"物体层1");
		else
			wsprintf(editstat,"物体层2");
	}
	else
	{
		wsprintf(editstat,"选择图块");
	}
	char strRndBattle[32];
	if(m_pMap)
	{
		if(m_pMap->m_head.bRandomBattle==1)
			strcpy(strRndBattle,"是");
		else
			strcpy(strRndBattle,"否");
	}
	else
	{
		strcpy(strRndBattle,"否");
	}
	wsprintf(tmp,"地图大小:%d,%d   是否允许随机战斗:%s 当前编辑:%d,%d,编辑状态:%s",
		this->s_dwNewMapWidth,this->s_dwNewMapHeight,
		strRndBattle,
		this->m_xdwCurrentEditTile+(this->m_xEditStart>>5),
		this->m_ydwCurrentEditTile+(this->m_yEditStart>>5),
		editstat);
	::TextOut(hdc,10,30,tmp,strlen(tmp));
	wsprintf(tmp,"鼠标在客户区的坐标:%d,%d",pt.x,pt.y);
	::TextOut(hdc,10,50,tmp,strlen(tmp));
	m_pDisplay->GetBackBuffer()->ReleaseDC(hdc);

	m_pDisplay->Present();
}
//-----------------------------------------------------------------------------------
//主循环
//-----------------------------------------------------------------------------------
int CMapEditor::MainLoop()
{
	if(!InitSurface("tiles\\ani.ini"))
		return false;
	m_pMap=new CMap(m_pLog);
	if(!m_pMap)
	{
		m_pLog->WriteMessage("New CMap Failed!\n");
		return false;
	}
	if(!m_pMap->NewMap(40,30))
	{
		m_pLog->WriteMessage("New Map Failed!\n");
		return false;
	}
	SendMessage(m_hWnd,UM_SETCLASS,(WPARAM)this,0);
	MSG msg;
	HACCEL hAccelTable;
	hAccelTable=::LoadAccelerators(m_hInstance,MAKEINTRESOURCE(IDR_ACC));
	while(1)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
			if(!GetMessage(&msg, NULL,0,0)) 
				return msg.wParam;
			if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
			{
				TranslateMessage(&msg); 
				DispatchMessage(&msg);
			}
		}
		else if(m_bActive)
		{
			OnMouseMove();
			UpdateScreen();		
		}
		else
			WaitMessage();
	}
	return 1;
}

⌨️ 快捷键说明

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