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

📄 crole.cpp

📁 一个个人开发的rpg游戏<亚特兰蒂斯传奇>的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//--------------------------------------------------------------------------------------------------------
//                        游戏角色模块
//CRole.cpp
//游戏引擎中的角色部分
//作者:吴振华(kylinx)(中国科大01级11系)
//E-mail:game-diy@163.com
//创建于:2003/6/16 by Kylinx
//--------------------------------------------------------------------------------------------------------
#include<math.h>
#include"CGoods.h"
#include"CMagic.h"
#include"CRole.h"
#include"CGame.h"
#include"CMap.h"
#include"CMessage.h"
#include"CError.h"
#include"CMacro.h"
#include"CGraph.h"
CRole::CRole()
{
	memset(this,sizeof(CRole),0);
	this->nLayer=3;
	this->bShow=true;
	this->bDead=false;
}
CRole::~CRole()
{
	Path.~STPath();
}
////////////////////////////////////////////////////////////////////////////////////////////
//升级
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::LevelUp()								//当然只是针对player了 
{
	if(Level>60)									//最多60级
	{
		Exp=MaxExp;
		return;
	}

	Level++;
	MaxExp+=Level*50;								//暂时这样计算最大经验值
	
	MaxHp+=50;										//暂时这样计算最大HP
	Hp=MaxHp;

	MaxMp+=40;										//暂时这样计算最大MP
	Mp=MaxMp;			
	
	BasicDefend+=10;								//暂时这样计算
	BasicAttack+=15;								//暂时这样计算

	Smart+=10;										//暂时这样计算

	Attack=BasicAttack+WeaponAttack;				//计算总攻击力
	Defend=BasicDefend+DefendDefend;				//计算总防御力
}
////////////////////////////////////////////////////////////////////////////////////////////
//增加经验
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::AddExp(int exp)
{
	Exp+=exp;
	while(Exp>MaxExp)					
	{
		LevelUp();
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//防具等级增加
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::DefendLevelUp()
{
	if(DefendLevel>=10)								//最多10级
	{
		DefendExp=DefendMaxExp;
		return;
	}
	DefendLevel++;
	DefendMaxExp+=DefendLevel*200;					//暂时这样计算

	DefendDefend+=50;								//暂时这样计算

	Defend=BasicDefend+DefendDefend;				//计算总防御力
}
////////////////////////////////////////////////////////////////////////////////////////////
//增加防具的经验
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::AddDefendExp(int exp)
{
	DefendExp+=exp;
	while(DefendExp>DefendMaxExp)
	{
		DefendLevelUp();
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//武器升级
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::WeaponLevelUp()
{
	if(WeaponLevel>=10)
	{
		WeaponExp=WeaponMaxExp;
		return;
	}
	WeaponLevel++;
	WeaponMaxExp+=WeaponLevel*300;

	WeaponAttack+=80;

	Attack=BasicAttack+WeaponAttack;						//计算总攻击力

}
////////////////////////////////////////////////////////////////////////////////////////////
//增加武器经验
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::AddWeaponExp(int exp)
{
	WeaponExp+=exp;
	while(WeaponExp>WeaponMaxExp)
	{
		WeaponLevelUp();
	}
}
////////////////////////////////////////////////////////////////////////////////////////////
//增加物品
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRole::AddGoods(int GoodsIndex)
{
	if(GoodsNum>=LOA_MAX_CARRY_GOODS)
		return FALSE;
	GoodsNum++;
	GoodsData[GoodsNum-1]=GoodsIndex;
	return true;
}
void CRole::UseGood(STGood*pGood)
{
	LOA_ASSERT(pGood);

	Hp+=pGood->AddHp;
	Mp+=pGood->AddMp;
	this->MaxHp+=pGood->AddMaxHp;
	this->MaxMp+=pGood->AddMaxMp;
	if(Hp>MaxHp)
		Hp=MaxHp;
	if(Mp>MaxMp)
		Mp=MaxMp;
}
void CRole::UseMagicInMenu(STMagic*pMagic)
{
	LOA_ASSERT(pMagic);

	Hp+=pMagic->nChangeHp;
	Mp+=pMagic->nChangeMp;
	if(Hp>MaxHp)
		Hp=MaxHp;
	if(Mp>MaxMp)
		Mp=MaxMp;
}
////////////////////////////////////////////////////////////////////////////////////////////
//删除物品
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::DelGoods(int ArrayIndex)						//这里不做边界检查,由其它部分来做
{
	for(int i=ArrayIndex;i<=GoodsNum-1;i++)
	{
		GoodsData[i]=GoodsData[i+1];
	}
	GoodsNum--;
}
////////////////////////////////////////////////////////////////////////////////////////////
//增加魔法
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRole::AddMagic(int MagicIndex)
{
	if(MagicNum>=LOA_MAX_MAGIC)
		return FALSE;
	MagicData[MagicNum]=MagicIndex;
	MagicNum++;
	return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////
//增加或者减少money
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::AddMoney(int Money)
{
	this->Money+=Money;
	if(this->Money<0)
		this->Money=0;
}

////////////////////////////////////////////////////////////////////////////////////////////
//攻击pRole
////////////////////////////////////////////////////////////////////////////////////////////
int CRole::AttackRole(CRole*pRole)
{

	LOA_ASSERT(pRole);
	if(pRole->Level==0)
		pRole->Level=1;
	if(Level==0)
		Level=1;
	int RealAttack=Attack-pRole->Defend+rand()%Level-rand()%pRole->Level;		//暂时这样计算
	if(RealAttack<pRole->Level)
		RealAttack=rand()%pRole->Level;

	pRole->Hp-=RealAttack;
	if(pRole->Hp<=0)
	{
		pRole->Hp=0;
		pRole->bDead=TRUE;
	}
	return RealAttack;
}
////////////////////////////////////////////////////////////////////////////////////////////
//防御pRole的攻击
////////////////////////////////////////////////////////////////////////////////////////////
int CRole::DefendRole(CRole*pRole)
{
	LOA_ASSERT(pRole);

	return pRole->AttackRole(this);
}
////////////////////////////////////////////////////////////////////////////////////////////
//是否显示角色
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::ShowRole(BOOL bShow)
{
	this->bShow=bShow;
}
////////////////////////////////////////////////////////////////////////////////////////////
//设置角色坐标
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::SetRolePostion(int x,int y)
{
	this->x=x;
	this->y=y;
}
////////////////////////////////////////////////////////////////////////////////////////////
//设置角色方向
////////////////////////////////////////////////////////////////////////////////////////////
void CRole::SetDirection(int nDir)
{
	this->nDirection=nDir;
}
////////////////////////////////////////////////////////////////////////////////////////////
//在范围rtArea内移动角色1步
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRole::MoveRole(RECT *prtArea,CGame*pGame)
{
	LOA_ASSERT(prtArea);
	LOA_ASSERT(pGame);

	MoveAni();														//角色动画
	int tempx=x;
	int tempDeltaX=DeltaX;
	int tempy=y;
	int tempDeltyY=DeltaY;
	int tempOffsiteOk=bOffsiteOk;									//保存旧的状态
	switch(nDirection)
	{
	case LOA_ROLE_DIR_LEFT:											//左边
		{
			x-=Speed;												//往左移动
			
			DeltaX-=Speed;											//计算偏移
		 															//判断范围
		 
			if(x<prtArea->left)
			{
				x=prtArea->left;
				DeltaX=0;
			}
		 
			if(DeltaX<=-32)											//如果偏移到位了
			{
				x-=DeltaX+32;										//调整位置
				
				DeltaX=0;											//设置偏移量为0
			}
			if(DeltaX==0)
			{
				
				bOffsiteOk=true;									//移动到位了
			}
			else
			{
				bOffsiteOk=false;
			}
		}
		break;
	case LOA_ROLE_DIR_DOWN:
		{
			y+=Speed;
			
			DeltaY+=Speed;
			
			 
			if(y>prtArea->bottom-32)
			{
				y=prtArea->bottom-32;
				DeltaY=0;
			}
			 
			if(DeltaY>=32)
			{
				y-=DeltaY-32;
				DeltaY=0;
				
			}
			if(DeltaY==0)								
			{
				bOffsiteOk=true;
				
			}
			else
			{
				bOffsiteOk=false;
			}
		}
		break;
	case LOA_ROLE_DIR_RIGHT:
		{
			x+=Speed;
			
			DeltaX+=Speed;
			 
			if(x>prtArea->right-32)
			{
				x=prtArea->right-32;
				DeltaX=0;
			}
			 
			if(DeltaX>=32)
			{
				x-=DeltaX-32;
				DeltaX=0;
				
			}
			if(DeltaX==0)
			{
				bOffsiteOk=true;
				
			}
			else
			{
				bOffsiteOk=false;
			}
		}
		break;
	case LOA_ROLE_DIR_UP:
		{
			y-=Speed;
			
			DeltaY-=Speed;
			 
			if(y<prtArea->top)							//按脚的坐标算
			{
				y=prtArea->top;
				DeltaY=0;
			}
		 
			if(DeltaY<=-32)
			{
				y-=DeltaY+32;
				DeltaY=0;
				
			}
			if(DeltaY==0)
			{
				bOffsiteOk=true;
				
			}
			else
			{
				bOffsiteOk=false;
			}
			
		}
		break;
	}
	 
	if(pGame->GetPlayer()->pRole!=this)
	{
		if(IsRoleComboRole(pGame->GetPlayer()->pRole))
		{
			x=tempx;
			DeltaX=tempDeltaX;
			y=tempy;
			DeltaY=tempDeltyY;
			bOffsiteOk=tempOffsiteOk;

			switch(nDirection)
			{
			case LOA_ROLE_DIR_UP:
				nDirection=LOA_ROLE_DIR_DOWN;
				break;
			case LOA_ROLE_DIR_DOWN:
				nDirection=LOA_ROLE_DIR_UP;
				break;
			case LOA_ROLE_DIR_RIGHT:
				nDirection=LOA_ROLE_DIR_LEFT;
				break;
			case LOA_ROLE_DIR_LEFT:
				nDirection=LOA_ROLE_DIR_RIGHT;
				break;
			}
			return true;
		}
	}
	DWORD dwTempAddr=pGame->GetNpcList()->GetCurAddress();
	pGame->GetNpcList()->ResetToHead();
	STRenderRole*pNpc;
	while(pGame->GetNpcList()->GetAndMovePointToNext(pNpc))
	{
		if(pNpc->pRole!=this)
		{
			if(IsRoleComboRole(pNpc->pRole))
			{
				x=tempx;
				DeltaX=tempDeltaX;
				y=tempy;
				DeltaY=tempDeltyY;
				bOffsiteOk=tempOffsiteOk;

				if(pGame->GetPlayer()->pRole!=this)
				{
					switch(nDirection)
					{
					case LOA_ROLE_DIR_UP:
						nDirection=LOA_ROLE_DIR_DOWN;
						break;
					case LOA_ROLE_DIR_DOWN:
						nDirection=LOA_ROLE_DIR_UP;
						break;
					case LOA_ROLE_DIR_RIGHT:
						nDirection=LOA_ROLE_DIR_LEFT;
						break;
					case LOA_ROLE_DIR_LEFT:
						nDirection=LOA_ROLE_DIR_RIGHT;
						break;
					}
				}
				pGame->GetNpcList()->SetCurAddress(dwTempAddr);
				return true;
			}
		}
	}
	pGame->GetNpcList()->SetCurAddress(dwTempAddr);
	return true;
}
void CRole::MoveAni()
{
	if(timeGetTime()-dwOldTime<this->dwFramsDelay)
		return;

	this->dwOldTime=timeGetTime();
	this->nCurrentStepFrames++;
	if(this->nCurrentStepFrames>this->nMaxStepFrames)
		this->nCurrentStepFrames=0;
}
////////////////////////////////////////////////////////////////////////////////////////////
//利用A*算法得到的路径,移动角色到x,y
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CRole::MoveTo(CLog*pLog,CGame*pGame,int cx,int cy)
{
	LOA_ASSERT(pGame);

	if(!bMoving)											//如果还没有开始移动
	{
		this->DestPosX=cx;									//设置目标点
		this->DestPosY=cy;
	}
	
	RECT rtMap;
	::SetRect(&rtMap,0,0,pGame->GetMap()->m_head.Width<<5,pGame->GetMap()->m_head.Height<<5);
	
	if(this->OldDestPosX==this->DestPosX 
		&& this->OldDestPosY==this->DestPosY)				//如果还是相同的目标,不用再次寻路
	{
		
		if(this->nCurrentPathStep>=Path.nLength)			//如果路径完了

⌨️ 快捷键说明

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