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

📄 game.cpp

📁 一个简单的rpg游戏
💻 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 + -