📄 fightertestview.cpp
字号:
Vector sight = VectorDiff(MyPosition, Position);
Vector cz;
cz.x = 0;
cz.y = 0;
cz.z = 1;
Vector cross1 = VectorMultiply( sight, cz );
Vector cross2 = VectorMultiply( sight, cross1 );
cross1 = VectorNormalize(cross1);
cross2 = VectorNormalize(cross2);
cross1 = VectorScalarMultiply(cross1, dimensione);
cross2 = VectorScalarMultiply(cross2, dimensione);
glColor3f(r,g,b);
glEnable(GL_TEXTURE_2D);
glEnable (GL_BLEND);
glBlendFunc( (1,1,1,1), (1,1,1,1));
glDepthMask (GL_FALSE);
glBindTexture( GL_TEXTURE_2D, texture[Tex] );
glBegin(GL_QUADS);
glTexCoord2d( 0.0, 0.0 );
glVertex3d( Position.x + cross1.x, Position.y + cross1.y, Position.z + cross1.z);
glTexCoord2d( 1.0, 0.0 );
glVertex3d( Position.x - cross2.x, Position.y - cross2.y, Position.z - cross2.z);
glTexCoord2d( 1.0, 1.0 );
glVertex3d( Position.x - cross1.x, Position.y - cross1.y, Position.z - cross1.z);
glTexCoord2d( 0.0, 1.0 );
glVertex3d( Position.x + cross2.x, Position.y + cross2.y, Position.z + cross2.z);
glEnd();
glDisable(GL_TEXTURE_2D);
glDisable (GL_BLEND);
glDepthMask (GL_TRUE);
}
void CFighterTestView::InitBullet(void)
{
int t;
for(t=0;t<MAXBULLET;t++)
{
bul[t].active=false; // 所有子弹未激活
bul[t].explosion=false; // 所有子弹未爆炸
}
}
void CFighterTestView::InitTerrain(void)
{
int x,z;
double xi,zi;
for(z=0;z<DIMZ;z++)
{
zi=(double)z-((double)DIMZ/2);
zi=zi*SIZE;
for(x=0;x<DIMX;x++)
{
xi=(double)x-((double)DIMX/2);
xi=xi*SIZE;
Terrain[x][z].x=xi;
Terrain[x][z].y=0;
Terrain[x][z].z=zi;
}
}
}
void CFighterTestView::InitAereo(void)
{
// 初始化飞机的位置
aereo.x=150+(float)(rand()%1000)/10;
aereo.z=20+(float)(rand()%10000)/20;
aereo.y=10;
// 初始化飞机的角度
aereo.an=(float)90+(float)(rand()%45);
aereo.anend=0;
aereo.dan=0;
// 初始化飞机的速度
aereo.vel=4+(float)(rand()%100)/20;
aereo.fvirata=0;
aereo.virata=false;
aereo.attivo=true;
aereo.tempovirata=0;
aereo.cntscia=5;
// 视点位置
Io.x=aereo.x;
Io.y=aereo.y+4;
Io.z=aereo.z;
Ioan=20;
}
void CFighterTestView::InitSmoke01(void)
{
int t;
for(t=0;t<MAXPUF;t++)
Smoke[t].time=-1; //所有烟雾未激活
}
void CFighterTestView::ActiveBullet(void)
{
int t;
int r;
for(t=0;t<MAXBULLET;t++)
{
if(bul[t].active==false)
{
r=rand()%4-rand()%4;
bul[t].explosion=false; // 是否爆炸
bul[t].active=true; // 是否激活
// 子弹的位置
bul[t].x=aereo.x;
bul[t].y=aereo.y;
bul[t].z=aereo.z;
// 子弹的位移速度
bul[t].dx=(aereo.vel*2)*cos((aereo.an+90+r)*3.141/180);
bul[t].dy=0;
bul[t].dz=(aereo.vel+2)*sin((aereo.an+90+r)*3.141/180);
break;
}
}
}
void CFighterTestView::InitSmoke02(void)
{
register int t;
int flag=1;
float dx,dy,dz;
for(t=0;t<MAXPUF;t++)
{
if(Smoke[t].time<0 && flag>=0)
{
if(flag!=0)
{
dx=cos(aereo.an*3.141/180);
dy=0;
dz=sin(aereo.an*3.141/180);
}
else
{
dx=1+cos(-aereo.an*3.141/180);
dy=2*sin(aereo.dan*aereo.fvirata*3.141/180);
dz=1+sin(-aereo.an*3.141/180);
}
// 烟雾的寿命
Smoke[t].time=TIMEPUF;
// 烟雾的位置
Smoke[t].x=aereo.x+dx;
Smoke[t].y=aereo.y-dy-1.2;
Smoke[t].z=aereo.z+dz;
// 烟雾的尺寸
Smoke[t].dim=0;
// 烟雾的颜色
Smoke[t].r=1;
Smoke[t].g=1;
Smoke[t].b=1;
flag--;
if(flag<0)
break;
}
}
}
void CFighterTestView::MoveDrawBullet(void)
{
int t;
for(t=0;t<MAXBULLET;t++)
{
if(bul[t].explosion==false)
{
if(bul[t].active==true)
{
bul[t].x+=bul[t].dx;
bul[t].y-=bul[t].dy;
bul[t].z+=bul[t].dz;
bul[t].dy+=(float)GRAVITY;
if(bul[t].y<0)
{
bul[t].active=false;
bul[t].explosion=true;
bul[t].dim=0;
}
glColor3f(1,1,1);
glBegin(GL_POINTS);
glVertex3f(bul[t].x,bul[t].y,bul[t].z);
glEnd();
}
}
else
{
bul[t].dim+=0.1;
if(bul[t].dim>1)
bul[t].explosion=false;
Luce(bul[t].x,bul[t].y,bul[t].z,4*bul[t].dim,1-bul[t].dim,0,0,Io.x,Io.y,Io.z,3);
}
}
glColor3f(1,1,1);
}
void CFighterTestView::MoveAereo(void)
{
register float dx,dz;
dx=aereo.vel*cos((90+aereo.an)*3.141/180);
dz=aereo.vel*sin((90+aereo.an)*3.141/180);
aereo.x+=dx;
aereo.z+=dz;
if(aereo.x<-4000)
aereo.x=4000;
if(aereo.x>4000)
aereo.x=-4000;
if(aereo.z<-4000)
aereo.z=4000;
if(aereo.z>4000)
aereo.z=-4000;
// Virata
if(aereo.virata==false )
{
if(rand()%100==0)
{
float dan;
dan=(float)(rand()%160-rand()%160);
aereo.anend=aereo.an+dan;
aereo.dan=dan/TEMPOVIRATA;
aereo.virata=true;
aereo.tempovirata=0;
aereo.fvirata=0;
}
}
else
{
aereo.an+=aereo.dan;
if(aereo.an<(aereo.anend+1) && aereo.an>(aereo.anend-1))
aereo.virata=false;
}
}
void CFighterTestView::DrawTerrain(void)
{
register int x,z;
register float fk=(float)1/100;
glEnable(GL_TEXTURE_2D);
glBindTexture( GL_TEXTURE_2D, texture[1] );
for(z=0;z<DIMZ-1;z++)
{
for(x=0;x<DIMX-1;x++)
{
glBegin(GL_QUADS);
glTexCoord2d( 0.0, 0.0 );
glVertex3f(Terrain[x][z].x,Terrain[x][z].y,Terrain[x][z].z);
glTexCoord2d( 0.0, 1.0 );
glVertex3f(Terrain[x][z+1].x,Terrain[x][z+1].y,Terrain[x][z+1].z);
glTexCoord2d( 1.0, 1.0 );
glVertex3f(Terrain[x+1][z+1].x,Terrain[x+1][z+1].y,Terrain[x+1][z+1].z);
glTexCoord2d( 1.0, 0.0 );
glVertex3f(Terrain[x+1][z].x,Terrain[x+1][z].y,Terrain[x+1][z].z);
glEnd();
}
}
glDisable(GL_TEXTURE_2D);
}
void CFighterTestView::DrawAereo(void)
{
glPushMatrix();
glEnable(GL_LIGHTING);
glTranslatef(aereo.x,aereo.y,aereo.z);
glRotatef(-aereo.an,0,1,0);
if(aereo.virata==true)
{
glRotatef(aereo.dan*aereo.fvirata,0,0,1);
if(aereo.tempovirata<TEMPOVIRATA/2)
aereo.fvirata+=0.5;
else
aereo.fvirata-=0.5;
aereo.tempovirata++;
}
pModel->draw();
glDisable(GL_LIGHTING);
glPopMatrix();
}
void CFighterTestView::DrawSmoke(void)
{
int t;
float fk=(float)2/TIMEPUF;
for(t=0;t<MAXPUF;t++)
{
if(Smoke[t].time>0)
{
Luce(Smoke[t].x,Smoke[t].y,Smoke[t].z,Smoke[t].dim,Smoke[t].r,Smoke[t].g,Smoke[t].b,Io.x,Io.y,Io.z,2);
Smoke[t].dim+=0.05; // 烟雾的尺寸变大
// 烟雾的颜色变化
Smoke[t].r-=fk;
Smoke[t].g-=fk;
Smoke[t].b-=fk;
// 烟雾的寿命缩短
Smoke[t].time--;
if(Smoke[t].time<=0)
Smoke[t].time=-1; // 烟雾消息
}
}
glColor3f(1,1,1);
}
void CFighterTestView::Camera(void)
{
float dist;
float dx,dy,dz;
if(cameratype==0)
{
dist=sqrt( (aereo.x-Io.x)*(aereo.x-Io.x)+(aereo.z-Io.z)*(aereo.z-Io.z) );
if(dist>400)
{
Io.x=aereo.x+150*cos((aereo.an+rand()%180)*3.141/180);
Io.y=(float)(1+rand()%35);
Io.z=aereo.z+150*sin((aereo.an+rand()%180)*3.141/180);
aereo.vel=1+(float)(rand()%100)/50;
}
}
if(cameratype==1)
{
dx=30*cos((aereo.an-90+Ioan)*3.141/180);
dy=6;
dz=30*sin((aereo.an-90+Ioan)*3.141/180);
Io.x=aereo.x+dx;
Io.y=aereo.y+dy;
Io.z=aereo.z+dz;
}
if(cameratype==2)
{
if(bul[nb].active==true)
{
Io.x=bul[nb].x;
Io.y=bul[nb].y;
Io.z=bul[nb].z;
}
else
cameratype=0;
}
gluLookAt(Io.x,Io.y,Io.z,aereo.x,aereo.y,aereo.z,0.0f,1.0f,0.0f);
}
void CFighterTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
// Camera position
if(nChar==VK_LEFT)
Ioan++;
if(nChar==VK_RIGHT)
Ioan--;
if(nChar==VK_UP)
Io.y+=0.1;
if(nChar==VK_DOWN)
Io.y-=0.1;
if(nChar==65) // 按下'A'键
{
timebullet=rand()%100;
}
if(nChar==83) // 按下'S'键
{
if(sky==false)
sky=true;
else
sky=false;
}
if(nChar==77) // 按下'M'键
{
if(smoke==false)
smoke=true;
else
smoke=false;
}
// 视点模式
if(nChar==49) // 按下'1'键
{
cameratype=0;
}
if(nChar==50) // 按下'2'键
{
cameratype=1;
}
if(nChar==51) // 按下'3'键
{
int t;
cameratype=2;
nb=-1;
for(t=0;t<MAXBULLET;t++)
{
if(bul[t].active==true)
{
nb=t;
break;
}
}
if(nb==-1)
cameratype=0;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -