📄 role.cpp
字号:
State.oldY=State.Y;
//需要移动的距离
int mx=nx - Path[PathCurrentStep+1].x;
int my=ny - Path[PathCurrentStep+1].y;
if( mx == 0 && my>0 ) //上
{
State.CurrentDir=2;
MoveX=0; //x方向不需要移动
MoveY=-StepSize; //y方向移动一步的距离
}
else if( mx<0 && my==0 ) //右
{
State.CurrentDir=3;
MoveX=StepSize;
MoveY=0;
}
else if( mx==0 && my<0 ) //下
{
State.CurrentDir=0;
MoveX=0;
MoveY=StepSize;
}
else if( mx>0 && my==0 ) //左
{
State.CurrentDir=1;
MoveX=-StepSize;
MoveY=0;
}
//如果改变了方向就对齐中心点
if( State.CurrentDir!=State.LastDir )
{
State.x=subx; //直接更新
State.y=suby;
State.LastDir=State.CurrentDir; //保存方向
}
}
PathCurrentStep++; //步数加一
RunScript();
if(PathCurrentStep>1)
ChangeScene();
}
//滚屏
switch( State.CurrentDir )
{
case 1: //左:
//两种情况:(1)地图比屏幕大,并且人物走到了中心点的左边,而且这时地图的X点比0
//大(左边还有部分地图没有显示出来);(2)显示地图到头了,但还是有部分没有显示出来
if( State.x <= _point_x(map.Width-ShowCellW)+CenterX && (map.SX > 0
|| (map.SX==0 && map.DX<0) ) )
{
map.DX+=StepSize; //移动人物的一步距离
if( map.DX>0 ) //已经移动了一整个格子了
{
map.SX--; //再向左一个格子
map.DX-=CellWidth; //恢复DX的值
}
}
break;
case 3: //右,同样的逻辑
if( State.x >= CenterX && ( map.SX < map.Width-ShowCellW-1
|| (map.SX==map.Width-ShowCellW-2 && map.DX>=-CellWidth)) )
{
map.DX-=StepSize;
if( map.DX <= -CellWidth )
{
map.SX++;
map.DX+=CellWidth;
}
}
break;
case 2: //上,……
if( State.y <= _point_y(map.Height-ShowCellH)+CenterY &&( map.SY > 0
|| (map.SY==0 && map.DY<0) ) )
{
map.DY+=StepSize;
if( map.DY>0 )
{
map.SY--;
map.DY-=CellHeight;
}
}
break;
case 0: //下,不想说了:)
if( State.y >= CenterY && ( map.SY < map.Height-ShowCellH-1
|| (map.SY==map.Height-ShowCellH-2 && map.DY>=-CellHeight)) )
{
map.DY-=StepSize;
if( map.DY <= -CellHeight )
{
map.SY++;
map.DY+=CellHeight;
}
}
break;
}
State.x+=MoveX; //脚底位置更新
State.y+=MoveY;
role[0].State.X=_grid_x(role[0].State.x);
role[0].State.Y=_grid_y(role[0].State.y);
StepStep++;
if( StepStep==2 )
{
StepStep=0; //2步一次
State.CurrentStep=(State.CurrentStep+1)%(Max_Step);
}
}
}
//*******************************
//移动到某点
bool CRole::MoveTo(int lx, int ly)
{
CFindPath fp(&map);
fp.Init(map.Width,map.Height);
int Sx=State.X;
int Sy=State.Y;
//边界检查
if( lx < 0 )
lx=0;
else
if( lx >= _point_x(map.Width-1) )
lx=_point_x(map.Width-1)-1;
if( ly < 0 )
ly=0;
else
if( ly >= _point_y(map.Height-1) )
ly=_point_y(map.Height-1)-1;
//目的点坐标
DesX=_grid_x(lx);
DesY=_grid_y(ly);
//如果正在移动就把下一点做为起始点
if( bMoving )
{
Sx=Path[PathCurrentStep].x;
Sy=Path[PathCurrentStep].y;
::map.Block[Sx+Sy*::map.Width]=1;
}
//寻路成功
if( fp.Find(Sx, Sy, DesX, DesY) )
{
_DELETE_ARRAY( Path );
Path=new POINT[fp.TheSteps];
memcpy(Path, fp.ThePath, sizeof(POINT)*fp.TheSteps);
PathSteps=fp.TheSteps;
PathCurrentStep=0;
bMoving=true;
bCuted = FALSE;
bCancelTalk = false;
}
return false;
}
//*******************************
//移动到某点
void CRole::Goto(int lx, int ly)
{
//寻路
MoveTo(lx, ly);
//菜单循环
MSG msg;
while(bMoving)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage(&msg, NULL, 0, 0))
return;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
if(bActive)
{
//获取输入信息
GetInputData();
//延时控速
while( timeGetTime() < unsigned int(OldTick+DelayTick) ) {}
OldTick=timeGetTime();
//取主角的格子坐标
State.X=_grid_x(State.x);
State.Y=_grid_y(State.y);
//计算当前地图左上角坐标
map.sx=_point_x(map.SX)-map.DX;
map.sy=_point_y(map.SY)-map.DY;
map.ShowMap();
UpdateScreen();
Mouse.GetMouseData(); //获取鼠标立即信息
Key.GetKeyData(); //获取键盘缓冲数据(附带即时数据)
Key.GetKey();
ShowMouseCursor(lpDDSBack, false);
if( bShowFps)
{
nFrames++;
font.PrintText(lpDDSBack, 20, 460, "FPS:%d", CountSpeed());
}
_UpdateScreen();
}
else WaitMessage(); //等待消息
}
bMoving=false;
}
//**************************
//场景切换
void CRole::ChangeScene()
{
//得到人物的所在的格子坐标
int nx=map._GetCellX(State.x,State.y);
int ny=map._GetCellY(State.x,State.y);
//切换
int cp=map.Cell[map.Width*ny+nx].CP;
int cptype = map.Cell[map.Width*ny+nx].CPType;
if( cp != BLOCK_CP&&cptype) //切换点
{
char GpsFile[MAX_PATH];
memset(GpsFile,0, MAX_PATH);
sprintf(GpsFile,"%s%s", map.CurrentMapFilePath, map.Hook[cp]);
Script.Run( GpsFile ); //执行切换脚本
}
}
//**************************
//触发角色前一个格子中的开关
void CRole::RunScript()
{
int lx, ly;
switch( State.CurrentDir )
{
case 0: //下
lx=State.x;
ly=State.y+32;
break;
case 1: //左
lx=State.x-32;
ly=State.y;
break;
case 2: //上
lx=State.x;
ly=State.y-32;
break;
case 3: //右
lx=State.x+32;
ly=State.y;
break;
}
int nx=map._GetCellX(lx,ly);
int ny=map._GetCellY(lx,ly);
//越界
if( nx < 0 || ny < 0 )
return;
//切换
int cp=map.Cell[map.Width*ny+nx].CP;
int cptype = map.Cell[map.Width*ny+nx].CPType;
if( cp != BLOCK_CP&&cptype!=CP_CHANGE ) //陷阱要是个非切换型
{
char GpsFile[MAX_PATH];
memset(GpsFile,0, MAX_PATH);
sprintf(GpsFile,"%s%s", map.CurrentMapFilePath, map.Hook[cp]);
AdjustPosition(); //调整位置
Message.PutMessage(MSG_BREAK); //本次不运行
Script.Run( GpsFile ); //执行切换脚本
}
}
//-----------------------------------------------------------
//加入物体
void CRole::AddObject(char *name, int num)
{
int goods=CGoods::GetGoodsNum(name);
if(goods==-1)
return;
//如果是装备
if( CMenu::Goods.GOODS[goods].Class >=0
&& CMenu::Goods.GOODS[goods].Class <=1 )
{
AddArm(name, num);
return;
}
//已经有了就添加
for(int i=0; i<Propertiy.CurGoodsNum; i++)
{
if( Propertiy.Goods[i] == goods )
{
Propertiy.GoodsNum[i]+=num;
return;
}
}
//新物体
Propertiy.Goods[Propertiy.CurGoodsNum]=goods;
Propertiy.GoodsNum[Propertiy.CurGoodsNum]=num;
Propertiy.CurGoodsNum++;
}
//删除物体
void CRole::DelObject(char *name, int num)
{
int goods=CGoods::GetGoodsNum(name);
//如果是装备
if( CMenu::Goods.GOODS[goods].Class >=0
&& CMenu::Goods.GOODS[goods].Class <=1 )
{
DelArm(name, num);
return;
}
//是物品
if( goods != 0 )
{
for(int i=0; i<Propertiy.CurGoodsNum; i++)
{
if( Propertiy.Goods[i] == goods )
{
Propertiy.GoodsNum[i]-=num;
//把后面的物品向前移动一格
if( Propertiy.GoodsNum[i] <= 0 )
{
int tmp;
Propertiy.CurGoodsNum--;
for(int j=i; j<Propertiy.CurGoodsNum; j++)
{
tmp=Propertiy.Goods[j+1];
Propertiy.Goods[j]=tmp;
tmp=Propertiy.GoodsNum[j+1];
Propertiy.GoodsNum[j]=tmp;
}
}
return;
}
}
}
}
//检测一个物品的数量
int CRole::CheckObject(char *name)
{
int goods=CGoods::GetGoodsNum(name);
//如果是装备
if( CMenu::Goods.GOODS[goods].Class >=0
&& CMenu::Goods.GOODS[goods].Class <=1 )
{
return CheckArm(name);
}
if( goods != 0 )
{
for(int i=0; i<Propertiy.CurGoodsNum; i++)
{
if( Propertiy.Goods[i] == goods )
{
return Propertiy.GoodsNum[i];
}
}
}
return 0;
}
//-----------------------------------------------------------
//加入装备
void CRole::AddArm(char *name, int num)
{
int arm=CGoods::GetGoodsNum(name);
//添加
for(int i=0; i<Propertiy.CurArmNum; i++)
{
if( Propertiy.Arm[i] == arm )
{
Propertiy.ArmNum[i]+=num;
return;
}
}
//新装备
Propertiy.Arm[Propertiy.CurArmNum]=arm;
Propertiy.ArmNum[Propertiy.CurArmNum]=num;
Propertiy.CurArmNum++;
}
//删除物体
void CRole::DelArm(char *name, int num)
{
int arm=CGoods::GetGoodsNum(name);
if( arm != 0 )
{
for(int i=0; i<Propertiy.CurArmNum; i++)
{
if( Propertiy.Arm[i] == arm )
{
Propertiy.ArmNum[i]-=num;
//把后面的物品向前移动一格
if( Propertiy.ArmNum[i] <= 0 )
{
int tmp;
Propertiy.CurArmNum--;
for(int j=i; j<Propertiy.CurArmNum; j++)
{
tmp=Propertiy.Arm[j+1];
Propertiy.Arm[j]=tmp;
tmp=Propertiy.ArmNum[j+1];
Propertiy.ArmNum[j]=tmp;
}
}
return;
}
}
// 如果是已经装备了的
for(i=0; i<RoleNum; i++)
{
//如果是武器
if( role[i].Propertiy.Arms == arm )
{
role[i].Propertiy.Arms = 0; //卸除装备
role[i].UnSetupArm(arm);
return;
}
//如果是护具
else if( role[i].Propertiy.Corselet == arm )
{
role[i].Propertiy.Corselet = 0;
role[i].UnSetupArm(arm);
return;
}
}
}
}
// 检测一个装备的数量
int CRole::CheckArm(char *name)
{
int num=0;
int arm=CGoods::GetGoodsNum(name);
if( arm != 0 )
{
for(int i=0; i<Propertiy.CurArmNum; i++)
{
if( Propertiy.Arm[i] == arm )
{
num = Propertiy.ArmNum[i];
}
}
// 检查已经装备在身上了的
for(i=0; i<RoleNum; i++)
{
if( role[i].Propertiy.Arms == arm )
{
num ++;
}
if( role[i].Propertiy.Corselet == arm )
{
num ++;
}
}
}
return num;
}
//装备
void CRole::SetupArm(char *name)
{
int GoodNum=CGoods::GetGoodsNum(name);
SetupArm(GoodNum);
}
//装备
void CRole::SetupArm(int GoodNum)
{
Propertiy.Magic+=CMenu::Goods.GOODS[GoodNum].Magic; //魔法
Propertiy.Stamina+=CMenu::Goods.GOODS[GoodNum].Stamina; //耐力
Propertiy.Luck+=CMenu::Goods.GOODS[GoodNum].Luck; //幸运
Propertiy.Speed+=CMenu::Goods.GOODS[GoodNum].Speed; //敏捷
Propertiy.Bp+=CMenu::Goods.GOODS[GoodNum].Bp; //体力
Propertiy.Ip+=CMenu::Goods.GOODS[GoodNum].Ip; //精神
ReCalcPro();
}
//卸除装备
void CRole::UnSetupArm(char *name)
{
int GoodNum=CGoods::GetGoodsNum(name);
UnSetupArm(GoodNum);
}
//卸除装备
void CRole::UnSetupArm(int GoodNum)
{
Propertiy.Magic-=CMenu::Goods.GOODS[GoodNum].Magic; //魔法
Propertiy.Stamina-=CMenu::Goods.GOODS[GoodNum].Stamina; //耐力
Propertiy.Luck-=CMenu::Goods.GOODS[GoodNum].Luck; //幸运
Propertiy.Speed-=CMenu::Goods.GOODS[GoodNum].Speed; //敏捷
Propertiy.Bp-=CMenu::Goods.GOODS[GoodNum].Bp; //体力
Propertiy.Ip-=CMenu::Goods.GOODS[GoodNum].Ip; //精神
ReCalcPro();
}
//调整位置
void CRole::AdjustPosition()
{
bCancelTalk = true; //取消很NPC的对话
if(!bMoving) //没有移动
return ;
PathSteps = PathCurrentStep+1; //下一步是最后一步
bCuted = TRUE; //路径被减切
}
//加入一个魔法
void CRole::AddMagic(char *name)
{
//得到魔法编号
int magic = CMagic::GetMagicNum(name);
if(magic==-1)
return;
for(int i=0; i<Propertiy.MagicsNum; i++)
{
if( Propertiy.Magics[i] == magic )//有了这个魔法
{
return;
}
}
//没有学会的魔法
Propertiy.Magics[Propertiy.MagicsNum]=magic;
Propertiy.MagicsNum++;
}
//删除魔法
void CRole::DelMagic(char *name)
{
// 魔法编号
int magic=CMagic::GetMagicNum(name);
// 是魔法
if( magic >-1 )
{
for(int i=0; i<Propertiy.MagicsNum; i++)
{
if( Propertiy.Magics[i] == magic )
{
//把后面的魔法向前移动一格
int tmp;
Propertiy.MagicsNum--;
for(int j=i; j<Propertiy.MagicsNum; j++)
{
tmp=Propertiy.Magics[j+1];
Propertiy.Magics[j]=tmp;
}
return;
}
}
}
}
//重新计算属性
void CRole::ReCalcPro()
{
Propertiy.Attack = oldAttack;
Propertiy.Defend = oldDefend;
int GoodNum = Propertiy.Arms;
Propertiy.Attack+=CMenu::Goods.GOODS[GoodNum].Attack; //攻击
Propertiy.Attack = (int)Propertiy.Attack*(100.0+CMenu::Goods.GOODS[GoodNum].AttackPer)/100.0;
Propertiy.Defend+=CMenu::Goods.GOODS[GoodNum].Defend; //防御
Propertiy.Defend = (int)Propertiy.Defend*(100.0+CMenu::Goods.GOODS[GoodNum].DefendPer)/100.0;
GoodNum = Propertiy.Corselet;
Propertiy.Attack+=CMenu::Goods.GOODS[GoodNum].Attack; //攻击
Propertiy.Attack = (int)Propertiy.Attack*(100.0+CMenu::Goods.GOODS[GoodNum].AttackPer)/100.0;
Propertiy.Defend+=CMenu::Goods.GOODS[GoodNum].Defend; //防御
Propertiy.Defend = (int)Propertiy.Defend*(100.0+CMenu::Goods.GOODS[GoodNum].DefendPer)/100.0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -