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

📄 textout.cpp

📁 RPG单机游戏圣剑英雄传的源代码(声音、图片、剧情等)希望给对于想制作游戏的人有一定帮助。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//======================文字处理模块===================

#include "conio.h"

HFONT Font=NULL;

void DrawMenu(int MenuIt);
void Delay(long time);
void ShowState();
void ShowGoods(int num);
int GoodsDialog();
void ShowAbout();

char *GetTalk(int ID,int Talk_Num);
void ShowDialog(int Npc_Num, int ID, int Talk_Num);
void PressKey(DWORD Key,int x=0);

//*********************************************
//读取物品数据
void LoadGoodData()
{
	char *data=0;
	int fh;
	int nbytes;
	int lpFile=0;

   		fh = _open( "text/goods.dat", _O_RDONLY );
		nbytes=_filelength(fh);
		free(data);
		data=(char *)malloc(nbytes);
		_read( fh, data, nbytes );
		_close(fh);
					
		lpFile=0;
		int Nums=ReadLine(data,lpFile,0);
		
		for( int j=2; j<Nums+2; j++)
		{
		Goods[j].ID = ReadLine(data,lpFile,0);	
		ReadLine( data, lpFile, Goods[j].Name);
		ReadLine( data, lpFile, Goods[j].About);
		Goods[j].Money = ReadLine(data,lpFile,0);
		Goods[j].Exp = ReadLine(data,lpFile,0);
		Goods[j].Lift = ReadLine(data,lpFile,0);	
		Goods[j].Attack = ReadLine(data,lpFile,0);	
		Goods[j].Defend = ReadLine(data,lpFile,0);
		ReadLine(data,lpFile,0);
		}
}

//****初始化字体******
void InitFont()
{
Font=CreateFont(20,
				0,
				0,
				0,
				400,
				FALSE,
				FALSE,
				0,
				GB2312_CHARSET,
				OUT_DEFAULT_PRECIS,
				CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY,
				DEFAULT_PITCH|FF_SWISS,
				"宋体");
}

//*********************************
//文字显示
void PrintText(LPDIRECTDRAWSURFACE Surf,int x,int y,char *Text,DWORD color=RGB(0,0,0), DWORD BK=TRANSPARENT, DWORD BkColor=RGB(255,255,255),int WIDTH=50)
{
	HDC hdc;
	int ChrLen;
	char Tmp[100];

	if( Text=="" ) return;

	Surf->GetDC(&hdc);
	SetBkMode(hdc, BK);
	SetBkColor(hdc, BkColor);
	SetTextColor(hdc, color); 

	SelectObject(hdc,Font);

	ChrLen=strlen(Text)+1;
	for(int i=0; i<=ChrLen/WIDTH; i++ )
	{
		memset(Tmp,0,100);
		for(int j=0; j<((i==ChrLen/WIDTH)?ChrLen%WIDTH:WIDTH); j++) 
		{
			Tmp[j]=*Text;
			Text++;
		}
		TextOut(hdc, x, y, Tmp, strlen(Tmp));
		y+=20;
	}

	Surf->ReleaseDC(hdc);
}

//**************************8
//主菜单
void Menu()
{
	int MenuIt=0;
	DrawMenu(MenuIt);
	PressKey(VK_RETURN,1);

	while( 1 )
	{
		if( GetAsyncKeyState(VK_DOWN) )	//下一项
		{
			PressKey(VK_DOWN,1);
			MenuIt=(MenuIt+1)%7;
			DrawMenu(MenuIt);
		}
		if( GetAsyncKeyState(VK_UP) )	//上一项
		{
			PressKey(VK_UP,1);
			if( MenuIt==0 ) MenuIt=6;
			else MenuIt--;
			DrawMenu(MenuIt);
		}
		if( GetAsyncKeyState(VK_RETURN) )	//确定
		{
			while( GetAsyncKeyState(VK_RETURN) ) {}
			switch( MenuIt )
			{
			case 0:	//状态
				MainMove();
				Flip();
				ShowState();
				MenuIt=6;
				break;
			case 1: //物品
				GoodsDialog();
				MenuIt=6;
				MainMove();
				Flip();
				return;
			case 2: //取档
				if( LoadGame()==TRUE )
				{
					ChangePalette(MainPal, NullPal, -1);
					DrawMenu(MenuIt);
					ChangePalette(NullPal, MainPal, 1);
				}
				else DrawMenu(MenuIt);
				break;
			case 3:	//存档
				if( SaveGame()==TRUE )
				{
					ChangePalette(MainPal, NullPal, -1);
					DrawMenu(MenuIt);
					ChangePalette(NullPal, MainPal, 1);
				}
				else DrawMenu(MenuIt);
				break;
			case 4:	//关于游戏
				MainMove();
				Flip();
				ShowAbout();
				MenuIt=6;
				break;
			case 5:	//退出
				ChangePalette(MainPal,NullPal,-1);
				//PostMessage(hWnd, WM_CLOSE, 0, 0);
				GameTitle();
				return;
				break;
			case 6:	//返回游戏
				MainMove();
				Flip();
				return;
			}
		}
		if( GetAsyncKeyState(VK_ESCAPE) )	//返回
		{
			while( GetAsyncKeyState(VK_ESCAPE) ) {}
			MainMove();
			Flip();
			return;
		}
	}
	
}

//***************************
//画主菜单
void DrawMenu(int MenuIt)
{
	int x=0,y=280;
	char *MainMenu[]={"状  态","物  品","读取进度","存储进度","关于游戏","退  出","返回游戏"};
	
	MainMove();
	rect=GetRect(0,0,150,200);
	Blt(lpDDSBack, x,y, lpDDSMainMenu, rect, FALSE);
	for( int i=0; i<7; i++ )
	{
		DWORD T1=0,T2=0;
		if( MenuIt == i )
		{
			T1=OPAQUE;
			T2=RGB(0,0,100);
		}
		PrintText(lpDDSBack, x+36, y+22+i*24, MainMenu[i],RGB(0,0,0), T1, T2);
		PrintText(lpDDSBack, x+34, y+20+i*24, MainMenu[i],RGB(255,255,255), T1, T2);
	}
	Flip();
}

//**************************
//显示状态
void ShowState()
{
	char *Stat[]={"等级","经验","生命","攻击","防御","速度","金钱"};
	char Temp[100];
	int x=120, y=90;
	rect=GetRect(0,0,420,320);
	Blt(lpDDSPrimary, x-10,y-10, lpDDSStateBar, rect, TRUE);
	rect=GetRect(0,0,Hero.Width, Hero.Hight);
	Blt(lpDDSPrimary, x+10, y+10, lpDDSSpirit, rect, TRUE);
	
	sprintf(Temp,"%s:%10d",Stat[0],Hero.Level);	//等级
	PrintText(lpDDSPrimary, x+122, y+52, Temp );
	PrintText(lpDDSPrimary, x+120, y+50, Temp, RGB(255,255,255));
	sprintf(Temp,"%s:%10d/100",Stat[1],Hero.Exp);	//经验
	PrintText(lpDDSPrimary, x+122, y+82, Temp );
	PrintText(lpDDSPrimary, x+120, y+80, Temp, RGB(255,255,255));
	sprintf(Temp,"%s:%10d/%d",Stat[2],Hero.Lift,Hero.MaxLift);	//生命
	PrintText(lpDDSPrimary, x+122, y+112, Temp);
	PrintText(lpDDSPrimary, x+120, y+110, Temp,RGB(255,255,255));
	sprintf(Temp,"%s:%10d",Stat[3],Hero.Attack);//攻击
	PrintText(lpDDSPrimary, x+122, y+142, Temp);
	PrintText(lpDDSPrimary, x+120, y+140, Temp,RGB(255,255,255));
	sprintf(Temp,"%s:%10d",Stat[4],Hero.Defend);//防御
	PrintText(lpDDSPrimary, x+122, y+172, Temp);
	PrintText(lpDDSPrimary, x+120, y+170, Temp,RGB(255,255,255));
	sprintf(Temp,"%s:%10d",Stat[5],Hero.Speed);//速度
	PrintText(lpDDSPrimary, x+122, y+202, Temp);
	PrintText(lpDDSPrimary, x+120, y+200, Temp,RGB(255,255,255));
	sprintf(Temp,"%s:%10d",Stat[6],Hero.Money);//金钱
	PrintText(lpDDSPrimary, x+122, y+232, Temp);
	PrintText(lpDDSPrimary, x+120, y+230, Temp,RGB(255,255,0));
}

//**************************
//显示物品
void ShowGoods(int num)
{
	int x=120,y=90;
	char temp[200];
	
	MainMove();
	rect=GetRect(0,0,420,320);
	Blt(lpDDSBack, x-10,y-10, lpDDSStateBar, rect, TRUE);

	if( Hero.Goods[num] != ' ' )
	{
		int N=Hero.Goods[num]-0x30;
		sprintf(temp,"%16s  (价值:%5d)", Goods[ Hero.Goods[num]-0x30 ].Name, Goods[N].Money);
		PrintText(lpDDSBack,x,y+20, temp, RGB(255,255,255));
		sprintf(temp,"经验: %3d 生命:%3d 攻击:%3d 防御:%3d",Goods[N].Exp, Goods[N].Lift, Goods[N].Attack, Goods[N].Defend);
		PrintText(lpDDSBack,x+20,y+80, temp, RGB(255,255,255),TRANSPARENT,0, 10);
		PrintText(lpDDSBack,x+150,y+80, Goods[N].About, RGB(255,255,0), TRANSPARENT, 0, 22);
	}
	
	char TempChar[200];
	sprintf(TempChar, "(金=%4d) CTRL=使用‘A’=丢弃 ESC=退出", Hero.Money);
	PrintText(lpDDSBack,x+10,y+277, TempChar, RGB(255,255,255));

	for(int i=0; i<2; i++)
		for(int j=0; j<8; j++)
		{
			rect=GetRect(0,0,48,48);
			Blt(lpDDSBack, x+5+j*49, 270+i*49, lpDDSGoods, rect, TRUE);

			int good=Hero.Goods[i*8+j]-0x30;
			if( good != ' '-0x30 )
			{
				rect=GetRect(good%8*48, good/8*48, good%8*48+48, good/8*48+48);
				Blt(lpDDSBack, x+5+j*49, 270+i*49, lpDDSGoods, rect, TRUE);
			}
			if( num == i*8+j )
			{
				rect=GetRect(48,0,96,48);
				Blt(lpDDSBack, x+5+j*49, 270+i*49, lpDDSGoods, rect, TRUE);
			}
		}

	Flip();
}

//****************************
//物品对话框
int GoodsDialog()
{
	int n=0,ret=0;
	ShowGoods(n);
	PressKey(VK_CONTROL,1);
	PressKey('A',1);

	while( 1 )
	{
		if( GetAsyncKeyState(VK_RIGHT) )	//下一项
		{
			PressKey(VK_RIGHT,1);
			n=(n+1)%16;
			ShowGoods(n);
		}
		else if( GetAsyncKeyState(VK_LEFT) )	//上一项
		{
			PressKey(VK_LEFT,1);
			if( n==0 ) n=15;
			else n--;
			ShowGoods(n);
		}
		else if( GetAsyncKeyState(VK_DOWN) )	//下8项
		{
			PressKey(VK_DOWN,1);
			n=(n+8)%16;
			ShowGoods(n);
		}
		else if( GetAsyncKeyState(VK_UP) )	//上8项
		{
			PressKey(VK_UP,1);
			if( n>=8 ) n-=8;
			else n+=8;
			ShowGoods(n);
		}
		else if( GetAsyncKeyState(VK_CONTROL) )	//确定
		{
			PressKey(VK_CONTROL,1);
			if( Hero.Goods[n]!=' ' )
			{
			int NNN=Hero.Goods[n]-0x30;
			Hero.Exp+=Goods[NNN].Exp;
			Hero.Lift+=Goods[NNN].Lift;
			if( Hero.Lift>Hero.MaxLift ) 
				Hero.Lift=Hero.MaxLift;
			Hero.Attack+=Goods[NNN].Attack;
			Hero.Defend+=Goods[NNN].Defend;
			Hero.Goods[n]=' ';
			ShowGoods(n);

				char *Stat[]={"等级","经验","生命","攻击","防御","速度","金钱"};
				char Temp[100];
				int x=120, y=90;
				
				sprintf(Temp,"现在的状态:");
				PrintText(lpDDSPrimary, x+152, y+7, Temp );
				PrintText(lpDDSPrimary, x+150, y+5, Temp, RGB(255,255,0));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -