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

📄 新建 文本文档.txt

📁 成熟的RPG引擎,Flysky发布. 斜视角引擎.
💻 TXT
字号:
/*
//人物相关

bool CMap::InitNPC()
{
//_DELETE_ARRAY(rl);//先清空角色,删除数组
//MAX_NC=MAX_NC; //设定最多的角色
USE_NC=0;
//rl=new ANPC[MAX_NC]; //建立数组
//for (int i=0;i<MAX_NC;i++) rl[i].VS=false;
/*
_DELETE_ARRAY(lpDDS_NPC);
lpDDS_NPC=new LPDIRECTDRAWSURFACE7[MAX_NC];
_DELETE_ARRAY(lpDDS_NPCLOGO);
lpDDS_NPCLOGO=new LPDIRECTDRAWSURFACE7[MAX_NC];*/
return true;
}

bool CMap::LoadNPC(char *FileName)
{
FILE *fp;
char tmpcx[255];
fp=fopen(FileName,"rb");
fseek(fp,long(strlen("MN1")),0);
//fread(&MAX_NC,4,1,fp);
int USE_NC; //暂时
fread(&USE_NC,4,1,fp);
//InitNPC();
for (int i=0;i<USE_NC;i++) 
{
fread(&rl[i], sizeof(ANPC), 1, fp); //全部读入
CBlockOn(true,rl[i].x,rl[i].y);//设定阻碍
strcpy(tmpcx,NPCPath);
strcat(tmpcx,rl[i].facePic);
CreateSurface(lpDDS_NPC[i],tmpcx,0,0);
if (rl[i].move!=false)
{
CFindPath cf(&map);
if (cf.Find(rl[i].x,rl[i].y,rl[i].movex,rl[i].movey)==true)
{
rl[i].PathCSteps=0; //初始化为0
rl[i].PathSteps=cf.TheSteps;
rl[i].Path=new POINT[cf.TheSteps];
memcpy(rl[i].Path, cf.ThePath, sizeof(POINT)*cf.TheSteps);
rl[i].RoleZD=true;
}
}
}
fclose(fp);
return true;
}

bool CMap::SaveNPC(char *FileName)
{
FILE *fp;
fp=fopen(FileName,"wb");
fwrite("MN1",strlen("MN1"),1,fp);
//fwrite(&MAX_NC,4,1,fp);
fwrite(&USE_NC,4,1,fp);
for (int i=0;i<USE_NC;i++) fwrite(&rl[i], sizeof(ANPC), 1, fp); //全部读入
fclose(fp);
return true;
}

int CMap::AddNPC(ANPC RL)
{
	char tmpcx[255];
		CBlockOn(true,RL.x,RL.y);//设定阻碍
		strcpy(tmpcx,NPCPath);
		strcat(tmpcx,RL.facePic);
		CreateSurface(lpDDS_NPC[USE_NC],tmpcx,0,0);
		RL.facej=0;  //刷新步数为站好
		RL.Path=NULL; //初始化,防止数组有问题
		RL.fr=0;
		//图片偏移自判断 技术
		if (RL.Npcr.left==-9999999&&RL.Npcr.top==-9999999)
		{
			POINT tp=FindRoleP(lpDDS_NPC[USE_NC]); //寻找偏移
			RL.Npcr.left=RL.Npcr.right-TileWidth-tp.x;RL.Npcr.top=RL.Npcr.bottom-TileHeight-tp.y; //刷新偏移
		}
		//rl[USE_NC]=RL; //增加一个主角
		rl.push_back(RL); //将RL放进容器
		if (!rl.empty())
		{
		if (rl[rl.size()-1].move!=false) CgNMove(USE_NC,rl[rl.size()-1].move,rl[rl.size()-1].movex,rl[rl.size()-1].movey);
		//NPC之后
		NPCZDS(int(rl.size())-1);
		++USE_NC; //数量加1
		int tint=(int)rl.size();
		if (USE_NC!=tint) USE_NC=(int)rl.size();
		return USE_NC-1;
		}
		return 0;
}

int CMap::NameToID(LPCSTR Name)
{
	for (int i=0;i<USE_NC;i++)
	{
		if (stricmp(rl[USE_NC].Name,Name)==0)
		{
			return i;
		}
	}
	return 0;
}

void CMap::CgNMove(int ID,bool FT,int x,int y)
{
	rl[ID].move=FT;
	if (x!=-1&&y!=-1)
	{
	rl[ID].movex=x;
	rl[ID].movey=y;
	}
	if (rl[ID].move!=false)
	{
	CFindPath cf(&map);
	if (cf.Find(rl[ID].x,rl[ID].y,rl[ID].movex,rl[ID].movey)==true)
	{
		rl[ID].PathCSteps=0; //初始化为0
		rl[ID].PathSteps=cf.TheSteps;
		_DELETE_ARRAY(rl[ID].Path);
		rl[ID].Path=new POINT[cf.TheSteps];
		Qmemcpy(rl[ID].Path, cf.ThePath, sizeof(POINT)*cf.TheSteps);
		if (x!=-1&&y!=-1)
		{
			rl[ID].RoleZD=true;
			rl[ID].fr=0;
		}
	}
	else return;
	}
	else return;

}

bool CMap::ShowANPC(int ID,LPDIRECTDRAWSURFACE7 RoleDDS)
{
	int tx,ty;
	if (rl[ID].VS!=false)
	{
	MDToMI(rl[ID].x-MapStartX,rl[ID].y-MapStartY,tx,ty);
	if(tx<ScreenWidth&&ty<ScreenHeight)
	{
	CreateRect(tmpr,rl[ID].Npcr.right*rl[ID].facej,rl[ID].Npcr.bottom*rl[ID].face,
		rl[ID].Npcr.right*(rl[ID].facej+1),rl[ID].Npcr.bottom*(rl[ID].face+1));
	BltFast(RoleDDS,tx-rl[ID].Npcr.left,ty-rl[ID].Npcr.top,lpDDS_NPC[ID],&tmpr,SrcKey);
	}
	}
	//fontv.PrintText(RoleDDS,tx,ty,"|");
	return true;
}

//动态Role处理
bool CMap::DNPC(int ID)
{
//以下是动态的
	if (rl[ID].move==true)
	{
		int mx=rl[ID].Path[rl[ID].PathCSteps].x-rl[ID].x; //得差
		int my=rl[ID].Path[rl[ID].PathCSteps].y-rl[ID].y;//得差
		#ifdef _AStarD
		//允许斜线运动
		if (mx<0&&my<0) {rl[ID].face=LUFace;}
		else if (mx>0&&my<0) {rl[ID].face=RUFace;}
		else if (mx<0&&my>0) {rl[ID].face=LDFace;}
		else if (mx>0&&my>0) {rl[ID].face=RDFace;}
		else if (mx<0&&my==0) {rl[ID].face=LeftFace;}
		else if (mx>0&&my==0) {rl[ID].face=RightFace;}
	   	else if (my<0&&mx==0) {rl[ID].face=UpFace;}
		else if (my>0&&mx==0) {rl[ID].face=DownFace;}		
		#else
		if (mx<0) {rl[ID].face=LeftFace;}
		else if (mx>0) {rl[ID].face=RightFace;}
	   	else if (my<0) {rl[ID].face=UpFace;}
		else if (my>0) {rl[ID].face=DownFace;}
		#endif
		rl[ID].zd.clear(); //清除遮挡列表
		CBlockOn(false,rl[ID].x,rl[ID].y);//取消阻碍
		//重新寻路
		if (IsBlock(rl[ID].Path[rl[ID].PathCSteps].x,rl[ID].Path[rl[ID].PathCSteps].y))
		{
			int ox=rl[ID].x,oy=rl[ID].y;
			rl[ID].x=rl[ID].Path[0].x;
			rl[ID].y=rl[ID].Path[0].y;
			CgNMove(ID,true,-1,-1);
			for (int i=0;i<rl[ID].PathSteps;i++)
			{
				if (ox==rl[ID].Path[i].x&&oy==rl[ID].Path[i].y)
				{
					if (rl[ID].RoleZD==true) rl[ID].PathCSteps=i+1; //下一步
					else rl[ID].PathCSteps=i-1; //下一步
					break;
				}
			}
		}
		rl[ID].x=rl[ID].Path[rl[ID].PathCSteps].x;
		rl[ID].y=rl[ID].Path[rl[ID].PathCSteps].y;
		CBlockOn(true,rl[ID].x,rl[ID].y);//设定阻碍
		//动态人物
		//重新遮挡
		NPCZDS(ID);
		//遮挡结束
		if (rl[ID].PathCSteps>=rl[ID].PathSteps-1) rl[ID].RoleZD=false;
		else if(rl[ID].PathCSteps<1) rl[ID].RoleZD=true;
		if (rl[ID].RoleZD==true&&rl[ID].facej>=3) rl[ID].PathCSteps++;
		else if (rl[ID].RoleZD==false&&rl[ID].facej>=3)rl[ID].PathCSteps--;
		rl[ID].facej=rl[ID].fr>>2;
		if (rl[ID].facej>4) rl[ID].facej=4;
		rl[ID].fr++;
		if (rl[ID].fr>16) rl[ID].fr=0;
	}
	return true;

}

bool CMap::DNPC()
{
for (int i=0;i<USE_NC;i++) if (DNPC(i)!=true) return false;
return true;
}

bool CMap::IsKeyRunScript(int face,int x,int y)
{
	int tx,ty;
	tx=x;ty=y;
	if (face!=MouseNpc)
	{
	if (face==UpFace) ty=ty-1;
	else if (face==DownFace)ty=ty+1;
	else if (face==LeftFace)tx=tx-1;
	else tx=tx+1;
	}
for (int i=0;i<USE_NC;i++)
{
	if (rl[i].x==tx&&rl[i].y==ty) 
	{
//执行语句
			//if (strlen(rl[i].EScrFName)>1) RunMessage(MS_Close,0,NULL,0,0,0,0,NULL,0);
		if (stricmp(rl[i].EScrFName,"null")!=0) 
		{
			//转身并进入脚本
			if (face==UpFace) rl[i].face=DownFace;
            else if (face==DownFace) rl[i].face=UpFace;
            else if (face==LeftFace) rl[i].face=RightFace;
			else rl[i].face=LeftFace;
			if (face==MouseNpc)	
			{
				if (abs(ROLEFX-x)<10&&abs(ROLEFY-y)<10) 
				{
					if (role.RLS>0) face=role.role[0].face;
					else face=0;
				#ifdef _AStarD
					if (face==LUFace) rl[i].face=RDFace;
					else if (face==RUFace) rl[i].face=LDFace;
					else if (face==RDFace) rl[i].face=LUFace;
					else if (face==LDFace) rl[i].face=RUFace;
					else if (face==UpFace) rl[i].face=DownFace;
					else if (face==DownFace) rl[i].face=UpFace;
					else if (face==LeftFace) rl[i].face=RightFace;
					else rl[i].face=LeftFace;
				#else
					if (face==UpFace) rl[i].face=DownFace;
					else if (face==DownFace) rl[i].face=UpFace;
					else if (face==LeftFace) rl[i].face=RightFace;
					else rl[i].face=LeftFace;
				#endif				
					RunMessage(MS_RUNSCRIPT,0,rl[i].EScrFName,0,0,0,0,NULL,0);
				}
			}
			else RunMessage(MS_RUNSCRIPT,0,rl[i].EScrFName,0,0,0,0,NULL,0);
			return true;
		}
		else return false;
	}
}
return false;
}

bool CMap::ShowNPC(LPDIRECTDRAWSURFACE7 RoleDDS,int o)
{
if (o==1)
{
    for (int i=0;i<USE_NC;i++) 	if (rl[i].x>ROLEFX||rl[i].y>ROLEFY) if (ShowANPC(i,RoleDDS)!=true) return false;
		return true;
}
else
{
    for (int i=0;i<USE_NC;i++)
	{
		if (ShowANPC(i,RoleDDS)!=true) return false;
			if (!rl[i].zd.empty()) for (int d=0;d<(rl[i].zd.size()+1);d++) ShowTile(2,rl[i].zd[d].x,rl[i].zd[d].y,RoleDDS);
				else
				{
			//开始读取Role 最新改变,遮挡修正	
					NPCZDS();
				}
	}
	return true;
}
return false;
}
void CMap::NPCZDS(int ID)
{
		//NPC之后
		int ox,oy,tx,ty;
		rl[ID].zd.clear(); //清除遮挡列表
		MDToMI(rl[ID].x,rl[ID].y,tx,ty);
		//|----|
		//|    |
		//|----|
		for (int t=tx-rl[ID].Npcr.left;t<tx+rl[ID].Npcr.right-rl[ID].Npcr.left+TileWidth;t+=TileWidth>>1) //因为>>2能减少误差
		{
			for (int s=ty-rl[ID].Npcr.top;s<ty+rl[ID].Npcr.bottom-rl[ID].Npcr.top+TileHeight;s+=TileHeight>>1)
			{
				POINT pt;
				MIToMD(t,s,ox,oy);
				pt.x=ox+1;pt.y=oy+1;
				rl[ID].zd.push_back(pt);//第一个
				pt.x=ox;pt.y=oy+1;
				rl[ID].zd.push_back(pt);//第二个
				pt.x=ox+1;pt.y=oy;
				rl[ID].zd.push_back(pt);//第三个
			}
		}
}
void CMap::NPCZDS(){for(int i=0;i<USE_NC;i++) NPCZDS(i);} //每个都计算遮挡
*/

⌨️ 快捷键说明

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