📄 game_render.cpp
字号:
glNormal3f(cos(alfa), sin(alfa), 0.0);
glBegin(GL_QUADS);
glVertex3f(x1, y1, ks);
glVertex3f(x2, y2, ks);
glVertex3f(x2, y2, 0.0);
glVertex3f(x1, y1, 0.0);
glEnd();
}
hx=theGame.holes[4].x[0], hy=theGame.holes[4].x[1], hr=theGame.holes[4].r, beta=2*PI/3;
alfa=PI;
bdx=theGame.boundaries[3].x[3][0],bdy=theGame.boundaries[4].x[0][1],
bdr=theGame.boundaries[1].x[0][0]-theGame.boundaries[2].x[0][0]+dt;
for(z=0;z<10;z++){
x3=hx+hr*cos(beta);y3=hy+hr*sin(beta);
x2=bdx+bdr*cos(alfa);y2=bdy+bdr*sin(alfa);
beta+=7*PI/60;
alfa+=PI/20;
x4=hx+hr*cos(beta);y4=hy+hr*sin(beta);
x1=bdx+bdr*cos(alfa);y1=bdy+bdr*sin(alfa);
x5=x4;x6=x3;y5=y4;y6=y3;
glNormal3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
glVertex3f(x4, y4, ks);
glVertex3f(x3, y3, ks);
glVertex3f(x2, y2, ks);
glVertex3f(x1, y1, ks);
glEnd();
glNormal3f(-cos(beta), -sin(beta), 0.0);
glBegin(GL_QUADS);
glVertex3f(x3, y3, ks);
glVertex3f(x4, y4, ks);
glVertex3f(x5, y5, 0.0);
glVertex3f(x6, y6, 0.0);
glEnd();
glNormal3f(cos(alfa), sin(alfa), 0.0);
glBegin(GL_QUADS);
glVertex3f(x1, y1, ks);
glVertex3f(x2, y2, ks);
glVertex3f(x2, y2, 0.0);
glVertex3f(x1, y1, 0.0);
glEnd();
}
hx=theGame.holes[5].x[0], hy=theGame.holes[5].x[1], hr=theGame.holes[5].r, beta=PI/6;
alfa=PI/2;
bdx=theGame.boundaries[5].x[0][0],bdy=theGame.boundaries[4].x[3][1],
bdr=theGame.boundaries[1].x[0][0]-theGame.boundaries[2].x[0][0]+dt;
for(z=0;z<10;z++){
x3=hx+hr*cos(beta);y3=hy+hr*sin(beta);
x2=bdx+bdr*cos(alfa);y2=bdy+bdr*sin(alfa);
beta+=7*PI/60;
alfa+=PI/20;
x4=hx+hr*cos(beta);y4=hy+hr*sin(beta);
x1=bdx+bdr*cos(alfa);y1=bdy+bdr*sin(alfa);
x5=x4;x6=x3;y5=y4;y6=y3;
glNormal3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
glVertex3f(x4, y4, ks);
glVertex3f(x3, y3, ks);
glVertex3f(x2, y2, ks);
glVertex3f(x1, y1, ks);
glEnd();
glNormal3f(-cos(beta), -sin(beta), 0.0);
glBegin(GL_QUADS);
glVertex3f(x3, y3, ks);
glVertex3f(x4, y4, ks);
glVertex3f(x5, y5, 0.0);
glVertex3f(x6, y6, 0.0);
glEnd();
glNormal3f(cos(alfa), sin(alfa), 0.0);
glBegin(GL_QUADS);
glVertex3f(x1, y1, ks);
glVertex3f(x2, y2, ks);
glVertex3f(x2, y2, 0.0);
glVertex3f(x1, y1, 0.0);
glEnd();
}
// Draw holes
int m=theGame.num_holes;
glMaterialf(GL_FRONT, GL_SHININESS, 100.0);
glColorMaterial(GL_FRONT, GL_SPECULAR);
glColor3ub(0, 200, 100);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
for (i=0; i<m; ++i)
{
CHole *h;
h=theGame.holes+i;
glColor3ub(0, 200, 100);
glPushMatrix();
glTranslated(h->x[0], h->x[1], h->top);
glScalef(h->r, h->r, h->r);
if(i==0 || i==3)glCallList(disk_list_m);
else glCallList(disk_list);
glPopMatrix();
//Draw cylinders
glColor3ubv(h->color);
glPushMatrix();
glTranslated(h->x[0], h->x[1], h->bottom);
glScalef(h->r, h->r, h->top-h->bottom);
glCallList(cylinder_list_1);
glCallList(cylinder_list_2);
glPopMatrix();
}
// Draw desk
glBegin(GL_QUADS);
double dkx=0.5*theGame.sizex-0.03,dky=0.5*theGame.sizey-0.03;
glNormal3f(1.0,0.0,0.0);
glVertex3f(dkx,-dky,-theGame.thickness);
glVertex3f(dkx,dky,-theGame.thickness);
glVertex3f(dkx,dky,0.0);
glVertex3f(dkx,-dky,0.0);
glNormal3f(0.0,1.0,0.0);
glVertex3f(dkx,dky,-theGame.thickness);
glVertex3f(-dkx,dky,-theGame.thickness);
glVertex3f(-dkx,dky,0.0);
glVertex3f(dkx,dky,0.0);
glNormal3f(-1.0,0.0,0.0);
glVertex3f(-dkx,dky,-theGame.thickness);
glVertex3f(-dkx,-dky,-theGame.thickness);
glVertex3f(-dkx,-dky,0.0);
glVertex3f(-dkx,dky,0.0);
glNormal3f(0.0,-1.0,0.0);
glVertex3f(-dkx,-dky,-theGame.thickness);
glVertex3f(dkx,-dky,-theGame.thickness);
glVertex3f(dkx,-dky,0.0);
glVertex3f(-dkx,-dky,0.0);
glEnd();
// Draw boundaries
int t=theGame.num_boundaries;
glMaterialf(GL_FRONT, GL_SHININESS, 100.0);
glColorMaterial(GL_FRONT, GL_SPECULAR);
glColor3ub(0, 0, 0);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glBegin(GL_QUADS);
for (i=0; i<t; ++i)
{
CBoundary *b;
b=theGame.boundaries+i;
glColor3ub(0, 180, 80);
double n1,n2,low=0.01;
glNormal3f(b->topn[0],b->topn[1],b->topn[2]);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(b->x[1][0],b->x[1][1],b->top-low);
glVertex3f(b->x[2][0],b->x[2][1],b->top-low);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(b->x[1][0],b->x[1][1],b->bottom);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
glVertex3f(b->x[2][0],b->x[2][1],b->bottom);
double ll[2],jj[2];
if(b->inn[0]>0){
ll[0]=b->x[1][0]-bevel;
jj[0]=b->x[2][0]-bevel;
}
else if(b->inn[0]<0){
ll[0]=b->x[1][0]+bevel;
jj[0]=b->x[2][0]+bevel;
}
else{
ll[0]=b->x[1][0];
jj[0]=b->x[2][0];
}
if(b->inn[1]>0){
ll[1]=b->x[1][1]-bevel;
jj[1]=b->x[2][1]-bevel;
}
else if(b->inn[1]<0){
ll[1]=b->x[1][1]+bevel;
jj[1]=b->x[2][1]+bevel;
}
else{
ll[1]=b->x[1][1];
jj[1]=b->x[2][1];
}
glNormal3f(b->inn[0], b->inn[1], 0.0);
glVertex3f(b->x[1][0],b->x[1][1],b->top-low);
glVertex3f(ll[0],ll[1],b->bottom);
glVertex3f(jj[0],jj[1],b->bottom);
glVertex3f(b->x[2][0],b->x[2][1],b->top-low);
glNormal3f(-b->n[1][0], -b->n[1][1], 0.0);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glNormal3f(b->n[0][0], b->n[0][1], 0.0);
glVertex3f(b->x[1][0],b->x[1][1],b->top-low);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glVertex3f(ll[0],ll[1],b->bottom);
glNormal3f(b->n[2][0], b->n[2][1], 0.0);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glVertex3f(b->x[2][0],b->x[2][1],b->top-low);
glVertex3f(jj[0],jj[1],b->bottom);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
}
glEnd();
//Draw the outer boundaries
glMaterialf(GL_FRONT, GL_SHININESS, 100.0);
glColorMaterial(GL_FRONT, GL_SPECULAR);
glColor3ub(0, 0, 0);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glBegin(GL_QUADS);
for (i=0; i<num_boundaries; ++i)
{
CBoundary *b;
b=theGame.boundaries+i;
double x4[2], x5[2];
x4[0]=b->x[0][0]-dt*b->n[1][0];
x4[1]=b->x[0][1]-dt*b->n[1][1];
x5[0]=b->x[3][0]-dt*b->n[1][0];
x5[1]=b->x[3][1]-dt*b->n[1][1];
glColor3ubv(b->color);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glVertex3f(x5[0],x5[1],b->top);
glVertex3f(x4[0],x4[1],b->top);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glVertex3f(x4[0],x4[1],b->bottom);
glVertex3f(x5[0],x5[1],b->bottom);
glNormal3f(b->n[1][0], b->n[1][1], 0.0);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
glNormal3f(-b->n[1][0], -b->n[1][1], 0.0);
glVertex3f(x4[0],x4[1],b->top);
glVertex3f(x5[0],x5[1],b->top);
glVertex3f(x5[0],x5[1],b->bottom);
glVertex3f(x4[0],x4[1],b->bottom);
glNormal3f(-b->n[1][1], b->n[1][0], 0.0);
glVertex3f(b->x[0][0],b->x[0][1],b->top);
glVertex3f(x4[0],x4[1],b->top);
glVertex3f(x4[0],x4[1],b->bottom);
glVertex3f(b->x[0][0],b->x[0][1],b->bottom);
glNormal3f(b->n[1][1], -b->n[1][0], 0.0);
glVertex3f(x5[0],x5[1],b->top);
glVertex3f(b->x[3][0],b->x[3][1],b->top);
glVertex3f(b->x[3][0],b->x[3][1],b->bottom);
glVertex3f(x5[0],x5[1],b->bottom);
}
glEnd();
Render2DPanel();
glFlush();
};
void CPoolGame::GL_init(void)
{
int subd1=30,subd2=10;
GL_init2D();
GLUquadricObj *qobj ;
qobj=gluNewQuadric();
leg_list=glGenLists(1);
sphere_list=glGenLists(1);
disk_list=glGenLists(1);
disk_list_m=glGenLists(1);
cylinder_list_1=glGenLists(1);
cylinder_list_2=glGenLists(1);
shadow_list=glGenLists(1);
rod_list=glGenLists(1);
gluQuadricDrawStyle(qobj, GLU_FILL);
gluQuadricNormals(qobj, GLU_SMOOTH);
//fog
GLfloat fogColor[4] = {0.6f, 0.6f, 0.6f, 1.0f};
//glEnable(GL_FOG);
{
glFogi (GL_FOG_MODE, GL_LINEAR);
//glFogi (GL_FOG_MODE, GL_EXP);
//glFogi (GL_FOG_MODE, GL_EXP2);
glFogfv (GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 1.0);
glFogf (GL_FOG_START, 1.0);
glFogf (GL_FOG_END,3.0);
glHint (GL_FOG_HINT, GL_DONT_CARE);
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
}
//leg lise
glNewList(leg_list, GL_COMPILE);
glNormal3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
glVertex3f(thick, thick, 0.0);
glVertex3f(thick, -thick, 0.0);
glVertex3f(thick, -thick, -tall);
glVertex3f(thick, thick, -tall);
glEnd();
glNormal3f(-1.0, 0.0, 0.0);
glBegin(GL_QUADS);
glVertex3f(-thick, -thick, 0.0);
glVertex3f(-thick, thick, 0.0);
glVertex3f(-thick, thick, -tall);
glVertex3f(-thick, -thick, -tall);
glEnd();
glNormal3f(0.0, 1.0, 0.0);
glBegin(GL_QUADS);
glVertex3f(-thick, thick, 0.0);
glVertex3f(thick, thick, 0.0);
glVertex3f(thick, thick, -tall);
glVertex3f(-thick, thick, -tall);
glEnd();
glNormal3f(0.0, -1.0, 0.0);
glBegin(GL_QUADS);
glVertex3f(thick, -thick, 0.0);
glVertex3f(-thick, -thick, 0.0);
glVertex3f(-thick, -thick, -tall);
glVertex3f(thick, -thick, -tall);
glEnd();
glEndList();
//sphere list
glNewList(sphere_list, GL_COMPILE);
gluSphere(qobj, 1.0, subd1, subd1);
glEndList();
//disk list
glNewList(disk_list, GL_COMPILE);
gluDisk(qobj, 1.0, 2.0, subd1, subd2);
glEndList();
glNewList(disk_list_m, GL_COMPILE);
gluDisk(qobj, 1.0, 1.5, subd1, subd2);
glEndList();
//cylinder list
glNewList(cylinder_list_1, GL_COMPILE);
gluQuadricOrientation(qobj,GLU_OUTSIDE);
gluCylinder(qobj, 1.4, 1.4, 1.0, subd1, subd2);
glEndList();
glNewList(cylinder_list_2, GL_COMPILE);
gluQuadricOrientation(qobj,GLU_INSIDE);
gluCylinder(qobj, 1.0, 1.0, 1.0, subd1, subd2);
gluQuadricOrientation(qobj,GLU_OUTSIDE);
gluDisk(qobj, 0.0, 1.2, subd1, subd2);
glEndList();
gluQuadricOrientation(qobj,GLU_OUTSIDE);
//shadow list
glNewList(shadow_list, GL_COMPILE);
gluDisk(qobj, 0.0, 1.1, subd1, subd2);
glEndList();
// rod list
gluQuadricTexture(qobj, GL_TRUE);
glNewList(rod_list, GL_COMPILE);
gluCylinder(qobj, rod_radius, rod_radius, rod_length, subd1, subd2);
glTranslated(0.0, 0.0, rod_length);
gluDisk(qobj, 0.0, rod_radius, subd1, subd2);
glEndList();
gluDeleteQuadric(qobj);
glClearColor (0.0f, 0.0f, 0.6f, 1.0f);
glShadeModel (GL_SMOOTH);
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_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 100);
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 50);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
theCamera.SetParameters(2.0, 0.0, 1.0, 180.0, -30.0);
tex_floor=GL_load_texture("floor.bmp", 128, 128);
tex_rod=GL_load_texture("rod.bmp", 128, 128);
};
void CPoolGame::GL_resize(int w, int h)
{
viewport_x=w;
viewport_y=h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, (double)w/(double)h, 0.2, 10.0);
};
void CPoolGame::GL_cleanup(void)
{
glDeleteLists(leg_list,1);
glDeleteLists(sphere_list, 1);
glDeleteLists(disk_list, 1);
glDeleteLists(disk_list_m, 1);
glDeleteLists(cylinder_list_1, 1);
glDeleteLists(cylinder_list_2, 1);
glDeleteLists(shadow_list,1);
glDeleteLists(rod_list,1);
GL_cleanup2D();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -