📄 baiscobj.cpp
字号:
// baiscobj.cpp: implementation of the baiscobj class.
// 学程序编游戏系列丛书
// 唐明理 E_mail: cqtmL@163.com
//====================================================================
#include "stdafx.h"
#include "baiscobj.h"
GLfloat r=0,t=0;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
baiscobj::baiscobj()
{ g_eye[0]= MAP;//
g_eye[2]=-MAP;//
g_Angle=0;//方位角
g_elev=0;//俯仰角
g_text = gluNewQuadric();
LoadT8("sand0.bmp", g_cactus[0]); //地面帖图
LoadT8("6bb.bmp",g_cactus[1]);
LoadT8("4RBack.bmp",g_cactus[2]); //天空贴图后
LoadT8("4Front.bmp",g_cactus[3]); //天空贴图前
LoadT8("4Top.bmp", g_cactus[4]); //天空贴图顶
LoadT8("4Left.bmp", g_cactus[5]); //天空贴图左
LoadT8("4Right.bmp",g_cactus[6]); //天空贴图右
LoadT8("66.bmp",g_cactus[7]);
LoadT8("77.bmp",g_cactus[8]);
LoadT8("88.bmp",g_cactus[9]);
glEnable(GL_TEXTURE_2D);
}
baiscobj::~baiscobj()
{
}
void baiscobj::light0()
{ GLfloat light_position[] = {10.0,25.0,1.0,0.2};
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
}
BOOL baiscobj::DisplayScene()//摄像机
{ float speed=0.5f; //步长
if (KEY_DOWN(VK_SHIFT)) speed =speed*4;//按SHIFT时的加速
if (KEY_DOWN(VK_LEFT)) g_Angle-=speed*2;//左转
if (KEY_DOWN(VK_RIGHT)) g_Angle+=speed*2;//右转
rad_xz = float (3.13149* g_Angle/180.0f); //计算左右旋转角度
if (KEY_DOWN(33)) g_elev +=0.2f; //Page UP 键
if (KEY_DOWN(34)) g_elev -=0.2f; //Page Down键
if (g_elev<-100) g_elev =-100; //仰俯角
if (g_elev> 100) g_elev = 100; //仰俯角
if (KEY_DOWN(VK_UP)) //前进
{ g_eye[2]+=sin(rad_xz)*speed;
g_eye[0]+=cos(rad_xz)*speed;
}
if (KEY_DOWN(VK_DOWN)) //后退
{ g_eye[2]-=sin(rad_xz)*speed;
g_eye[0]-=cos(rad_xz)*speed;
}
//控制到摄像机不离开地面
/* if(g_eye[0]< MAP_SCALE*2) g_eye[0]= MAP_SCALE*2;
if(g_eye[0]> (MAP_W-3)*MAP_SCALE) g_eye[0]= (MAP_W-3)*MAP_SCALE;
if(g_eye[2]<-(MAP_W-3)*MAP_SCALE) g_eye[2]=-(MAP_W-3)*MAP_SCALE;
if(g_eye[2]> -MAP_SCALE*2) g_eye[2]= -MAP_SCALE*2;*/
if (g_eye[0]<-(MAP*2-20)) g_eye[0]= -(MAP*2-20); //视点的X分量限制
if (g_eye[0]> (MAP*2-20)) g_eye[0]= (MAP*2-20);
if (g_eye[2]<-(MAP*2-20)) g_eye[2]= -(MAP*2-20); //视点的Z分量限制
if (g_eye[2]> (MAP*2-20)) g_eye[2]= (MAP*2-20);
g_eye[1] =-30.0;//设置摄像机对地位置高
//摄像机的方向
g_look[0] = float(g_eye[0] + 100*cos(rad_xz));
g_look[2] = float(g_eye[2] + 100*sin(rad_xz));
g_look[1] = g_eye[1];
//建立modelview矩阵方向
gluLookAt(g_eye[0],g_eye[1],g_eye[2],g_look[0],g_look[1]+g_elev,g_look[2],0.0,1.0,0.0);
return TRUE;
}
GLvoid baiscobj::DrawGround()//篮色网格地面线
{ glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属实性
//glEnable(GL_BLEND);//使用纹理
glPushMatrix();
glBindTexture(GL_TEXTURE_2D, g_cactus[0]);
//glColor3f(0.5f, 0.7f, 1.0f);//设置蓝色
glTranslatef(0,0.0f,0); //平台的定位
int size0=(int)(MAP*2);
glBegin(GL_LINES);//划一界线
for (int x = -size0; x < size0;x+=4)
{glVertex3i(x, -5, -size0); glVertex3i(x, -5, size0);}
for (int z = -size0; z < size0;z+=4)
{glVertex3i(-size0, -5, z); glVertex3i( size0, -5, z);}
glEnd();
glPopMatrix();
// glDisable(GL_BLEND);
glPopAttrib();//恢复前一属性
}
//==========================================================================
void baiscobj::ship(float x,float y,float z)
{
glPushMatrix();//压入堆栈
glTranslatef(x,y,z);
glTranslatef(50,-30,0);
//======================================================
glPushMatrix();
texture(g_cactus[1]);
glRotatef(60, 1.0, 0.0, 0.0); //灯罩
glTranslatef(-1.5f,1.0f,-5.7f); //
::gluQuadricTexture(g_text,GL_TRUE);
gluCylinder(g_text,1.0,3.0,2.5,50,5);
glPopMatrix();
//========================================================
glPushMatrix();
// glColor3f(1.0, 2.0, 0.0);//灯柱
glTranslatef(-1.5f,-1.4f,-1.7f);
glRotatef(-90, 1.0, 0.0, 0.0);
texture(g_cactus[9]);
gluCylinder(g_text,0.2,0.2,5.5,20,5);
//auxSolidCylinder(0.2f,5.5f);
glPopMatrix();
//=============================================
glPushMatrix();
//glRotatef(60, 1.0, 0.0, 0.0); //灯台
glRotatef(-90, 1.0, 0.0, 0.0);
glTranslatef(-1.5f,1.8f,-1.7f); //
gluCylinder(g_text,1.0,0.0,0.5,50,5);
//auxSolidCone(1.0f,0.5f);
glPopMatrix();
//=============================================
glPushMatrix();
glTranslatef(-1.5f,-2.0f,-1.7f);
Box(9.5f,0.1f,9.5f);//桌面
glPopMatrix();
//==============================================
glPushMatrix();
glTranslatef(-1.5f,-17.0f,-1.7f);
glRotatef(-90, 1.0, 0.0, 0.0);
texture(g_cactus[8]);
::gluQuadricTexture(g_text,GL_TRUE);
gluCylinder(g_text,0.8,0.8,14.5,10,5);
//auxSolidCylinder(0.8f,15.5f);
glPopMatrix();
//===============================================
glPushMatrix();
glTranslatef(-1.5f,-17.0f,-1.7f); //
glRotatef(-90, 1.0, 0.0, 0.0);
gluCylinder(g_text,3.0,0.0,2.0,10,5);
// auxSolidCone(3.0f,2.0f);
glPopMatrix();
glPopMatrix();
}
void baiscobj::Box(float x,float y,float z)
{ glPushMatrix();//压入堆栈
glScalef(x,y,z);
//glEnable(GL_TEXTURE_2D); //使用纹理
texture(g_cactus[7]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 前
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 后
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);// 左
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 右
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
glEnd();
//glDisable(GL_TEXTURE_2D);
glPopMatrix();
}
void baiscobj::CreateSkyBox(int a,int wi,int he,int le)//显示天空
{ float width =MAP*wi; // 天空盒宽
float height=MAP*he; // 天空盒高
float length=MAP*le; // 天空盒长
float x = MAP -width /2; // 天空的位置x
float y = MAP/a-height/2; // 天空的位置y
float z = -MAP -length/2; // 天空的位置z
///////////////////////////////////////////////////////////////////////////////
texture(g_cactus[0]);
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f, 1.0f); glVertex3f(x+width,y,z+length);// 下
glTexCoord2f(0.0f, 1.0f); glVertex3f( x+width,y,z);
glTexCoord2f(0.0f, 0.0f); glVertex3f(x, y, z);
glTexCoord2f(1.0f, 0.0f); glVertex3f(x, y, z+length);
glEnd();
texture(g_cactus[2]); // 设置BACK贴图左
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y, z);
glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z);
glTexCoord2f(0.0f,1.0f); glVertex3f(x, y+height,z);
glTexCoord2f(0.0f,0.0f); glVertex3f(x, y, z);
glEnd();
texture(g_cactus[3]); // 设置FRONT贴图右
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y, z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y, z+length);
glEnd();
texture(g_cactus[4]); // 设置TOP贴图顶
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z);
glEnd();
texture(g_cactus[5]); // 设置LEFT贴图前
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(1.0f,1.0f); glVertex3f(x, y+height,z);
glTexCoord2f(0.0f,1.0f); glVertex3f(x, y+height,z+length);
glTexCoord2f(0.0f,0.0f); glVertex3f(x, y, z+length);
glTexCoord2f(1.0f,0.0f); glVertex3f(x, y, z);
glEnd();
texture(g_cactus[6]); // 设置RIGHT贴图后
glBegin(GL_QUADS); // 多组独立填充四边形
glTexCoord2f(0.0f,0.0f); glVertex3f(x+width,y, z);
glTexCoord2f(1.0f,0.0f); glVertex3f(x+width,y, z+length);
glTexCoord2f(1.0f,1.0f); glVertex3f(x+width,y+height,z+length);
glTexCoord2f(0.0f,1.0f); glVertex3f(x+width,y+height,z);
glEnd();
//glDisable(GL_TEXTURE_2D);
}
void baiscobj::texture(UINT textur)//设置贴图滤波
{ glBindTexture (GL_TEXTURE_2D, textur);// 设置贴图
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); //缩小采用线性滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//放大采用线性滤波
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}
bool baiscobj::LoadT8(char *filename, GLuint &texture)//调8位贴图
{ AUX_RGBImageRec *pImage = NULL;
pImage = auxDIBImageLoad(filename); // 装入位图
if(pImage == NULL) return false; // 确保位图数据已经装入
glGenTextures(1, &texture); // 生成纹理
glBindTexture (GL_TEXTURE_2D,texture); // 捆绑纹理
gluBuild2DMipmaps(GL_TEXTURE_2D,4, pImage->sizeX,
pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data);
free(pImage->data); //释放位图占据的内存资源
free(pImage);
return true;// 返回true
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -