📄 crole.cpp
字号:
//--------------------------------------------------------------------------------------------------------
// 游戏角色模块
//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 + -