📄 新建 文本文档.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 + -