📄 baiscobj.cpp
字号:
auxWireCone(0.2f,2.0f); //园锥杆(底半径、高)
glColor3f(FRAND,0,0); //随机红色
glTranslatef(0.0f,0.0f,2.0f); //杆的位置调整,缩进一点
auxSolidSphere(0.1f); //园(半径)
glPopMatrix();
glPushMatrix();//glPopMatrix();
glTranslatef(x,y+30.0f,z);//火箭的定位
glRotatef(r, 0.0, 1.0, 0.0); //火箭的旋转
glTranslatef(x/5,0,0);//火箭的定位
//=============================================
glColor3f(1.0f,0.0f,0.0f); //红色
glRotatef(180, 0.0, 1.0, 0.0); //角度调整,与雷达平行,箭头朝前
auxSolidCone(.2,0.6); //园锥(底半径、高)
//=============================================
glColor3f(1.0f,1.0f,1.0f); //白色
glRotatef(90, 1.0, 0.0, 0.0); //角度调整,与火箭头对接
glTranslatef(0.0f,-1.0f,0); //位置调整,与火箭头对接
auxSolidCylinder(.2f,1); //园柱(半径、高)
glRotatef(-270, 1.0, 0.0, 0.0);
glColor3f(FRAND+.6f,0.2f,0.0f); //随机色
glTranslatef(0.0f,-0.0f,-0.2f); //位置调整,缩进一点
auxSolidCone(.2,1.5); //园锥(底半径、高)
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glPopAttrib();//恢复前一属性
r+=1.0f;if(r>360) r=0;
}
bool baiscobj::LoadT8(char *filename, GLuint &texture)//调8位贴图
{ AUX_RGBImageRec *pImage = NULL;
pImage = auxDIBImageLoad(filename); // 装入位图
if(pImage == NULL)
{ CString cc;
cc=filename;cc+="没找到!";
AfxMessageBox(cc);
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; // 返回成功
}
void baiscobj::LoadT16(char *filename, GLuint &texture)//调帖图
{ glGenTextures(1, &texture); //获取1个未使用的贴图名称
glBindTexture(GL_TEXTURE_2D, texture); //选择要绑定的贴图(纹理)
BITMAPINFOHEADER bitHeader; //定义位图结构
unsigned char *buffer; //定义位图指针
buffer=LoadBitmapFileWithAlpha(filename,&bitHeader); //调入位图
gluBuild2DMipmaps ( GL_TEXTURE_2D, // 创建一个 2D贴图(纹理)
4, // 使用3种颜色(RGB)+ 颜色深度
bitHeader.biWidth, // 图像宽
bitHeader.biHeight,// 图像高
GL_RGBA, // 红绿蓝顺序
GL_UNSIGNED_BYTE, // 图像的数据类型是字节
buffer // 指定贴图(纹理)数据
); // 创建贴图(纹理)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
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);
free(buffer); // 释放位图数据
}
unsigned char * baiscobj::LoadBit(char *filename, BITMAPINFOHEADER *bitmap)
{ FILE *filePtr; // 定义文件句柄
BITMAPFILEHEADER Header; // 定义位图指针
unsigned char *Image; // 位图数据区
unsigned int imageIdx = 0; // 图形索引
unsigned char tempRGB; // 交换变量
filePtr = fopen(filename, "rb");// 读文件
if (filePtr == NULL) return NULL;// 读文件出错返回
fread(&Header, sizeof(BITMAPFILEHEADER), 1, filePtr);
if (Header.bfType != BITMAP_ID)
{ fclose(filePtr);
return NULL;
}
fread(bitmap, sizeof(BITMAPINFOHEADER), 1, filePtr);
fseek(filePtr, Header.bfOffBits, SEEK_SET);
Image = (unsigned char*)malloc(bitmap->biSizeImage);
if (!Image)
{ free(Image);
fclose(filePtr);
return NULL;
}
fread(Image, 1, bitmap->biSizeImage, filePtr);//将图形数据读入
if (Image == NULL)
{ fclose(filePtr);
return NULL;
}
for (imageIdx = 0; imageIdx < bitmap->biSizeImage; imageIdx+=3)
{ tempRGB = Image[imageIdx];
Image[imageIdx] = Image[imageIdx + 2];
Image[imageIdx + 2] = tempRGB;
}
fclose(filePtr);
return Image;
}
/////////////////////////////////////////////////////////////////////////////
/*void baiscobj::ShowTree(float x,float z,float h,float s,int cactus)//树
{ glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
float mat[16];// get the modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX, mat);
vector3_t X(mat[0], mat[4], mat[8]);// get the right and up vectors
vector3_t Z(mat[1], mat[5], mat[9]);
glBindTexture(GL_TEXTURE_2D, g_cactus[cactus]);//选择树
vector3_t pos(x,0.0,-z);//树的位置
pos.y = GetHeight(x, -z) + h + s;//树根深浅
glBegin(GL_QUADS);//显示全部树
glTexCoord2f(0.0,0.0);glVertex3fv((pos+(X+Z)*-h).v);//左下点
glTexCoord2f(1.0,0.0);glVertex3fv((pos+(X-Z)* h).v);//右下点
glTexCoord2f(1.0,1.0);glVertex3fv((pos+(X+Z)* h).v);//右上点
glTexCoord2f(0.0,1.0);glVertex3fv((pos+(Z-X)* h).v);//左上点
glEnd();
glDisable(GL_ALPHA);
glDisable(GL_BLEND);
}*/
void baiscobj::ShowTree(int i)//float x,float z,float h,float s,int cactus)//树
{ glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D); //使用纹理
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
float mat[16];// get the modelview matrix
glGetFloatv(GL_MODELVIEW_MATRIX, mat);
vector3_t X(mat[0], mat[4], mat[8]);// get the right and up vectors
vector3_t Z(mat[1], mat[5], mat[9]);
glBindTexture(GL_TEXTURE_2D, g_cactus[objposi[i].cactus]);//选择树
vector3_t pos(objposi[i].x,0.0,-objposi[i].z);//树的位置
float size=objposi[i].size;
pos.y = GetHeight(objposi[i].x, -objposi[i].z) + objposi[i].h + size;//树根深浅
glBegin(GL_QUADS);//显示全部树
glTexCoord2f(0.0,0.0);glVertex3fv((pos+(X+Z)*-size).v);//左下点
glTexCoord2f(1.0,0.0);glVertex3fv((pos+(X-Z)* size).v);//右下点
glTexCoord2f(1.0,1.0);glVertex3fv((pos+(X+Z)* size).v);//右上点
glTexCoord2f(0.0,1.0);glVertex3fv((pos+(Z-X)* size).v);//左上点
glEnd();
glDisable(GL_ALPHA);
glDisable(GL_TEXTURE_2D);//glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
void baiscobj::ShowTree0(float x,float z,float h,float s,int cactus)//树
{//普通平面做的树。
glPushMatrix();//
float y = GetHeight(x,-z) + h + s;//树根深浅
glTranslatef(x,y, -z);//位置
glRotatef(180, 1.0, 0.0, 0.0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);
glBindTexture(GL_TEXTURE_2D, g_cactus[cactus]);//选择树
// glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);//
glBegin(GL_QUADS);// 开始绘制
glTexCoord2f(1.0f, 0.0f); glVertex3f(-h, h, 0.0f); // 右上点
glTexCoord2f(0.0f, 0.0f); glVertex3f( h, h, 0.0f); // 右上点
glTexCoord2f(0.0f, 1.0f); glVertex3f( h,-h, 0.0f); // 右下点
glTexCoord2f(1.0f, 1.0f); glVertex3f(-h,-h, 0.0f); // 左下点
glEnd();
glDisable(GL_ALPHA);
glDisable(GL_BLEND);
glPopMatrix();
}
////////////////////////////////////////////////////////////////////
void baiscobj::load3dobj(char* dir,char* cn,int a)
{ char appdir[256];
GetCurrentDirectory(256,appdir);
SetCurrentDirectory(dir);
m_3ds->Init(cn,a);
SetCurrentDirectory(appdir);
}
void baiscobj::Scene(int obj,float x,float h,float z,float r,int re,float size)//显示对象
{ //序号obj,位置 x,高度 h,位置 z,半径 r,角度re,大小 size
glPushMatrix();//glPopMatrix();
int y=GetHeight(x,z)+h;
glTranslatef(x,y,z); //飞机定位
glRotatef(re, 0.0, 1.0, 0.0); //飞机的旋转
if(obj>0) glRotatef(-20, 1.0, 0.0, 0.0); //飞机的斜角
m_3ds->show3ds(obj,0,0.0f,r,size);//显示3ds模型飞机运行半径的定位
glPopMatrix();
}
//爆炸==================================================================
void baiscobj::Explosion(float x,float y,float z,int b,float a)//爆炸初始化
{ if(explosion!=NULL) {delete[] explosion;explosion=NULL;}
explosion = new CExplosion(b,CVector(0,0,0),a,g_cactus[15]);
px=x,pz=z,py=y;
isExplosion = false;
Expl=0;
}
void baiscobj::plosion()//爆炸
{ glTranslatef(px,py,pz);
if(isExplosion == false)
{explosion->Render();
isExplosion = true;
}
if(isExplosion)
{explosion->Update(0.10f);//baoza
isExplosion = false;
}
}
void baiscobj::fire()//射击
{ if(rocketY>1000) return; //子弹飞的太高了,放弃。
rocketX+=7.0f*(float)cos(rad_xz); //X方向的步进
rocketZ+=7.0f*(float)sin(rad_xz); //Z方向的步进
rocketY+=9.0f*(float)tan(g_elev*PI/360); //Y方向的步进
if(Hitexamina(rocketX,rocketY,rocketZ)) //子弹碰撞检测
{Lbutdown=false;//清除鼠标左按键
Explosion(rocketX,rocketY,rocketZ,100,1); //爆炸初始化
sndPlaySound("data/images/explode.wav",SND_ASYNC);//枪声
rocketY=2000; //清除子弹。
Expl=0; //计数清0
return; //返回
}
float y=GetHeight(rocketX, rocketZ); //获得地形高度
if((rocketY-y)<0||Expl>40) //打到地或天?
{Lbutdown=false; //清除鼠标左按键
Explosion(rocketX,rocketY,rocketZ,100,1); //爆炸初始化
sndPlaySound("data/images/explode2.wav",SND_ASYNC);//枪声
rocketY=2000; //清除子弹。
Expl=0; //计数清0
return; //返回
}
Expl++; //子弹距离计数
glPushAttrib(GL_CURRENT_BIT); //保存现有颜色属性
glPushMatrix(); //压入堆栈
glTranslatef(rocketX,rocketY,rocketZ); //子弹轨迹
auxWireSphere(.01); //用一个球代表子弹
glPopMatrix(); //弹出堆栈
glPopAttrib(); //恢复前一属性
}
//碰撞===========================================================
void baiscobj::zangan(float x,float z)//碰撞绕行
{ float pp;
for(int i=0;i<TREESL;i++) //障碍检测
{ if(iftf(i)) //有障碍
{pp=g_eye[0];g_eye[0]=x; //X方向回原点
if(!iftf(i)) return; //没障碍,绕行。
else g_eye[0]=pp; //有障碍,X方向不变
pp=g_eye[2];g_eye[2]=z; //Y方向回原点
if(!iftf(i)) return; //没障碍了,绕行。
else g_eye[2]=pp; //有障碍,Y方向不变
return;
}
}
}
BOOL baiscobj::iftf(int i)//判断障碍
{ if(fabs(g_eye[0]-objposi[i].x)<objposi[i].size/2&&
fabs(g_eye[2]+objposi[i].z)<objposi[i].size/2)
return TRUE; //遇到障碍
else return FALSE; //没遇到
}
void baiscobj::settml(int p)//显示障碍位置、大小,调试用。
{ float y=GetHeight(objposi[p].x, -objposi[p].z)+1;
glPushAttrib(GL_CURRENT_BIT);//保存现有颜色属性
glDisable(GL_TEXTURE_2D);//
glPushMatrix();//
glTranslatef(objposi[p].x,y,-objposi[p].z);
auxWireBox(objposi[p].size,objposi[p].size,objposi[p].size);
glPopMatrix();
glEnable(GL_TEXTURE_2D);
glPopAttrib();//恢复前一属性
}
bool baiscobj::Hitexamina(float x,float y,float z)//子弹碰撞检测
{ for(int k=0;k<6;k++) //精化子弹轨迹。
{for(int i=0;i<RNSHU;i++) //对所有人物对象循环检测
{if(m_anmobj->man[i].dz>15) continue; //死的就不要再打了
if(abs(m_anmobj->man[i].qd[0]-x)>1.0f&&
abs(m_anmobj->man[i].qd[1]+z)>1.0f) continue;//已打偏了
if(abs(m_anmobj->man[i].qd[0]-x)<.1f&&
abs(m_anmobj->man[i].qd[2]-y)<.1f&&
abs(m_anmobj->man[i].qd[1]+z)<.1f) //打中了
{m_anmobj->man[i].dz=16+rand()%3; //取3种死法之一
m_anmobj->frame[i]=m_anmobj->anim[0][m_anmobj->man[i].dz].start;//取动作首
rocketX=x; rocketZ=z; rocketY=y; //子弹位置取击中位置
rnshu--; //人物数-1
return true; //返回命中
}
}
x+=1.0f*cos(rad_xz); //X方向的精化步进
z+=1.0f*sin(rad_xz); //Z方向的精化步进
y+=1.0f*tan(g_elev*PI/360); //Y方向的精化步进
}
return false;//返回未命中
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -