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

📄 game.cpp

📁 学游戏不错的实例教程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -