📄 game.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 + -