📄 cgraph.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏图形管理模块
//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 + -