📄 game_render2d.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 + -