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

📄 cgraph.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏图形管理模块
//CGraph.cpp
//游戏引擎中的图形管理部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/23 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include<stdio.h>
#include"CGraph.h"
#include"CError.h"
#include"CRole.h"
#include"CMap.h"
#include"CMacro.h"
#include"CFont.h"
STRoleGraph::~STRoleGraph()
{
	 
	if(pSurfMove)
	{
		delete pSurfMove;
		pSurfMove=NULL;
	}
	if(pSurfHead)
	{
		delete pSurfHead;
		pSurfHead=NULL;
	}

}
STRenderRole::~STRenderRole()
{
	if(pRole)
	{
		delete pRole;
		pRole=NULL;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//构造
////////////////////////////////////////////////////////////////////////////////////////////
CRoleGraph::CRoleGraph(CLog*pLog)
{
	m_pLog=pLog;
	m_bOwnLog=false;
	if(!m_pLog)
	{
		m_pLog=new CLog("RoleGraphLog.txt",true);
		m_bOwnLog=true;
	}
	m_pdbGraph=IDataBase<STRoleGraph>::ForeCreate();
	if(!m_pdbGraph)														//初始化
	{
		m_pLog->WriteMessage("Create Role Graph Data Base...FAILED!\n");
	}
	else
	{
		m_pLog->WriteMessage("Create Role Graph Data Base...ok!\n");
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//析构
////////////////////////////////////////////////////////////////////////////////////////////
CRoleGraph::~CRoleGraph()
{
	Release();
	if(m_bOwnLog)
	{
		if(m_pLog)
		{
			delete m_pLog;
			m_pLog=NULL;
		}
	}
	delete m_pdbGraph;
	m_pdbGraph=NULL;
}
////////////////////////////////////////////////////////////////////////////////////////////
//释放
////////////////////////////////////////////////////////////////////////////////////////////
void CRoleGraph::Release()
{
	m_pdbGraph->Release();
}

////////////////////////////////////////////////////////////////////////////////////////////
//得到角色数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRoleGraph::GetRoleGraph(const CRole*pRole,STRoleGraph**pRoleGraph)
{
	LOA_ASSERT(pRole);
	LOA_ASSERT(pRoleGraph);

	return m_pdbGraph->FindData(pRole->nID,pRoleGraph); 		//得到角色图像信息
}
////////////////////////////////////////////////////////////////////////////////////////////
//初始化角色数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRoleGraph::InitRoleData(CDisplay*pDisplay,const char*szFile)
{
	LOA_ASSERT(pDisplay);
	LOA_ASSERT(szFile);

	Release();

	char szNames[1024];
	memset(szNames,0,1024);
	::GetPrivateProfileString("名字","names","",szNames,1024,szFile);
	if(strcmp(szNames,"")==0)
	{
		m_pLog->WriteMessage("文件%s的[名字]中找不到names的关键字",szFile);
		return false;
	}
	char temp[128];
	int i=0;
	int j=0;
	char picName[128];

	STRoleGraph*pRoleGraph;
	while(szNames[i])
	{
		memset(temp,0,128);
		
		j=0;
		while(szNames[i]!=',' && szNames[i]!='\0')
		{
			temp[j++]=szNames[i];
			i++;
		}
		i++;																//跳过逗号


		pRoleGraph=new STRoleGraph;
		pRoleGraph->ID=::GetPrivateProfileInt(temp,"id",0,szFile);			//得到ID
		if(0!=pRoleGraph->ID)
		{
			
			memset(picName,0,128);
			::GetPrivateProfileString(temp,"pic","",picName,128,szFile);	//得到角色走图文件
			if(FAILED(pDisplay->CreateSurfaceFromBitmap(&pRoleGraph->pSurfMove,picName,0,0)))
			{
				m_pLog->WriteMessage("创建角色表面失败!Key=(%s,%s)\n",szFile,picName);
				return false;
			}
			memset(picName,0,128);
			::GetPrivateProfileString(temp,"picColorKey","255,0,255",picName,128,szFile);
																			//得到角色走图关键色,墨认为RGB(255,0,255)
			int r,g,b;
			sscanf(picName,"%d,%d,%d",&r,&g,&b);
			pRoleGraph->pSurfMove->SetColorKey(RGB(r,g,b));					//设置关键色

			memset(picName,0,128);
			::GetPrivateProfileString(temp,"headpic","",picName,128,szFile);
			if(strcmp(picName,"")!=0)										//如果有头像文件
			{
				if(FAILED(pDisplay->CreateSurfaceFromBitmap(&pRoleGraph->pSurfHead,picName,0,0)))
				{
					m_pLog->WriteMessage("创建角色头像表面失败!Key=(%s,%s)\n",szFile,picName);
					return false;
				}
				memset(picName,0,128);
				::GetPrivateProfileString(temp,"HeadPicColorKey","255,0,255",picName,128,szFile);
																			//得到角色头像关键色,墨认为RGB(255,0,255)
				sscanf(picName,"%d,%d,%d",&r,&g,&b);
				pRoleGraph->pSurfHead->SetColorKey(RGB(r,g,b));				//设置关键色
			}
				
			

		}
		else
		{
			m_pLog->WriteMessage("得到角色<%s>的ID<%d>失败!\n",temp,pRoleGraph->ID);
			return false;
		}
		if(!m_pdbGraph->AddData(pRoleGraph->ID,pRoleGraph))
		{
			m_pLog->WriteMessage("添加角色<%s>到角色数据库中...Failed!\n",temp);
			return false;
		}
	}
	return true;
}
//////////////////////////////////////////////////////////////////////////////////////////////
CRenderRole::CRenderRole():CRenderTask()
{
	m_pMapSurf=NULL;
	m_pRenderMap=NULL;
	m_pMap=NULL;
	m_pDisplay=NULL;
	m_pRoleQueue=NULL;
}
CRenderRole::~CRenderRole()
{
	Release();
}
BOOL CRenderRole::InitRender(CDisplay*pDisplay,CMap*pMap,CMapSurface*pMapSurf,CRenderMap*pRenderMap,CLagQueue<STRenderRole*>*pRoleQueue)
{
	LOA_ASSERT(pDisplay);
	LOA_ASSERT(pMap);
	LOA_ASSERT(pMapSurf);
	LOA_ASSERT(pRenderMap);
	LOA_ASSERT(pRoleQueue);

	m_pMapSurf=pMapSurf;
	m_pRenderMap=pRenderMap;
	m_pMap=pMap;
	m_pDisplay=pDisplay;
	m_pRoleQueue=pRoleQueue;
	return true;
}
BOOL LOA_RENDER_API CRenderRole::IsRenderComplete()
{
	return true;
}

void LOA_RENDER_API CRenderRole::Release()
{

}
////////////////////////////////////////////////////////////////////////////////////////////
//显示角色
////////////////////////////////////////////////////////////////////////////////////////////
void LOA_RENDER_API CRenderRole::Render()
{

	
	STRenderRole*pRenderRole;
	int x,y;
	while(m_pRoleQueue->GetLength()>0)
	{
		m_pRoleQueue->DeQueue(pRenderRole);
		if(!pRenderRole->pRole->bShow)
			continue;
/*
		::SetRect(&rect,
				 pRenderRole->pRole->nCurrentStepFrames<<5,
			  	 pRenderRole->pRole->nDirection*48,
				 (pRenderRole->pRole->nCurrentStepFrames+1)<<5,
				 (pRenderRole->pRole->nDirection+1)*48);
*/																						//得到区域
		m_pDisplay->AlphaBlt(pRenderRole->pRole->x-m_pRenderMap->m_xStart,
							 pRenderRole->pRole->y-m_pRenderMap->m_yStart,			
							 m_pMapSurf->GetShadowSurface()->GetDDrawSurface(),
							 NULL,true,16);												//显示影子
		m_pDisplay->ColorKeyBlt(
							pRenderRole->pRole->x-m_pRenderMap->m_xStart,
							pRenderRole->pRole->y-16-m_pRenderMap->m_yStart,			//减去16是因为图片高为48
							pRenderRole->pGraph->pSurfMove->GetDDrawSurface(),
							&pRenderRole->pRole->rect[pRenderRole->pRole->nDirection][pRenderRole->pRole->nCurrentStepFrames]);
																						//显示
		x=pRenderRole->pRole->x >> 5;													//得到格子
		y=(int)((pRenderRole->pRole->y-16)/32);
		if(y<0)
			y=0;
		if(x<0)
			x=0;
		RECT rect2;
		
		if(m_pMap->m_ppTile[x][y].IDObj_1!=255 && m_pMap->m_ppTile[x][y].Layer1 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
		{
			//角色当前的格子,如果有层次比角色高的物体的话			
			::SetRect(&rect2,m_pMap->m_ppTile[x][y].xObj_1<<5,
							m_pMap->m_ppTile[x][y].yObj_1<<5,
							(m_pMap->m_ppTile[x][y].xObj_1+1)<<5,
							(m_pMap->m_ppTile[x][y].yObj_1+1)<<5);
			m_pDisplay->AlphaBlt((x<<5) - m_pRenderMap->m_xStart,		//x坐标
								 (y<<5) - m_pRenderMap->m_yStart,
								 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[x][y].IDObj_1]->GetDDrawSurface(),
								 &rect2,
								 true,
								 16);
		}
		if(m_pMap->m_ppTile[x][y].IDObj_2!=255 && m_pMap->m_ppTile[x][y].Layer2 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
		{
			::SetRect(&rect2,m_pMap->m_ppTile[x][y].xObj_2<<5,
							m_pMap->m_ppTile[x][y].yObj_2<<5,
							(m_pMap->m_ppTile[x][y].xObj_2+1)<<5,
							(m_pMap->m_ppTile[x][y].yObj_2+1)<<5);
			m_pDisplay->AlphaBlt((x<<5) - m_pRenderMap->m_xStart,		//x坐标
								 (y<<5) - m_pRenderMap->m_yStart,
								 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[x][y].IDObj_2]->GetDDrawSurface(),
								 &rect2,
								 true,
								 16);
		}
		if(x+1<m_pMap->m_head.Width)
		{
			int TempX=x+1;
			
			if(m_pMap->m_ppTile[TempX][y].IDObj_1!=255 && m_pMap->m_ppTile[TempX][y].Layer1 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{
				//角色右边一格的格子,如果有层次比角色高的物体的话	
				::SetRect(&rect2,m_pMap->m_ppTile[TempX][y].xObj_1<<5,
								m_pMap->m_ppTile[TempX][y].yObj_1<<5,
								(m_pMap->m_ppTile[TempX][y].xObj_1+1)<<5,
								(m_pMap->m_ppTile[TempX][y].yObj_1+1)<<5);
				m_pDisplay->AlphaBlt((TempX<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (y<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[TempX][y].IDObj_1]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
			if(m_pMap->m_ppTile[TempX][y].IDObj_2!=255 && m_pMap->m_ppTile[TempX][y].Layer2 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{
				::SetRect(&rect2,m_pMap->m_ppTile[TempX][y].xObj_2<<5,
								m_pMap->m_ppTile[TempX][y].yObj_2<<5,
								(m_pMap->m_ppTile[TempX][y].xObj_2+1)<<5,
								(m_pMap->m_ppTile[TempX][y].yObj_2+1)<<5);
				m_pDisplay->AlphaBlt((TempX<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (y<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[TempX][y].IDObj_2]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
		}
		if(y+1 < m_pMap->m_head.Height)
		{
			int TempY=y+1;
			
			//角色左下方的格子
			if(m_pMap->m_ppTile[x][TempY].IDObj_1!=255 && m_pMap->m_ppTile[x][TempY].Layer1 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{	
				::SetRect(&rect2,m_pMap->m_ppTile[x][TempY].xObj_1<<5,
							m_pMap->m_ppTile[x][TempY].yObj_1<<5,
							(m_pMap->m_ppTile[x][TempY].xObj_1+1)<<5,
							(m_pMap->m_ppTile[x][TempY].yObj_1+1)<<5);
				m_pDisplay->AlphaBlt((x<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (TempY<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[x][TempY].IDObj_1]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
			if(m_pMap->m_ppTile[x][TempY].IDObj_2!=255 && m_pMap->m_ppTile[x][TempY].Layer2 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{	
				::SetRect(&rect2,m_pMap->m_ppTile[x][TempY].xObj_2<<5,
							m_pMap->m_ppTile[x][TempY].yObj_2<<5,
							(m_pMap->m_ppTile[x][TempY].xObj_2+1)<<5,
							(m_pMap->m_ppTile[x][TempY].yObj_2+1)<<5);
				m_pDisplay->AlphaBlt((x<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (TempY<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[x][TempY].IDObj_2]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
		}
		if(x+1<m_pMap->m_head.Width && y+1 < m_pMap->m_head.Height)
		{
			int TempX=x+1;
			int TempY=y+1;
			
			//角色右下方的格子
			if(m_pMap->m_ppTile[TempX][TempY].IDObj_1!=255 && m_pMap->m_ppTile[TempX][TempY].Layer1 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{	
				::SetRect(&rect2,m_pMap->m_ppTile[TempX][TempY].xObj_1<<5,
							m_pMap->m_ppTile[TempX][TempY].yObj_1<<5,
							(m_pMap->m_ppTile[TempX][TempY].xObj_1+1)<<5,
							(m_pMap->m_ppTile[TempX][TempY].yObj_1+1)<<5);
				m_pDisplay->AlphaBlt((TempX<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (TempY<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[TempX][TempY].IDObj_1]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
			if(m_pMap->m_ppTile[TempX][TempY].IDObj_2!=255 && m_pMap->m_ppTile[TempX][TempY].Layer2 > (DWORD)pRenderRole->pRole->nLayer )					//如果层次比角色的高
			{	
				::SetRect(&rect2,m_pMap->m_ppTile[TempX][TempY].xObj_2<<5,
							m_pMap->m_ppTile[TempX][TempY].yObj_2<<5,
							(m_pMap->m_ppTile[TempX][TempY].xObj_2+1)<<5,
							(m_pMap->m_ppTile[TempX][TempY].yObj_2+1)<<5);
				m_pDisplay->AlphaBlt((TempX<<5) - m_pRenderMap->m_xStart,		//x坐标
									 (TempY<<5) - m_pRenderMap->m_yStart,
									 m_pMapSurf->m_aSurface[m_pMap->m_ppTile[TempX][TempY].IDObj_2]->GetDDrawSurface(),
									 &rect2,
									 true,
									 16);
			}
		}		
	}
	
}

////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
CMapSurface::CMapSurface() 
{
	m_pDisplay=NULL;

	m_pLog=NULL;
	m_aTileAni=NULL;

	for(int i=0;i<11;i++)
	{
		m_aSurface[i]=NULL;
	}
	m_bSurfCreated=false;
}
CMapSurface::~CMapSurface()
{
	if(m_aTileAni)
	{
		delete [] m_aTileAni;
		m_aTileAni=NULL;
	}
	if(m_pSurfShadow)
	{
		delete m_pSurfShadow;
		m_pSurfShadow=NULL;
	}
	for(int i=0;i<11;i++)
	{
		if(m_aSurface[i])
		{
			delete m_aSurface[i];
			m_aSurface[i]=NULL;
		}
	}
}

//-----------------------------------------------------------------------------------
//设置表面数据
//-----------------------------------------------------------------------------------
void CMapSurface::SetSurfaceValue()
{
	m_adwSurfaceWidth[0]=640;
	m_adwSurfaceWidth[1]=640;
	m_adwSurfaceWidth[2]=640;
	m_adwSurfaceWidth[3]=640;
	m_adwSurfaceWidth[4]=640;
	m_adwSurfaceWidth[5]=640;
	m_adwSurfaceWidth[6]=640;
	m_adwSurfaceWidth[7]=640;
	m_adwSurfaceWidth[8]=640;
	m_adwSurfaceWidth[9]=1280;
	m_adwSurfaceWidth[10]=640;							//AniTileSurface

	m_adwSurfaceHeight[0]=480;
	m_adwSurfaceHeight[1]=640;
	m_adwSurfaceHeight[2]=960;
	m_adwSurfaceHeight[3]=640;
	m_adwSurfaceHeight[4]=640;
	m_adwSurfaceHeight[5]=480;
	m_adwSurfaceHeight[6]=576;
	m_adwSurfaceHeight[7]=800;
	m_adwSurfaceHeight[8]=640;
	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);

⌨️ 快捷键说明

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