SnowMen(OpenGl编程)小游戏2008年04月06日 星期日 12:04
#include <windows.h>
#include <GL/glut.h>
#include <math.h>
float angle=0.0,ratio;
float x=0.0f,y=1.75f,z=5.0f;
float lx=0.0f,ly=0.0f,lz=-1.0f;
//--------------------------------------------
void changeSize(int w, int h)
{
// 防止被0除.
if(h == 0)
h = 1;
ratio = 1.0f * w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//设置视口为整个窗口大小
glViewport(0, 0, w, h);
//设置可视空间
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(x, y, z, x+lx, y+ly, z+lz, 0.0f,1.0f,0.0f);
}
void drawSnowMan()
{
glColor3f(1.0f, 1.0f, 1.0f);
float white[]={1,1,1,1};
float black[]={0,0,0,0};
float red[]={1,0,0,1};
glMaterialfv( GL_FRONT, GL_DIFFUSE, white );
//画身体
glTranslatef(0.0f ,0.75f, 0.0f);
glutSolidSphere(0.75f,20,20);
// 画头
glTranslatef(0.0f, 1.0f, 0.0f);
glutSolidSphere(0.25f,20,20);
glMaterialfv( GL_FRONT, GL_DIFFUSE, black );
// 画眼睛
glPushMatrix();
glColor3f(0.0f,0.0f,0.0f);
glTranslatef(0.05f, 0.10f, 0.18f);
glutSolidSphere(0.05f,10,10);
glTranslatef(-0.1f, 0.0f, 0.0f);
glutSolidSphere(0.05f,10,10);
glPopMatrix();
glMaterialfv( GL_FRONT, GL_DIFFUSE, red );
// 画鼻子
glColor3f(1.0f, 0.5f , 0.5f);
glRotatef(0.0f,1.0f, 0.0f, 0.0f);
glutSolidCone(0.08f,0.5f,10,2);
}
void renderScene(void)
{
glClearColor( 0.7,0.7,1.0,1.0);
glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT );
glEnable(GL_DEPTH_TEST);
glEnable( GL_LIGHTING );
glEnable(GL_LIGHT0);
float Light_Model_Ambient[] = { 1, 1, 1, 1.0 }; // 缺省值
glLightModelfv( GL_LIGHT_MODEL_AMBIENT , Light_Model_Ambient );
float pos[]={0,100,10,1};
glLightfv( GL_LIGHT0, GL_POSITION, pos );
float white[]={1,1,1,1};
glMaterialfv( GL_FRONT, GL_DIFFUSE, white );
//画了一个地面
glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f, 0.0f, -100.0f);
glVertex3f(-100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, -100.0f);
glEnd();
//画了36个雪人
for(int i = -3; i < 3; i++)
{
for(int j=-3; j < 3; j++)
{
glPushMatrix();
glTranslatef(i*10.0,0,j * 10.0);
drawSnowMan();
glPopMatrix();
}
}
glutSwapBuffers();
}
void moveMeFlat(int direction)
{
x = x + direction*(lx)*0.1;
z = z + direction*(lz)*0.1;
glLoadIdentity();
gluLookAt(x, y, z, x + lx,y + ly,z + lz, 0.0f,1.0f,0.0f);
}
void moveMeFlat2(int direction)
{
float nx,nz;
nx=-lz;
nz=lx;
x = x + direction*(nx)*0.1;
z = z + direction*(nz)*0.1;
glLoadIdentity();
gluLookAt(x, y, z, x + lx,y + ly,z + lz, 0.0f,1.0f,0.0f);
}
void orientMe(float ang_x, float ang_y )
{
lx = sin(ang_x);
lz = -cos(ang_x);
ly += ang_y;
glLoadIdentity();
gluLookAt(x, y, z, x+lx, y+ly,z+lz, 0.0f,1.0f,0.0f);
}
void inputKey(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT :
angle -= 0.02f;
orientMe(angle,0);
break;
case GLUT_KEY_RIGHT :
angle +=0.02f;
orientMe(angle,0);
break;
case GLUT_KEY_UP :
moveMeFlat(1);
break;
case GLUT_KEY_DOWN :
moveMeFlat(-1);
break;
}
}
void keyboard( unsigned char key, int x, int y )
{
switch( key )
{
case 27:
exit(0);
break;
case 'w':
moveMeFlat(1);
break;
case 's':
moveMeFlat(-1);
break;
case 'a':
moveMeFlat2(-1);
break;
case 'd':
moveMeFlat2(1);
break;
}
}
void mouseMove( int x, int y )
{
::ShowCursor(FALSE);
static int _x=500, _y=500;
int dx,dy;
dx=x-_x;
dy=y-_y;
_x=x;
_y=y;
angle+=dx*0.001;
orientMe(angle, -dy*0.002 );
if( abs(x-500)>10 || abs(y-500)>10 )
{
::SetCursorPos(500,500);
_x=500;
_y=500;
}
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(640,480);
glutCreateWindow("SnowMen");
glutFullScreen();
glutDisplayFunc(renderScene);
glutIdleFunc(renderScene);
glutReshapeFunc(changeSize);
glutPassiveMotionFunc( mouseMove );
glutSpecialFunc(inputKey);
glutKeyboardFunc(keyboard);
glutMainLoop();
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课