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

📄 game_render.cpp

📁 这是一个台球游戏的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -