📄 game.cpp
字号:
#include <AfxWin.h>
#include <AfxExt.h>
#include <AfxTempl.h>
#include <io.h>
#include <fcntl.h>
#include "game.h"
//--------------------------------------------------------------
OBJECT::OBJECT()
{
lpdd=0;
back=0;
sfc=0;
running=0;
step=0;
get=0;
spot=0;
}
OBJECT::~OBJECT()
{
if(sfc!=0)
sfc->Release();
}
void OBJECT::InitDlg(char *dlgmem,long length)
{
DIALOG_RES_ASCII adlgres;
long i;
for(i=0;i<length;i++)
{
if(dlgmem[i]=='`')
{
memcpy(&adlgres,&dlgmem[i],sizeof(DIALOG_RES_ASCII));
if( atol(adlgres.number)==res.number )
{
ChangeDlgRes(&dlgres,&adlgres);
res2.dlgptr=i;
break;
}
}
}
}
void OBJECT::Init(LPDIRECTDRAW dd,LPDIRECTDRAWSURFACE bk,RECT sc,
char *aresmem,long areslength,
char *ares2mem,long ares2length,
long number)
{
lpdd=dd;
back=bk;
screen=sc;
OBJECT_RES_ASCII ares;
OBJECT_RES2_ASCII ares2;
long i;
for(i=0;i<areslength;i++)
{
if(aresmem[i]=='`')
{
memcpy(&ares,&aresmem[i],sizeof(OBJECT_RES_ASCII));
if( atol(ares.number)==number )
{
ChangeRes(&res,&ares);
break;
}
}
}
for(i=0;i<ares2length;i++)
{
if(ares2mem[i]=='`')
{
memcpy(&ares2,&ares2mem[i],sizeof(OBJECT_RES2_ASCII));
if( atol(ares2.number)==number )
{
ChangeRes2(&res2,&ares2);
break;
}
}
}
SetSpot();
}
void OBJECT::ReGet()
{
char name[30];
AddString(name,res.filename,"bmp\\",".bmp");
if( res.filename[0]=='~' && sfc!=0 )
{
sfc->Release();
sfc=0;
}
else
{
if( sfc!=0 )
DDReLoadBitmap(sfc,name);
else
sfc=DDLoadBitmap
(lpdd,name,res.rect.right,res.rect.bottom);
}
if(sfc!=0 && res.colorkey==1)
{
DDSetColorKey(sfc,res.rgb);
}
}
void OBJECT::Get()
{
if(res.load==1)
{
char name[30];
AddString(name,res.filename,"bmp\\",".bmp");
sfc=DDLoadBitmap(lpdd,name,res.rect.right,res.rect.bottom);
}
else if(res.load==2)
{
sfc=DDGetSurface(lpdd,res.rect.right,res.rect.bottom);
}
if(sfc!=0 && res.colorkey==1)
{
DDSetColorKey(sfc,res.rgb);
}
}
void OBJECT::GetAppend(BYTE *hit,int hl,BYTE *acc,int al)
{
FILE *file=0;
char name[30];
//hit
AddString(name,res.filename,"hit\\",".hit");
file=fopen(name,"rb");
if( file!=0 )
{
fread(hit,sizeof(BYTE),hl,file);
fclose(file);
file=0;
}
//acc
AddString(name,res.filename,"acc\\",".acc");
file=fopen(name,"rb");
if( file!=0 )
{
fread(acc,sizeof(BYTE),al,file);
fclose(file);
file=0;
}
}
bool OBJECT::IsHit(BYTE *hit)
{
static int j;
j=screen.right/res.apprect.right;
switch(direction)
{
case 4:
if( hit[spot-1]!=0 )
{
running=0;
return 1;
}
else
return 0;
case 6:
if( hit[spot+1]!=0 )
{
running=0;
return 1;
}
else
return 0;
case 8:
if( hit[spot-j]!=0 )
{
running=0;
return 1;
}
else
return 0;
case 2:
if( hit[spot+j]!=0 )
{
running=0;
return 1;
}
else
return 0;
}
return 0;
}
bool OBJECT::IsHitObj(OBJECT *other)
{
if(other->sfc==0)
return 0;
int stest=spot;
switch(direction)
{
case 4:
stest--;break;
case 6:
stest++;break;
case 2:
stest+=screen.right/res.apprect.right;break;
case 8:
stest-=screen.right/res.apprect.right;break;
}
return (stest==other->spot);
}
bool OBJECT::Move(int direction,int step,LPRECT test)
{
if(test==0)
{
switch(direction)
{
case 4:
res2.x-=step;
return 1;
case 6:
res2.x+=step;
return 1;
case 8:
res2.y-=step;
return 1;
case 2:
res2.y+=step;
return 1;
}
}
switch(direction)
{
case 4:
if(res2.x!=test->left)
{
res2.x-=step;
return 1;
}
else
{
running=0;
return 0;
}
case 6:
if(res2.x!=test->right-res.apprect.right)
{
res2.x+=step;
return 1;
}
else
{
running=0;
return 0;
}
case 8:
if(res2.y!=test->top)
{
res2.y-=step;
return 1;
}
else
{
running=0;
return 0;
}
case 2:
if(res2.y!=test->bottom-res.apprect.bottom)
{
res2.y+=step;
return 1;
}
else
{
running=0;
return 0;
}
}
return 1;
}
bool OBJECT::Put(bool tr,BYTE percent,USHORT colorkey)
{
if( sfc==NULL)
return 0;
if( sfc->IsLost() )
sfc->Restore();
int i=GetDirection();
SetRect(&from,
step * res.apprect.right,
i * res.apprect.bottom,
step * res.apprect.right + res.apprect.right,
i * res.apprect.bottom + res.apprect.bottom);
SetRect(&to,res2.x,res2.y,
res2.x+res.apprect.right,res2.y+res.apprect.bottom);
if(tr)
Tr(back,to,screen,
sfc,from,res.rect,
percent,colorkey,0);
else
CopySurface( back,to,screen,
sfc,from,res.colorkey);
return 1;
}
void OBJECT::SetSpot()
{
if( res.apprect.right==0 || res.apprect.bottom==0 )
return;
spot=(res2.x/res.apprect.right)
+ (res2.y/res.apprect.bottom)
* (screen.right/res.apprect.right);
}
int OBJECT::GetDirection()
{
int i=0;
switch(direction)
{
case 2:
i=0;
break;
case 4:
i=1;
break;
case 8:
i=2;
break;
case 6:
i=3;
break;
}
return i;
}
//---------------------------------------------------------------
GAME::GAME()
{
aresmem=0;
areslength=0;
ares2mem=0;
ares2length=0;
accmem=0;
acclength=0;
dlgmem=0;
dlglength=0;
fade=-1;
step=2;
ZeroMemory(process,sizeof(BYTE)*255);
}
GAME::~GAME()
{
if(aresmem!=0)
free(aresmem);
if(ares2mem!=0)
free(ares2mem);
if(accmem!=0)
free(accmem);
if(dlgmem!=0)
free(dlgmem);
}
void GAME::Init(LPSTR aresfile,LPSTR ares2file,
LPSTR accfile,LPSTR dlgfile,
int w,int h)
{
long hfile;
hfile=open(aresfile,_O_RDONLY | _O_BINARY);
if(hfile!=-1)
{
areslength=filelength(hfile);
aresmem=(char *)malloc(areslength);
read(hfile,aresmem,areslength);
close(hfile);
}
hfile=open(ares2file,_O_RDONLY | _O_BINARY);
if(hfile!=-1)
{
ares2length=filelength(hfile);
ares2mem=(char *)malloc(ares2length);
read(hfile,ares2mem,ares2length);
close(hfile);
}
hfile=open(accfile,_O_RDONLY | _O_BINARY);
if(hfile!=-1)
{
acclength=filelength(hfile);
accmem=(char *)malloc(acclength);
read(hfile,accmem,acclength);
close(hfile);
}
hfile=open(dlgfile,_O_RDONLY | _O_BINARY);
if(hfile!=-1)
{
dlglength=filelength(hfile);
dlgmem=(char *)malloc(dlglength);
read(hfile,dlgmem,dlglength);
close(hfile);
}
SetRect(&screen,0,0,w,h);
}
//---------------------------------------------------------------
DKEY::DKEY()
{
g_pdi=NULL;
g_pKeyboard=NULL;
}
DKEY::~DKEY()
{
if (g_pdi!=NULL)
{
if (g_pKeyboard!=NULL)
{
g_pKeyboard->Unacquire();
g_pKeyboard->Release();
g_pKeyboard = NULL;
}
g_pdi->Release();
g_pdi = NULL;
}
}
BOOL DKEY::Create(HWND hwnd,HINSTANCE ins)
{
HRESULT hr;
hr = DirectInputCreate(ins, DIRECTINPUT_VERSION, &g_pdi, NULL);
hr = g_pdi->CreateDevice(GUID_SysKeyboard, &g_pKeyboard, NULL);
hr = g_pKeyboard->SetDataFormat(&c_dfDIKeyboard);
hr = g_pKeyboard->
SetCooperativeLevel(hwnd,
DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
hr = g_pKeyboard->Acquire();
if (FAILED(hr))
{
MessageBox(hwnd,"DKEY ERROR","DIRECT KEYBOARD",MB_OK);
return FALSE;
}
return TRUE;
}
void DKEY::GetInput(void)
{
HRESULT hr;
if (g_pKeyboard!=NULL)
{
hr = g_pKeyboard->GetDeviceState
(sizeof(keys), (LPVOID)&keys);
if (hr == DIERR_INPUTLOST)
{
hr = g_pKeyboard->Acquire();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -