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

📄 gui.cpp

📁 有个小游戏
💻 CPP
字号:
#include "stdafx.h"

#include "gui.h"
#include <math.h>

#include "world.h"

CGUI::CGUI()
{
	minutesLeft = secondsLeft = enemiesLeft = 0;
	m_font1 = CreateFont(-13,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"宋体");
	m_font2 = CreateFont(-26,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"黑体");
	m_font3 = CreateFont(-40,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"楷体_GB2312");
	m_font4 = CreateFont(-15,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"宋体");

	m_showHelp = GL_TRUE;
}

CGUI::~CGUI()
{
	DeleteObject(m_font1);
	DeleteObject(m_font2);
	DeleteObject(m_font3);
	DeleteObject(m_font4);
}

void CGUI::SetCurrentTime(float timeLeft)//, float fps)
{
	// timeLeft is in seconds

	minutesLeft = (int)(timeLeft / 60.0);	// 60 seconds in 1 minute
	secondsLeft = (int)floor(timeLeft) % 60;
	millisecondsLeft = (int)((timeLeft - (float)floor(timeLeft)) * 60);
}

void CGUI::SetFPS(float fps)
{
	m_fps = fps;
}

void CGUI::SetEnemiesLeft(int eLeft)
{
	enemiesLeft = eLeft;
}

void CGUI::DrawWinner()
{

	static TCHAR szBuffer[256];

	EnterOrtho();

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_STENCIL_TEST);

	glColor3f(1.0f,0.2f,0.2f);

	sprintf(szBuffer, "你胜利了!");
	ShowText(0, 26, szBuffer, Center, type2);

	sprintf(szBuffer, "按ESC键退出");
	ShowText(0, 0, szBuffer, Center, type2);

	glEnable(GL_STENCIL_TEST);
	glEnable(GL_TEXTURE_2D);

	LeaveOrtho();
}

void CGUI::DrawLoser()
{

	static TCHAR szBuffer[256];

	EnterOrtho();

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_STENCIL_TEST);

	glColor3f(0.2f,1.0f,0.2f);

	sprintf(szBuffer, "你失败了!");
	ShowText(0, 26, szBuffer, Center, type2);

	sprintf(szBuffer, "按ESC键退出");
	ShowText(0, 0, szBuffer, Center, type2);

	glEnable(GL_STENCIL_TEST);
	glEnable(GL_TEXTURE_2D);

	LeaveOrtho();
}

void CGUI::Draw()
{
	static TCHAR szBuffer[256];

	glDisable(GL_STENCIL_TEST);
	glDisable(GL_TEXTURE_2D);

	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	{
		GLint width, height;
		EnterOrtho(&width, &height);

		

		GLfloat r = (width < height) ? (GLfloat)width : (GLfloat)height;
		r /= 2.0f;

		glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
		glBegin(GL_LINES);
			glVertex2f(-r/10.0f,0.0f);
			glVertex2f(r/10.0f,0.0f);
			glVertex2f(0.0f,-r/10.0f);
			glVertex2f(0.0f,r/10.0f);
		glEnd();


		int y = height /2 - 16;

		sprintf(szBuffer, "每秒帧数:%03.2f", m_fps);
		ShowText(width / 2 - 10, y, szBuffer, Right, type1);

		y -= 16;

		sprintf(szBuffer, "剩余时间:%02d:%02d:%02d",minutesLeft, secondsLeft, millisecondsLeft);
		ShowText(width / 2 - 10, y, szBuffer, Right, type1);

		y -= 16;
		sprintf(szBuffer, "剩余敌人:%02d",enemiesLeft);
		ShowText(width / 2 - 10, y, szBuffer, Right, type1);
		
		glColor4f(0.0f, 0.0f, 1.0f, 1.0f);

		ShowHelp(width, height, GL_TRUE);
		glColor4f(1.0f, 1.0f, 0.0f, 1.0f);

		ShowState(width, height);

		LeaveOrtho();
	}

	glDisable(GL_BLEND);
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_STENCIL_TEST);
}

void CGUI::ShowHelp(GLint width, GLint height,GLboolean show)
{
	static char * info[]={"F1键: 开启/关闭帮助",
		"F2键: 切换武器",
		"W键/向上方向键: 前进",
		"S键/向下方向键: 后退",
		"A键/向左方向键: 向左",
		"D键/向右方向键: 向右",
		"SHIFT键: 跑步(速度加倍)",
		"鼠标移动: 控制准星方向",
		"鼠标左键: 射击",
		"鼠标右键: 开启/关闭望远镜",
		"ESC键: 退出游戏",
	};
	int x = -width/2 + 10;
	int y = height/2 - 16;

	ShowText(x, y, info[0], Left, type1);
	y -= 16;
	if (m_showHelp)
	{
		for (int i=1; i<sizeof(info)/sizeof(info[0]); i++)
		{
			ShowText(x, y, info[i], Left, type1);
			y -= 16;
		}
	}
	return;
	
}

void CGUI::ShowState(GLint width, GLint height)
{
	static char buffer[32];
	static char * info[]={"望远镜: %s",
		"武器: %s",
		"开启",
		"关闭",
		"火箭筒",
		"步枪",
	};
	int x = width/2 - 10;
	int y = -height/2 + 16;

	sprintf(buffer, info[0], (world->camera->UsingTelescope() ? info[2] : info[3] ));
	ShowText(x, y, buffer, Right, type1);
	y += 16;

	sprintf(buffer, info[1], (world->GetWeapon() == wRocket ? info[4] : info[5] ));
	ShowText(x, y, buffer, Right, type1);

	return;
	y += 16;


	if (m_showHelp)
	{
		for (int i=1; i<sizeof(info)/sizeof(info[0]); i++)
		{
			ShowText(x, y, info[i], Left, type1);
			y -= 16;
		}
	}
	return;

}

void CGUI::ShowText(int x, int y, LPCTSTR lpszText, Align align, TextType type)
{
	struct
	{
		TextType type;
		HFONT font;
	} static sTable[] = {{type1, m_font1},
		{type2, m_font2},
		{type3, m_font3},
		{type4, m_font4}};
	
	HFONT hFont = NULL;
	for (int i=0; i<sizeof(sTable)/sizeof(sTable[0]); i++)
	{
		if (type == sTable[i].type)
		{
			hFont = sTable[i].font;
			break;
		}
	}

	SIZE size ={0,0}, bmSize={0,0};                                        //位图尺寸
	HDC hMemDC = CreateCompatibleDC(NULL);				//暂存设备场景

	//HFONT hFont  =CreateFont(-15,0,0,0,400,0,0,0,GB2312_CHARSET,0,0,0,FF_MODERN,"宋体");

	HFONT hFontOld =(HFONT)SelectObject(hMemDC,hFont);							//选择新字体

	GetTextExtentPoint32(hMemDC,lpszText,_tcslen(lpszText),&bmSize);//获取字符位图大小

	HBITMAP hBitmap = CreateBitmap(bmSize.cx, bmSize.cy, 1, 1, NULL);//创建与hMemDC相关单色位图

	HBITMAP hBitmapOld = (HBITMAP)SelectObject(hMemDC,hBitmap); //字符位图与hMemDC关连

	SetBkColor  (hMemDC, RGB(0,     0,   0));			//底色,黑色
	SetTextColor(hMemDC, RGB(255, 255, 255));			//字色,白色
	TextOut(hMemDC, 0, 0, lpszText, strlen(lpszText));	//输出文字到暂存hMemDC

	size.cx = (bmSize.cx + 31) & (~31);				//边缘对齐
	size.cy = bmSize.cy;
	int bufsize =size.cy * size.cx;					//图形数据长度
	struct {  BITMAPINFOHEADER bih;
	RGBQUAD col[2];
	}bic;                                      //定义单色位图结构
	BITMAPINFO *binf = (BITMAPINFO *)&bic;            //获取位图结构信息
	binf->bmiHeader.biSize     = sizeof(binf->bmiHeader);//
	binf->bmiHeader.biWidth    = bmSize.cx; // bm.bmWidth;			//图形宽
	binf->bmiHeader.biHeight   = bmSize.cy; // bm.bmHeight;			//图形高
	binf->bmiHeader.biPlanes   = 1;                   //
	binf->bmiHeader.biBitCount = 1;                   //单色
	binf->bmiHeader.biCompression = BI_RGB;           //颜色方式
	binf->bmiHeader.biSizeImage   = bufsize;          //图形数据长度
	//UCHAR* Bits = new UCHAR[bufsize];					//定义图形数据块变量
	static UCHAR Bits[64 * 1024];					//定义图形数据块变量
	GetDIBits(hMemDC,hBitmap,0, bmSize.cy /* bm.bmHeight*/,Bits,binf,DIB_RGB_COLORS); 
	//取设备无关数据到Bits
	glPixelStorei(GL_UNPACK_ALIGNMENT ,1);			//控制像素存储
	if (align == Center)
	{
		glRasterPos2i(x-bmSize.cx/2,y);
	}
	else if (align == Right)
	{
		glRasterPos2i(x-bmSize.cx,y);
	}
	else
	{
		glRasterPos2i(x, y);
	}
	//glRasterPos2i(x,y);                               //平面定位
	glBitmap(size.cx,size.cy,0,0,0,0,Bits);           //平面位图显示
	//delete Bits;                                      //删除Bits
	SelectObject(hMemDC, hBitmapOld);                        //恢复位图特性
	DeleteObject(hBitmap);
	SelectObject(hMemDC, hFontOld);
	//DeleteObject(hFont);
	DeleteDC(hMemDC);                                  //删除设备场景
}

void CGUI::SwitchShowHelp()
{
	m_showHelp = !m_showHelp;
}

⌨️ 快捷键说明

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