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

📄 game_render2d.cpp

📁 这是一个台球游戏的源代码
💻 CPP
字号:
#include "Game.h"

GLuint font_base;
HDC current_dc;
HFONT font, oldfont;
int text_descent;

GLuint signball_list;

extern char hint[];
extern char congrats[];
extern bool power;

extern CPoolGame theGame;

void get_text_size(HDC dc, char *str, int &sizex, int &sizey)
{
	SIZE s;
	GetTextExtentPoint32(dc, str, strlen(str), &s);
	sizex=s.cx;
	sizey=s.cy;
}

void CPoolGame::GL_init2D(void)
{
	font = CreateFont(	-30,		// Height Of Font
				0,				// Width Of Font
				0,				// Angle Of Escapement
				0,				// Orientation Angle
				FW_BOLD,			// Font Weight
				FALSE,				// Italic
				FALSE,				// Underline
				FALSE,				// Strikeout
				ANSI_CHARSET,			// Character Set Identifier
				OUT_TT_PRECIS,			// Output Precision
				CLIP_DEFAULT_PRECIS,		// Clipping Precision
				ANTIALIASED_QUALITY,		// Output Quality
				FF_DONTCARE|DEFAULT_PITCH,	// Family And Pitch
				"Arial");			// Font m_Name

	current_dc=GetDC(NULL);

	oldfont=(HFONT)SelectObject(current_dc, font);
	TEXTMETRIC tm;
	GetTextMetrics(current_dc, &tm);
	text_descent=tm.tmDescent;

	font_base=glGenLists(256);
	wglUseFontBitmaps (current_dc, 0, 256, font_base); 	

	signball_list=glGenLists(1);

	GLUquadricObj *qobj;
	qobj=gluNewQuadric();
	gluQuadricDrawStyle(qobj, GLU_FILL);
	gluQuadricNormals(qobj, GLU_SMOOTH);

	glNewList(signball_list, GL_COMPILE);
		gluSphere(qobj, 1.0, 20, 20);
	glEndList();

	gluDeleteQuadric(qobj);

	static GLfloat light_ambient[] = { 0.01f, 0.01f, 0.01f, 1.0f };
	static GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	static GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

	glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
	glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);

	glDisable(GL_LIGHT1);
}

void CPoolGame::GL_cleanup2D(void)
{
	SelectObject(current_dc, oldfont);
	DeleteObject(font);
	ReleaseDC(NULL, current_dc);
	glDeleteLists(font_base, 256);
	glDeleteLists(signball_list, 1);
}

void CPoolGame::Render2DPanel()
{
	// Set projection and modelview matrices for 2D rendering
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	glOrtho(0, viewport_x, 0, viewport_y, -100.0f, 100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glDisable(GL_LIGHTING);
	glDisable(GL_DEPTH_TEST);

	// Draw texts
	glListBase(font_base);
	int cx, cy, player1_w, player2_w;

	get_text_size(current_dc, player1.m_Name, cx, cy);
	player1_w=cx;
	if(theGame.player1.m_bTurn)
		glColor3d(0.9, 0.9, 0.9);
	else 
		glColor3d(0.5, 0.5, 0.5);
	glRasterPos2i(0, viewport_y-cy+text_descent);
	glCallLists (strlen(player1.m_Name), GL_UNSIGNED_BYTE, player1.m_Name);

	get_text_size(current_dc, player2.m_Name, cx, cy);
	player2_w=cx;
	if(theGame.player1.m_bTurn)
		glColor3d(0.5, 0.5, 0.5);
	else 
		glColor3d(0.9, 0.9, 0.9);
	glRasterPos2i(viewport_x-cx, viewport_y-cy+text_descent);
	glCallLists (strlen(player2.m_Name), GL_UNSIGNED_BYTE, player2.m_Name);

	get_text_size(current_dc, hint, cx, cy);
	glColor3f(1.0, 1.0, 1.0);
	glRasterPos2i(5, text_descent);
	glCallLists (strlen(hint), GL_UNSIGNED_BYTE, hint);

	if(status == GS_OVER){
		get_text_size(current_dc, congrats, cx, cy);
		glColor3d(0.9, 0.1, 0.9);
		glRasterPos2i((viewport_x-cx)/2, (viewport_y-cy)/2+text_descent);
		glCallLists (strlen(congrats), GL_UNSIGNED_BYTE, congrats);
	}

	glListBase(0);

	// Draw hit speed bar
	if (status==GS_AIMING && power) {
		float ymax, ymin, yhit;

		ymin=viewport_y*0.5;
		ymax=viewport_y*0.85;

		yhit=ymin+(ymax-ymin)/(max_hit_speed-min_hit_speed)*(hit_speed-min_hit_speed);

		float xmin, xmax;
		xmin=viewport_x*0.025;
		xmax=viewport_x*0.05;
	
		glBegin(GL_QUADS);
			glColor3f(0.5, 0.5, 0.5);
			glVertex2f(xmin, ymax);
			glVertex2f(xmin, ymin);
			glVertex2f(xmax, ymin);
			glVertex2f(xmax, ymax);
		
			glColor3f(1.0, 1.0, 0.0);
			glVertex2f(xmin, ymin);
			glColor3f(1.0, 1.0, 0.0); 
			glVertex2f(xmax, ymin);
			glColor3f(1.0, 1.0-0.8*yhit/ymax, 0.0); 
			glVertex2f(xmax, yhit);
			glColor3f(1.0, 1.0-0.8*yhit/ymax, 0.0); 
			glVertex2f(xmin, yhit);
		glEnd();
	}

	glEnable(GL_DEPTH_TEST);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT1);
	glDisable(GL_LIGHT0);

	static GLfloat light_pos[] = { 1.0, 1.0, 1.0, 0.0 };
	glLightfv(GL_LIGHT1, GL_POSITION, light_pos);

	//draw sign ball
	if (choose==true)
	{
		float signball_radius=15.0;

		glMaterialf(GL_FRONT, GL_SHININESS, 60.0);
		glColorMaterial(GL_FRONT, GL_SPECULAR);
		glColor3ub(200, 200, 200);
		glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

		if(player1red)glColor3ub(140,28,24);
		else glColor3ub(222,222,0);
		glPushMatrix();
		glTranslatef(
			player1_w+1.1*signball_radius, 
			viewport_y-1.1*signball_radius, 
			0.0);
		glScalef(signball_radius, signball_radius, signball_radius);
		glCallList(signball_list);
		glPopMatrix();

		if(player1red)glColor3ub(222,222,0);
		else glColor3ub(140,28,24);
		glPushMatrix();
		glLoadIdentity();
		glTranslatef(
			viewport_x-player2_w-1.1*signball_radius, 
			viewport_y-1.1*signball_radius, 
			0.0);
		glScalef(signball_radius, signball_radius, signball_radius);
		glCallList(signball_list);
		glPopMatrix();
	}

	glEnable(GL_LIGHT0);
	glDisable(GL_LIGHT1);

	glMatrixMode(GL_PROJECTION);
	glPopMatrix();
}

⌨️ 快捷键说明

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