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

📄 cgamedata.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏数据管理模块
//CGameData.cpp
//游戏引擎中的数据管理部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/20 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include"CGameData.h"
#include"CGoods.h"
#include"CError.h"
#include"CRole.h"
#include"CMacro.h"
#include<stdio.h>
#include"CGame.h"
#include"CEffect.h"
#include"CDatabase.h"
////////////////////////////////////////////////////////////////////////////////////////////
//构造
////////////////////////////////////////////////////////////////////////////////////////////
CGameData::CGameData(CLog*pLog)
{
	m_pLog=pLog;
	m_bOwnLog=false;
	if(!m_pLog)
	{
		m_pLog=new CLog("GameDataDebug.txt");
		m_bOwnLog=true;
	}

}
////////////////////////////////////////////////////////////////////////////////////////////
//从魔法数据库文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadEffectFromFile(CGame*pGame,char*szFile,int ID,STEffect*pEffect)
{
	LOA_ASSERT(szFile!=NULL);
	LOA_ASSERT(pEffect);
	LOA_ASSERT(pGame);

	char szID[32];
	memset(szID,0,32);
	wsprintf(szID,"%d",ID);													//把ID转换为字符串
	
	pEffect->ID=ID;
	pEffect->dwDelay=::GetPrivateProfileInt(szID,"Delay",100,szFile);
	pEffect->AlWaysShowFrameID=::GetPrivateProfileInt(szID,"AlwaysShow",-1,szFile);
	char szPicName[256];
	memset(szPicName,0,256);
	::GetPrivateProfileString(szID,"EffectPic","",szPicName,256,szFile);
	if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&pEffect->pSurface,szPicName,0,0)))
	{
		pGame->GetLog()->WriteMessage("Create Effect Surface From File<%s> Failed!",szPicName);
		return false;
	}
	char szString[256];
	memset(szString,0,256);
	::GetPrivateProfileString(szID,"PicColorKey","",szString,256,szFile);
	int r,g,b;
	sscanf(szString,"%d,%d,%d",&r,&g,&b);
	pEffect->pSurface->SetColorKey(RGB(r,g,b));

	char szSoundName[256];
	memset(szSoundName,0,256);
	::GetPrivateProfileString(szID,"Sound","",szSoundName,256,szFile);
	pGame->GetSoundPlayer()->Create(&pEffect->pSound,szSoundName);


	pEffect->nFrames=::GetPrivateProfileInt(szID,"AllFrames",0,szFile);
	pEffect->aRect=new RECT[pEffect->nFrames];
	pEffect->aFrameOffsiteX=new int[pEffect->nFrames];
	pEffect->aFrameOffsiteY=new int[pEffect->nFrames];
	if(!pEffect->aRect || !pEffect->aFrameOffsiteX || !pEffect->aFrameOffsiteY)
		return false;
	RECT rect;
	char szKeyName[256];
	for(int i=0;i<pEffect->nFrames;i++)
	{
		memset(szString,0,256);
		memset(szKeyName,0,256);
		wsprintf(szKeyName,"rect_%d",i+1);
		::GetPrivateProfileString(szID,szKeyName,"",szString,256,szFile);

		sscanf(szString,"%d,%d,%d,%d",&rect.left,&rect.top,&rect.right,&rect.bottom);
		pEffect->aRect[i]=rect;
		wsprintf(szKeyName,"xOffsite_%d",i+1);
		pEffect->aFrameOffsiteX[i]=::GetPrivateProfileInt(szID,szKeyName,0,szFile);
		wsprintf(szKeyName,"yOffsite_%d",i+1);
		pEffect->aFrameOffsiteY[i]=::GetPrivateProfileInt(szID,szKeyName,0,szFile);
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从魔法数据库文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadMagicFromFile(CGame*pGame,char*szFile,int ID,STMagic*pMagic)
{
	LOA_ASSERT(szFile!=NULL);
	LOA_ASSERT(pMagic);
	LOA_ASSERT(pGame);

	char szID[32];
	memset(szID,0,32);
	wsprintf(szID,"%d",ID);													//把ID转换为字符串
	pMagic->nChangeHp=::GetPrivateProfileInt(szID,"ChangeHp",-1,szFile);	//得到改变的Hp值
	pMagic->nChangeMp=::GetPrivateProfileInt(szID,"ChangeMp",-1,szFile);	//得到改变的Mp值
	pMagic->ID=ID;
	pMagic->bToAll=::GetPrivateProfileInt(szID,"bToAll",false,szFile);
	pMagic->dwOldTime=0;
	pMagic->dwDelay=::GetPrivateProfileInt(szID,"Delay",100,szFile);
	memset(pMagic->szName,0,32);
	::GetPrivateProfileString(szID,"Name","",pMagic->szName,32,szFile);		//得到名字
	memset(pMagic->szIntroduce,0,256);
	::GetPrivateProfileString(szID,"Introduce","",pMagic->szIntroduce,256,szFile);//得到该魔法的简单说明

	char szPicName[256];
	memset(szPicName,0,256);
	::GetPrivateProfileString(szID,"MagicPic","",szPicName,256,szFile);
	if(FAILED(pGame->GetDisplay()->CreateSurfaceFromBitmap(&pMagic->pSurface,szPicName,0,0)))
	{
		pGame->GetLog()->WriteMessage("Create Magic Surface From File<%s> Failed!",szPicName);
		return false;
	}
	char szString[256];
	memset(szString,0,256);
	::GetPrivateProfileString(szID,"PicColorKey","",szString,256,szFile);
	int r,g,b;
	sscanf(szString,"%d,%d,%d",&r,&g,&b);
	pMagic->pSurface->SetColorKey(RGB(r,g,b));

	char szSoundName[256];
	memset(szSoundName,0,256);
	::GetPrivateProfileString(szID,"Sound","",szSoundName,256,szFile);
	pGame->GetSoundPlayer()->Create(&pMagic->pSound,szSoundName);


	pMagic->nFrames=::GetPrivateProfileInt(szID,"AllFrames",0,szFile);
	pMagic->aRect=new RECT[pMagic->nFrames];
	if(!pMagic->aRect)
		return false;
	RECT rect;
	char szKeyName[256];
	for(int i=0;i<pMagic->nFrames;i++)
	{
		memset(szString,0,256);
		memset(szKeyName,0,256);
		wsprintf(szKeyName,"rect_%d",i+1);
		::GetPrivateProfileString(szID,szKeyName,"",szString,256,szFile);

		sscanf(szString,"%d,%d,%d,%d",&rect.left,&rect.top,&rect.right,&rect.bottom);
		pMagic->aRect[i]=rect;
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//从物品文件中读取数据
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::LoadGoodsFromFile(char*szFile,int ID,STGood*good)
{
	LOA_ASSERT(szFile!=NULL);
	LOA_ASSERT(good);

	char szID[32];
	memset(szID,0,32);
	wsprintf(szID,"%d",ID);													//把ID转换为字符串
	good->AddHp=::GetPrivateProfileInt(szID,"AddHp",0,szFile);				//得到增加的Hp值
	good->AddMaxHp=::GetPrivateProfileInt(szID,"AddMaxHp",0,szFile);		//得到增加Hp上限的值
	good->AddMaxMp=::GetPrivateProfileInt(szID,"AddMaxMp",0,szFile);		//得到增加Mp上限的值
	good->AddMp=::GetPrivateProfileInt(szID,"AddMp",0,szFile);				//得到增加的Mp值
	
	if(good->AddHp==0 && good->AddMaxHp==0 
		&& good->AddMaxMp==0 && good->AddMp==0)								//如果找不到数据
		return false;
	good->ID=ID;															//设置ID
	good->dwPrice=::GetPrivateProfileInt(szID,"Price",0,szFile);
	memset(good->szName,0,32);
	::GetPrivateProfileString(szID,"Name","",good->szName,32,szFile);		//得到名字
	memset(good->szIntroduce,0,256);
	::GetPrivateProfileString(szID,"Introduce","",good->szIntroduce,256,szFile);
																			//得到该物品的简单说明
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//创建魔法数据库
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::CreateMagicDataBase(CGame*pGame,char*szDataFile,IDataBase<STMagic>**pdbMagic)
{
	LOA_ASSERT(szDataFile);
	LOA_ASSERT(pdbMagic);
	LOA_ASSERT(pGame);
	if(!(*pdbMagic))
	{
		(*pdbMagic)=IDataBase<STMagic>::ForeCreate();
	}
	char strID[4096];
	memset(strID,0,4096);
	::GetPrivateProfileString("ALLMAGICID","IDS","",strID,4096,szDataFile); //得到所有ID
	if(strcmp("",strID)==0)
	{
		m_pLog->WriteMessage("错误的魔法数据文件!\n");
		return false;
	}
	char temp[128];
	int i=0;
	int j=0;
	int magicID;
	STMagic*pMagic;
	while(strID[i])
	{
		pMagic=new STMagic;
		memset(temp,0,128);
		j=0;
		while(strID[i]!=',' && strID[i]!='\0')								//得到string类型的一个ID
		{
			temp[j++]=strID[i];
			i++;
		}
		i++;																//跳过逗号
		sscanf(temp,"%d",&magicID);											//得到ID
		if(!LoadMagicFromFile(pGame,szDataFile,magicID,pMagic))
		{
			m_pLog->WriteMessage("Can't Get Data(%d) While Init Magic DataBase!\n",magicID);
		}
		else
		{
			(*pdbMagic)->AddData(magicID,pMagic);								//添加该魔法
		}
	}
	return true;
}
////////////////////////////////////////////////////////////////////////////////////////////
//创建物品数据库
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CGameData::CreateGoodsDataBase(char*szDataFile,IDataBase<STGood>**pdbData)
{
	LOA_ASSERT(szDataFile!=NULL);

⌨️ 快捷键说明

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