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

📄 role.cpp

📁 圣剑二完整的游戏代码。附作者写的三篇文章。游戏的开发过程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -