📄 game.cpp
字号:
if(man[q].zs==0)
man[q].p=man[q].p+rand()%3; //避免动作一致
}
//**************************************************
// loadmap(CString name)//对象初始化
// 调入编制好的对象场景(.dat)
// 场景文件(.dat)的格式:
// 第1行,为背景图形
// 第2行,对象数,后面一行是一个对象。
// 序号,类别,角色,静物图形号,x,y位置6个数据
//**************************************************
void game::loadmap(CString name)//调地图
{ FILE *f;
SetCurrentDirectory(appdir); //置当前目录
f=fopen(name,"r");
if(f==NULL)
{AfxMessageBox(name+"没有地图文件!!!");
return;
}
fscanf(f,"%s\n",mapbak); //地图块名
fscanf(f,"%d\n",&rs); //对象数
if(rs>SU_LIANG) //对象数大于设定值返回
{fclose(f);
SetCurrentDirectory(appdir);//置当前目录
return;
}
int i;
for (i=0;i<rs;i++)
{fscanf(f,"%d,",&man[i].jisu);//序号
fscanf(f,"%d,",&man[i].lb); //类别: [0人1兽2景]
fscanf(f,"%d,",&man[i].js); //角色:人[0男1女]
//角色:兽[0豹1狼2鹿3马4雀5羊6猪]
fscanf(f,"%d,",&man[i].p); //静物图形号
fscanf(f,"%d,",&man[i].xix); //当前位置x
fscanf(f,"%d,",&man[i].xiy); //当前位置y
man[i].x0=man[i].xix; //目标位置x
man[i].y0=man[i].xiy; //目标位置y
man[i].fw=1; //方位: [0南1西南2西3西北4北5东北6东7东南]
man[i].zs=0; //动作:人[0站1走2刺3劈4倒]
//动作:兽[0站1走2跑3斗4倒5尸]
man[i].pk =-1; //路径长
man[i].fid=-1; //路径计数
man[i].zd=0;
if(man[i].lb!=2)
setman(man[i].jisu); //设置活动对象初值
getobjwh(i); //取对象的尺寸
}
fclose(f);
SetCurrentDirectory(appdir); //置当前目录
}
//**************************************************
// getpic(CString cc,int p) 调图片到相关位图
// 由p得到将调的图形文件名。
// 在指定目录中调入图形到相关位图bit
//**************************************************
BOOL game::getpic(CString cc,int p)//调图片到相关位图[3章]
{ char name[256];
if(stmp==NULL) //没有压缩资源
{SetCurrentDirectory(appdir); //置当前目录
//调cc指定的图形
sprintf(name,"%s%s/c%05d.bmp",dir,cc,p);//生成将调的图形文件名
if(!loadbmp(name)) return FALSE; //调BMP图片
SelectObject(MemDC,bitmap);
//调cc指定的图形的偏移值。
sprintf(name,"%s%s/c%05d.txt",dir,cc,p);
FILE *f;
f=fopen(name,"r");
if(f!=NULL)
{if(cc=="人") fscanf(f,"%d,%d",&rbufx[p],&rbufy[p]);//人的偏移量
if(cc=="兽") fscanf(f,"%d,%d",&sbufx[p],&sbufy[p]);//兽的偏移量
fclose(f);
}
return TRUE;
}
else
{if(getpic0(cc,p)) return TRUE;//调压缩图片。
else return FALSE;
}
}
//**************************************************
// loadbmp(CString cc)//调BMP图片
// 调cc指定的图形;取得的图形在设备相关位图bit中
// 图形的宽、高存于全局变量w,h中
//**************************************************
BOOL game::loadbmp(CString cc)//调BMP图片[2章]
{ DeleteObject(bitmap); //删除上次的位图内存。
bitmap=(HBITMAP)LoadImage //调入cc指定的图形
(AfxGetInstanceHandle(),//
cc,IMAGE_BITMAP, //文件名,位图方式
0,0, //图形宽,高
LR_LOADFROMFILE|LR_CREATEDIBSECTION//方式
);
if(bitmap==NULL) return FALSE; //调图失败
DIBSECTION ds; //
BITMAPINFOHEADER &bm = ds.dsBmih; //
GetObject(bitmap,sizeof(ds),&ds); //取位图的信息->bminfo
w = bm.biWidth; //得到位图宽度值
h = bm.biHeight; //得到位图高度值
return TRUE;
}
/////////////////////////////////////////////////////////////////
void game::find_a(int i)//没加寻路时不要。
{//加入自动搜索后,应执行的代码
if(man[i].fid<man[i].pk) //从搜索的路径中取目标点
{man[i].x0=man[i].ph[man[i].fid].x*GX+man[i].w/2;
man[i].y0=man[i].ph[man[i].fid].y*GY+man[i].h/2;
man[i].fid++;
if(man[i].x0<GX) man[i].x0=GX;
if(man[i].y0<GX) man[i].y0=GY;
bianfw(i); //方位转换
}
else //搜索路径取完
{man[i].x0=man[i].fx;
man[i].y0=man[i].fy;
}
}
//**************************************************
// setobj(int q) 对象显示
// 调入由man[q].lb指出的,不同的man[q].p图片,和偏移值。
// 将对象q在各自的当前位置x,y上以透明方式TransparentBlt2显示。
// 之后进行移动或方位转换的功能。
// 为防止闪烁,所有对象先显示在暂存区BkDC1,一屏完成后再翻转到主屏上。
//**************************************************
void game::setobj(int q)//对象显示
{ CString cc;
int x=man[q].xix-scrx-man[q].w/2; //x当前位置
int y=man[q].xiy-scry-man[q].h; //y当前位置
if(inscreer(q))//在显示区?
{if(man[q].lb==0) {cc="人";}
if(man[q].lb==1) {cc="兽";}
if(man[q].lb==2) {cc="景";}
if(getpic(cc,man[q].p)==FALSE) return;
if(man[q].lb!=2)//调角色的偏移位置
{int x0=0,y0=0;
if(man[q].lb==0) {x0=rbufx[man[q].p];y0=rbufy[man[q].p];}
if(man[q].lb==1) {x0=sbufx[man[q].p];y0=sbufy[man[q].p];}
if(man[q].fw>4) x0=w-x0;//是东北、东、东南方位
x=man[q].xix-scrx-x0;
y=man[q].xiy-scry-y0;
}
TransparentBlt2(BkDC1,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//透明显示
mans++;
}
///////////////////////////////////////////////////////////////////////
if(man[q].lb==2) return;
else manmove(q); //活动对象的移动
man[q].p++; //下一动作
if(man[q].p>=man[q].m1) {bianfw(q);}//本动作完成,进行方位转换
}
//**************************************************
// setobj(int q) 对象显示
// 调入由man[q].lb指出的,不同的man[q].p图片,和偏移值。
// 将对象q在各自的当前位置x,y上以透明方式TransparentBlt2显示。
// 之后进行移动或方位转换的功能。
// 为防止闪烁,所有对象先显示在暂存区BkDC1,一屏完成后再翻转到主屏上。
//**************************************************
void game::Alphasetobj(int q,int a)//对象显示
{ if(a==1&&man[q].lb==2) return;
CString cc;
int x=man[q].xix-scrx-man[q].w/2; //x当前位置
int y=man[q].xiy-scry-man[q].h; //y当前位置
if(inscreer(q))//在显示区?
{if(man[q].lb==0) {cc="人";}
if(man[q].lb==1) {cc="兽";}
if(man[q].lb==2) {cc="景";}
if(getpic(cc,man[q].p)==FALSE) return;
if(man[q].lb!=2) //调角色的偏移位置
{int x0=0,y0=0;
if(man[q].lb==0) {x0=rbufx[man[q].p];y0=rbufy[man[q].p];}
if(man[q].lb==1) {x0=sbufx[man[q].p];y0=sbufy[man[q].p];}
if(man[q].fw>4) x0=w-x0;//是东北、东、东南方位
x=man[q].xix-scrx-x0;
y=man[q].xiy-scry-y0;
}
///////////////////////////////////////////////////////////////////////////////
if(a==0)
{TransparentBlt2(BkDC1,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//透明显示
return;
}
else Alpha(x,y);
///////////////////////////////////////////////////////////////////////////////
mans++;
}
///////////////////////////////////////////////////////////////////////
if(man[q].lb==2) return;
else manmove(q); //活动对象的移动
man[q].p++; //下一动作
if(man[q].p>=man[q].m1) {bianfw(q);}//本动作完成,进行方位转换
}
void game::Alpha(int x,int y)//
{ BitBlt(BK,0,0,w,h,BkDC1,x,y,SRCCOPY);
TransparentBlt2(BkDC1,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//透明显示
AlphaBlend(BkDC1,x,y,w,h,BK,0,0,w,h,rBlend);//半透明处理
}
//****************************************************************
// BOOL getpic0(CString cc,int p) 调压缩图片
// 在cc指定的压缩库中取第p个图形和图形的尺寸w、h,取得的图形在MemDC中。
//****************************************************************
BOOL game::getpic0(CString cc,int p)//调压缩图片
{ int len;
if(p<0) return FALSE;
BYTE *tmp;
if(cc=="人")
{if(p>RBUF-1) return FALSE;
len=rbufadd[p+1]-rbufadd[p]; //取数据块长度
tmp=(BYTE *)new BYTE[len];
Memcpy0(tmp,rtmp+rbufadd[p],len);
}
if(cc=="兽")
{if(p>SBUF-1) return FALSE;
len=sbufadd[p+1]-sbufadd[p]; //取数据块长度
tmp=(BYTE *)new BYTE[len];
Memcpy0(tmp,stmp+sbufadd[p],len);
}
if(cc=="景")
{if(p>JBUF-6) return FALSE;
len=jbufadd[p+1]-jbufadd[p]; //取数据块长度
tmp=(BYTE *)new BYTE[len];
Memcpy0(tmp,jtmp+jbufadd[p],len);
}
LPBITMAPINFOHEADER bm=(BITMAPINFOHEADER *)tmp;//图形数据转换
bm->biSize = sizeof(BITMAPINFOHEADER);
w=bm->biWidth; //图形高
h=bm->biHeight; //图形宽
//----------------------------------------------------------------------
OldMak=(HBITMAP)SelectObject(MemDC,bitya);
StretchDIBits(MemDC,0,0,w,h,0,0,w,h,
tmp+256*sizeof(RGBQUAD)+bm->biSize,
(BITMAPINFO* )bm,DIB_RGB_COLORS,SRCCOPY);
delete[] tmp;
return TRUE;
}
void game::Memcpy0(unsigned char *mu,unsigned char *yu,int z)
{memcpy(mu,yu,z);
return;
int z0=z/32;
int z1=z-z0*32;
_asm
{//pand mm0,mm4 ;//packed and
mov esi,yu
mov edi,mu
mov ecx,z0
Mcont:
movq mm0,qword ptr [esi]
movq qword ptr [edi],mm0
movq mm0,qword ptr [esi][8]
movq qword ptr [edi][8],mm0
movq mm0,qword ptr [esi][16]
movq qword ptr [edi][16],mm0
movq mm0,qword ptr [esi][24]
movq qword ptr [edi][24],mm0
add esi,8*4
add edi,8*4
loop Mcont
mov ecx,z1;
repe movsb;
emms ;//empty MMX state
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -