📄 ui.cpp
字号:
#include ".\ui.h"
CUI::CUI(HANDLE hOut)
{
m_hOut=hOut;
}
CUI::~CUI(void)
{
}
void CUI::UpDate(int hp1 , int mp1 , int hp2 , int mp2)
{
DrawBar(hp1 , mp1 , hp2 , mp2);
}
void CUI::AddInfo(char* chInfo)
{
string strInfo=chInfo;
if (strInfo.size()<=23) //超过一行变两行
{
vecInfo.push_back(chInfo);
}
else
{
string str1(strInfo.begin() , strInfo.begin()+22);
string str2(strInfo , 22);
vecInfo.push_back(str1);
str2=" "+str2;
if (str2.size()<=23)
{
vecInfo.push_back(str2);
}
else
{
string str3(str2.begin() , str2.begin()+22);
string str4(str2 , 22);
str4=" "+str4;
vecInfo.push_back(str3);
vecInfo.push_back(str4);
}
}
for (int i=0 ; vecInfo.size()>=5 ; i++)
{
vecInfo.erase(&vecInfo[0]);
}
//清空
FillBox(0 , 20 , 5 , 25 , BACKGROUND_GREEN | BACKGROUND_BLUE);
for (int i=0 ; i<5 ; i++)
{
DrawText(1 , 20+i , " " , BACKGROUND_GREEN | BACKGROUND_BLUE);
}
//绘制
for (int i=0 ; i<vecInfo.size() ; i++)
{
DrawText(1 , 20+i , vecInfo[i].c_str() , FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY |BACKGROUND_GREEN | BACKGROUND_BLUE);
}
}
void CUI::FillBox(int x , int y , int row , int col , WORD type)
{
WORD attBox=type; //方块属性
COORD pos={x , y};
for (int i=0 ; i<row ; i++)
{
FillConsoleOutputAttribute(m_hOut, attBox, col, pos, NULL);
pos.Y++;
}
}
void CUI::DrawText(int x , int y , const char* chText , WORD type)
{
WORD attText=type; //文字属性
COORD pos={x , y};
WriteConsoleOutputCharacter(m_hOut, chText, strlen(chText), pos, NULL);
FillConsoleOutputAttribute(m_hOut , attText , strlen(chText) , pos , NULL);
}
void CUI::TextBox(char* chText)
{
FillBox(38 , 12 , 3 , 24 , BACKGROUND_RED);
DrawText(38 , 13 , chText , FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED);
}
void CUI::ClearTextBox()
{
DrawText(38 , 12 , " " , FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
DrawText(38 , 13 , " " , FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
DrawText(38 , 14 , " " , FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
}
void CUI::startCG()
{
char* str=" 雷电Online ";
// 计算显示窗口大小和位置
int x1, y1, x2, y2, chNum = strlen(str);
x1 = (80 - chNum)/2 - 2;
y1 = 10/2 - 2;
x2 = x1 + chNum + 4;
y2 = y1 + 5;
WORD att1 = BACKGROUND_INTENSITY; // 阴影属性
WORD att0 = FOREGROUND_RED |FOREGROUND_GREEN |FOREGROUND_BLUE | FOREGROUND_INTENSITY |BACKGROUND_RED | BACKGROUND_BLUE; // 文本属性
WORD attText = FOREGROUND_GREEN |BACKGROUND_INTENSITY; // 文本属性
WORD attText2 = FOREGROUND_RED |BACKGROUND_INTENSITY; // 文本属性
WORD attText3 = FOREGROUND_BLUE |BACKGROUND_INTENSITY; // 文本属性
// 设置阴影
COORD posShadow = {x1-2, y1-2}, posText = {x1, y1+2};
for (int i=0; i<22; i++)
{
FillConsoleOutputAttribute(m_hOut, att1, chNum + 8, posShadow, NULL);
posShadow.Y++;
}
// 填充窗口背景
for (i=0; i<5; i++)
{
FillConsoleOutputAttribute(m_hOut, att0, chNum + 4, posText, NULL);
posText.Y++;
}
// 写文本和边框
posText.X = x1 + 2;
posText.Y = y1 + 4;
WriteConsoleOutputCharacter(m_hOut, str, strlen(str), posText, NULL);
COORD miaolinTextPos={35 , 10};
WriteConsoleOutputCharacter(m_hOut, "Create By MiaoLin", strlen("Create By MiaoLin"), miaolinTextPos, NULL);
FillConsoleOutputAttribute(m_hOut , attText , strlen("Create By MiaoLin") , miaolinTextPos , NULL);
COORD randTextPos={30 , 15};
WriteConsoleOutputCharacter(m_hOut, "请按任意键开始游戏...", strlen("请按任意键开始游戏..."), randTextPos, NULL);
FillConsoleOutputAttribute(m_hOut , attText2 , strlen("请按任意键开始游戏...") , randTextPos , NULL);
COORD conTextPos={23 , 20};
WriteConsoleOutputCharacter(m_hOut, "上下左右:WSAD | 开火:J | 必杀:K", strlen("上下左右:WSAD | 开火:J | 必杀:K"), conTextPos, NULL);
FillConsoleOutputAttribute(m_hOut , attText3 , strlen("上下左右:WSAD | 开火:J | 必杀:K") , conTextPos , NULL);
_getch();
system("cls");
}
void CUI::DrawBar(int hp1 , int mp1 , int hp2 , int mp2)
{
static int s_iFlash1=0;
static int s_iFlash2=0;
if (mp1>=10)
{
s_iFlash1++;
}
else
{
s_iFlash1=0;
}
if (mp2>=10)
{
s_iFlash2++;
}
else
{
s_iFlash2=0;
}
//玩家1血条
DrawText(5 , 8 , " Player(上) " , FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
DrawText(1 , 10 , " HP " , FOREGROUND_RED | BACKGROUND_INTENSITY);
FillBox(6 , 10 , 1 , 10 , BACKGROUND_INTENSITY); //清理上次绘制的痕迹
FillBox(6 , 10 , 1 , hp1 , BACKGROUND_RED);
//玩家1魔条
if (s_iFlash1%2!=0)
{
DrawText(1 , 12 , " MP " , FOREGROUND_BLUE | BACKGROUND_INTENSITY);
FillBox(6 , 12 , 1 , mp1 , BACKGROUND_BLUE);
}
else
{
DrawText(1 , 12 , " MP " , FOREGROUND_BLUE | BACKGROUND_INTENSITY);
FillBox(6 , 12 , 1 , 10 , BACKGROUND_INTENSITY);//清理上次绘制的痕迹
FillBox(6 , 12 , 1 , mp1 , BACKGROUND_BLUE | BACKGROUND_INTENSITY);
}
//玩家2血条
DrawText(5 , 14 , " Player(下) " , FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
DrawText(1 , 16 , " HP " , FOREGROUND_RED | BACKGROUND_INTENSITY);
FillBox(6 , 16 , 1 , 10 , BACKGROUND_INTENSITY);//清理上次绘制的痕迹
FillBox(6 , 16 , 1 , hp2 , BACKGROUND_RED);
//玩家2魔条
if (s_iFlash2%2!=0)
{
DrawText(1 , 18 , " MP " , FOREGROUND_BLUE | BACKGROUND_INTENSITY);
FillBox(6 , 18 , 1 , mp2 , BACKGROUND_BLUE | BACKGROUND_INTENSITY);
}
else
{
DrawText(1 , 18 , " MP " , FOREGROUND_BLUE | BACKGROUND_INTENSITY);
FillBox(6 , 18 , 1 , 10 , BACKGROUND_INTENSITY);//清理上次绘制的痕迹
FillBox(6 , 18 , 1 , mp2 , BACKGROUND_BLUE);
}
}
void CUI::FirstRender()
{
FillBox(0 , 0 , 25 , 25 , BACKGROUND_INTENSITY);
FillBox(2 , 1 , 6 , 21 , BACKGROUND_RED | BACKGROUND_BLUE);
DrawText(3 , 3 , " 雷电 Online" , FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE);
DrawText(14 , 5 , "v1.0" , FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE);
//血魔条
DrawBar(10 , 10 , 10 , 10);
//信息区
AddInfo("系统:游戏启动成功!");
//显示连接服务器
TextBox(" 正在连接服务器... ");
Sleep(200);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -