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

📄 baiscobj.cpp

📁 实现3D游戏碰撞
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//=======================================
	glColor3f(1.0f,1.0f,1.0f);	
	glRotatef(45, 1.0, 0.0, 0.0);
	auxWireCone(1.5,0.6f);			
	//=======================================
	glRotatef(180, 1.0, 0.0, 0.0);	
	glTranslatef(0.0f,0.0f,-0.7f); 
	auxWireCone(0.2f,2.0f);		
	glColor3f(FRAND,0,0);		
	glTranslatef(0.0f,0.0f,2.0f);
	auxSolidSphere(0.1f);		
 glPopMatrix();
 glPushMatrix();
	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)
{	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);            
  glBindTexture(GL_TEXTURE_2D, texture);
  BITMAPINFOHEADER bitHeader;		
  unsigned char *buffer;              
  buffer=LoadBitmapFileWithAlpha(filename,&bitHeader); 
  gluBuild2DMipmaps	( GL_TEXTURE_2D,    
					  4,                 
					  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(int i)
{ 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];
  glGetFloatv(GL_MODELVIEW_MATRIX, mat);
  vector3_t X(mat[0], mat[4], mat[8]);
  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);
  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]);

	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)
{
	 glPushMatrix();
	 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);
	 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);
		 isExplosion = false;
		}
}
void baiscobj::fire()
{ if(rocketY>1000) return;				
  rocketX+=7.0f*(float)cos(rad_xz);		
  rocketZ+=7.0f*(float)sin(rad_xz);			
  rocketY+=9.0f*(float)tan(g_elev*PI/360);
  if(Hitexamina(rocketX,rocketY,rocketZ))
	{Lbutdown=false;
	 Explosion(rocketX,rocketY,rocketZ,100,1);
	 sndPlaySound("data/images/explode.wav",SND_ASYNC);
	 rocketY=2000;						
	 Expl=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;						
	 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;
	 if(!iftf(i))  return;	
	 else g_eye[0]=pp;	
     pp=g_eye[2];g_eye[2]=z;
	 if(!iftf(i))  return;	
	 else g_eye[2]=pp;		
	 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;	
			 m_anmobj->frame[i]=m_anmobj->anim[0][m_anmobj->man[i].dz].start;
			 rocketX=x;	 rocketZ=z;	 rocketY=y;	
			 rnshu--;				
			 return true;			
			}
		}
	  x+=1.0f*cos(rad_xz);				
	  z+=1.0f*sin(rad_xz);				
	  y+=1.0f*tan(g_elev*PI/360);		
	 }
	return false;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -