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

📄 fightertestview.cpp

📁 飞机飞行游戏演示代码,1.界面美观大方 2.电脑智能下棋 3.有多种难度选择 4.内带黑白棋规则教程 5.电脑会有响应提示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -