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

📄 baiscobj.cpp

📁 碰撞检测.,用c++ opengl 实现
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -