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

📄 game.cpp

📁 小软件 more quick 用c++ 编写
💻 CPP
字号:
/*
[学VC、编游戏]
编著、程序设计:唐明理 2004.7
E-mail:  cqtml@163.com
*/
#include "stdafx.h"
#include "game.h"

JCDZ zjdz[6]={0,5,40,10,120,10,200,10,280,10,360,5};
JCDZ zjdw[6]={0,5,40,10,120,10,200,10,280,10,360,5};
unsigned short dw[7][6]={0,1,1,3,4,5,
						 0,1,2,3,4,5,
						 0,1,1,3,4,5,
						 0,1,2,3,4,5,
						 0,2,2,2,4,5,
						 0,1,1,1,4,5,
						 0,1,1,3,4,5
						 };

game:: game(){}	
game::~game(){}	
BOOL game::init()
{	if(!InitDDraw())
		return FALSE;
	hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL);
	MemDC =CreateCompatibleDC(hScrDC);	
	hBMP0   =CreateCompatibleBitmap(hScrDC,100,100);
	hBMP1   =CreateCompatibleBitmap(hScrDC,100,100);
	hDC0    =CreateCompatibleDC(hScrDC);
	hDC1    =CreateCompatibleDC(hScrDC);
	SelectObject(hDC0, hBMP0);
	SelectObject(hDC1, hBMP1);	

	GetCurrentDirectory(256,appdir);
	dir=appdir;
	if(dir.Right(8)=="运行程序")
			dir="图片/";
	else	
		dir="../运行程序/图片/";
	sys=getsys();	
	rs=0;	
	edi=0;	
	scrx=0;scry=0;
	stmp=NULL;rtmp=NULL;jtmp=NULL;
	find_p=0;
	SCRP0=5;

	rBlend.BlendOp = AC_SRC_OVER;
	rBlend.BlendFlags = 0;	
	rBlend.AlphaFormat = 0;	
	rBlend.SourceConstantAlpha=140;
	return TRUE;
}

void game::exit()
{	if(stmp!=NULL) delete[] stmp;
	if(rtmp!=NULL) delete[] rtmp;
	if(jtmp!=NULL) delete[] jtmp;
	DeleteDC(hDC0);
	DeleteDC(hDC1);
	DeleteObject(hBMP0);
	DeleteObject(hBMP1);
	DeleteDC(MemDC);
	DeleteDC(hScrDC);
}

int game::getsys()
{	OSVERSIONINFO stOSVI ;
	ZeroMemory(&stOSVI , sizeof ( OSVERSIONINFO )) ;
    stOSVI.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ) ;
    GetVersionEx ( &stOSVI);
		int a=0;
	if (stOSVI.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS &&
		(stOSVI.dwMajorVersion>4||(stOSVI.dwMajorVersion==4
		 && stOSVI.dwMinorVersion>0)))
		a=1;
	if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId&&stOSVI.dwMajorVersion>=5)
		a=2;
	if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId&&stOSVI.dwMajorVersion==4)
		a=3;
	if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId)
		a=4;
	return a;
}

BOOL game::inscreer(int i)
{	int xs=man[i].xix-scrx-man[i].w/2;
	int ys=man[i].xiy-scry-man[i].h;
	if(xs>(-man[i].w+2)&&xs<WIDTH&&ys>(-man[i].h+10)&&ys<HEIGHT)
			return TRUE;
	else	return FALSE;
}

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;
	int y=man[q].xiy-scry-man[q].h;	
	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,0)==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;
		 }
	 rect.left=0,rect.top=0,rect.right=w,rect.bottom=h;
	 if(a==0)//DX
		{if(DXSBack1->BltFast(x+SCRW,y+SCRH,DXSgonh,&rect,
		    DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)!=DD_OK) return;
		 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)//DX
{	HDC hdc;
	if ( DXSBack1->GetDC(&hdc) != DD_OK) return;
	BitBlt(hDC0,0,0,w,h,hdc,x+SCRW,y+SCRH,SRCCOPY);
	BitBlt(hDC1,0,0,w,h,hdc,x+SCRW,y+SCRH,SRCCOPY);
	DXSBack1->ReleaseDC(hdc);
	if ( DXSgonh->GetDC(&hdc) != DD_OK) return;
	TransparentBlt2(hDC1,0,0,w,h,hdc,0,0,w,h,RGB(255,255,255));	  
	AlphaBlend(hDC1,0,0,w,h,hDC0,0,0,w,h,rBlend);
	BitBlt(hdc,0,0,w,h,hDC1,0,0,SRCCOPY);
	DXSgonh->ReleaseDC(hdc);
	if(DXSBack1->BltFast
		(x+SCRW,y+SCRH,DXSgonh,&rect,DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)!=DD_OK) return;//在缓存区1上透明显示
}

void game::sort()
{	MAN man0;
	for(int a=0;a<rs-1;a++)
	 for(int b=a+1;b<rs;b++)
		if(man[a].xiy>man[b].xiy)
			{man0=man[a];
			 man[a]=man[b];
			 man[b]=man0;
			}						
	mans=0;	
}

void game::getobjwh(int q)
{	CString cc;
	if(man[q].lb==0)	{cc="人";}
	if(man[q].lb==1)	{cc="兽";}	
	if(man[q].lb==2) 	{cc="景";}
	if(getpic(cc,man[q].p,0)==FALSE) return;
	man[q].w=w; man[q].h=h;	
}

BOOL game::loadbmp(CString cc)
{	DeleteObject(bitmap);	
	bitmap=(HBITMAP)LoadImage
				(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);
	w = bm.biWidth;	
	h = bm.biHeight;
	return TRUE;
}
BOOL game::getpic(CString cc,int p,int a)
{	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;
	if(a==0)
//DX----------------------------------------------------------------------
	{HDC hdc;
	 if ( DXSgonh->GetDC(&hdc) != DD_OK) return FALSE;//
	 StretchDIBits(hdc,0,0,w,h,0,0,w,h,tmp+256*sizeof(RGBQUAD)+bm->biSize,
				   (BITMAPINFO* )bm,DIB_RGB_COLORS,SRCCOPY);
	 DXSgonh->ReleaseDC(hdc);
//-----------------------------------------------------------------------
	}
	else
	{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::TransparentBlt2(HDC hdc0,
				int nX0,int nY0,int nW0,int nH0,
				HDC hdc1,	
				int nX1,int nY1,int nW1,int nH1,
				UINT Tcol)	
					 
{	if(sys>1)
	{TransparentBlt(hdc0,nX0,nY0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,Tcol);
	 return;
	}
	HBITMAP hBMP   =CreateCompatibleBitmap(hdc0,nW0, nH0);
	HBITMAP mBMP   =CreateBitmap(nW0,nH0,1,1,NULL);
	HDC		hDC    =CreateCompatibleDC(hdc0);
	HDC		mDC    =CreateCompatibleDC(hdc0);
	HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
	HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);

	if (nW0==nW1&&nH0==nH1)
		BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
	else
		StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
	SetBkColor(hDC, Tcol);
	BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);
	SetBkColor(hDC, RGB(0,0,0));
	SetTextColor(hDC, RGB(255,255,255));
	BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
	SetBkColor(hdc0,RGB(255,255,255));	
	SetTextColor(hdc0,RGB(0,0,0));	

	BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND);  
	BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT);
	SelectObject(hDC,oldBMP);
	SelectObject(mDC,oldmBMP);
	DeleteDC(hDC);
	DeleteDC(mDC);
	DeleteObject(hBMP);
	DeleteObject(mBMP);
}

void game::setman(int q)
{	int a=400;
	if(man[q].lb==0)
	{man[q].m0=man[q].js*a+zjdz[man[q].zs].qi
			  +man[q].fw*zjdz[man[q].zs].bc;
	 man[q].m1=zjdz[man[q].zs].bc+man[q].m0;
	 man[q].p=man[q].m0;
	}
	if(man[q].lb==1)
	{man[q].m0=man[q].js*a+zjdw[man[q].zs].qi
			  +man[q].fw*zjdw[man[q].zs].bc;
	 man[q].m1=zjdw[man[q].zs].bc+man[q].m0;
	 man[q].p=man[q].m0;
	}
	man[q].zd=0;
}

void game::manmove(int i)
{	if(man[i].lb==2)	return;	
	if(find_p==1)	
		{if(man[i].pk<1) return;}
	int stx,sty,qx,qy;
	switch(man[i].zs) 
		{case 2: {stx=9;sty=6;break;}
	     case 1: {stx=4;sty=2;break;}
		 default:{stx=2;sty=1;break;}
		}
	qx=man[i].x0-man[i].xix;
	qy=man[i].y0-man[i].xiy;
	if (qx==0&&qy==0)
	{if(find_p==1)	
		{
		 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;
			}
		}
	 return ;	
	}
	int qxa=abs(qx);
	int qya=abs(qy);	
	if(qxa<stx)  stx=qxa;	
	if(qya<sty)  sty=qya;	
	if(qx!=0) man[i].xix+=qxa/qx*stx;
	if(qy!=0) man[i].xiy+=qya/qy*sty;
}

void game::bianfw(int q)
{	int qx=man[q].x0-man[q].xix;
	int qy=man[q].y0-man[q].xiy;
	if(qx==0&&qy==0) 
		{if(man[q].zd==0) man[q].zs=0;
		 goto aa;
		}	
	if(man[q].zd==0)
	{int a=rand()%2+1;		
	 if(man[q].lb==0) man[q].zs=1;	
	 if(man[q].lb==1) man[q].zs=dw[man[q].js][a];
	}
	if(qx<0&&qy>0)		{man[q].fw=1;goto aa;}
	if(qx<0&&qy<0)		{man[q].fw=3;goto aa;}
	if(qx>0&&qy<0)		{man[q].fw=5;goto aa;}
	if(qx>0&&qy>0)		{man[q].fw=7;goto aa;}
	if      (qy>0)		{man[q].fw=0;goto aa;}
	if(qx<0)			{man[q].fw=2;goto aa;}
	if      (qy<0)		{man[q].fw=4;goto aa;}
	if(qx>0)			{man[q].fw=6;goto aa;}
aa:	setman(q);	
	if(man[q].zs==0) 
		man[q].p=man[q].p+rand()%3;	
}

void game::loadmap(CString name)
{ FILE *f;
  SetCurrentDirectory(appdir);
  f=fopen(name,"r");
  if(f==NULL) {AfxMessageBox("没有地图文件!!!");return;}
  fscanf(f,"%s\n",mapbak);	
  fscanf(f,"%d\n",&rs);	
  if(rs>SU_LIANG)
		{fclose(f);return;}	
  int i;
  for (i=0;i<rs;i++)
	{fscanf(f,"%d,",&man[i].jisu);
	 fscanf(f,"%d,",&man[i].lb);
	 fscanf(f,"%d,",&man[i].js);

	 fscanf(f,"%d,",&man[i].p);	  
	 fscanf(f,"%d,",&man[i].xix); 
	 fscanf(f,"%d,",&man[i].xiy); 
	 man[i].x0=man[i].xix;		  
	 man[i].y0=man[i].xiy;	
	 man[i].fw=1;
	 man[i].zs=0;

	 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);
}

BOOL game::InitDDraw(void)
{   ddrval=DirectDrawCreate( NULL, &DXW, NULL );
	if(ddrval!= DD_OK ) return FALSE;
    ddrval=DXW->SetCooperativeLevel(GetActiveWindow(),DDSCL_NORMAL);
	if(ddrval!= DD_OK)  return FALSE;
    
	ddrval=DXW->SetDisplayMode(800,600,16);
	if(ddrval!= DD_OK) return FALSE;

    ddsd.dwSize = sizeof( ddsd );
    ddsd.dwFlags = DDSD_CAPS;
    ddsd.ddsCaps.dwCaps =DDSCAPS_PRIMARYSURFACE;
	ddsd.dwBackBufferCount=1;
    ddrval = DXW->CreateSurface( &ddsd, &DXSPrimary, NULL );
    if( ddrval != DD_OK )   return FALSE;

	Surface(WIDTH,HEIGHT);
	ddrval=DXW->CreateSurface(&ddsd,&DXSBack0, NULL);
	if (ddrval!=DD_OK) return FALSE;

	Surface(WIDTH,HEIGHT);
	ddrval=DXW->CreateSurface(&ddsd,&DXSBack00, NULL);
	if (ddrval!=DD_OK) return FALSE;

	Surface(SCRWI0,SCRHE0);
	ddrval=DXW->CreateSurface(&ddsd,&DXSBack1, NULL);
	if (ddrval!=DD_OK) return FALSE;

	Surface(210,200);
	ddrval=DXW->CreateSurface(&ddsd,&DXSgonh, NULL);
	if (ddrval!=DD_OK) return FALSE;
	col.dwColorSpaceLowValue=RGB(255,255,255);
	col.dwColorSpaceHighValue=RGB(255,255,255);
	DXSgonh->SetColorKey(DDCKEY_SRCBLT,&col);
	return TRUE;
}
void game::Surface(int w,int h)
{	ZeroMemory(&ddsd, sizeof(ddsd));
    ddsd.dwSize  = sizeof(ddsd);
    ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH;
	ddsd.dwWidth = w;	//
	ddsd.dwHeight=h;	//
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY;
}
void game::Bk1ToPr(HDC scrhdc,CRect lpRect)
{	rect.left=SCRW,rect.top=SCRH,rect.right=WIDTH+SCRW,rect.bottom=HEIGHT+SCRH;
	if( DXSPrimary->BltFast
		(lpRect.left+5,lpRect.top+13,DXSBack1,&rect,DDBLTFAST_WAIT)!=DD_OK) 
	return ;
} 

void game::FreeDDraw( void )
{  if( DXW != NULL )
    {
	 if( DXSPrimary != NULL )
        { DXSPrimary->Release();DXSPrimary = NULL;}
	 if( DXSBack0 != NULL )
        { DXSBack0->Release();DXSBack0 = NULL;}
	 if( DXSBack00 != NULL )
        { DXSBack00->Release();DXSBack00=NULL;}
	 if( DXSBack1 != NULL )	
        { DXSBack1->Release();DXSBack1 = NULL;}
	 if( DXSgonh != NULL )
        { DXSgonh->Release(); DXSgonh = NULL; }
        DXW->Release(); DXW = NULL;
    }	
}
void game::Memcpy0(unsigned char *mu,unsigned char *yu,int z)
{//memcpy(mu,yu,z);
 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 + -