📄 baiscobj.cpp
字号:
//=======================================
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 + -