首页
社区
课程
招聘
[讨论]一个小游戏
发表于: 2008-7-10 15:22 3598

[讨论]一个小游戏

2008-7-10 15:22
3598
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;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
#include <GL/glut.h> 在哪里?找不到
2008-7-10 18:17
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
3
不知道楼主想讨论什么
2008-7-10 19:05
0
游客
登录 | 注册 方可回帖
返回
//