📄 textout.cpp
字号:
//======================文字处理模块===================
#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 + -