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

📄 game.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	if((
		(!Hidden(CPos,CLook,vSet(P1.X,P1.Y,P1.Z)))||
		(!Hidden(CPos,CLook,vSet(P1.X,P1.Y,P2.Z)))||
		(!Hidden(CPos,CLook,vSet(P1.X,P2.Y,P1.Z)))||
		(!Hidden(CPos,CLook,vSet(P1.X,P2.Y,P2.Z)))||
		(!Hidden(CPos,CLook,vSet(P2.X,P1.Y,P1.Z)))||
		(!Hidden(CPos,CLook,vSet(P2.X,P1.Y,P2.Z)))||
		(!Hidden(CPos,CLook,vSet(P2.X,P2.Y,P1.Z)))||
		(!Hidden(CPos,CLook,vSet(P2.X,P2.Y,P2.Z)))
	  ))
	{
		RealAbstand=vLength2(vSub(Temp->BoundBox->Mid,CPos));
		Abstand=RealAbstand-DODAnfang;

		if((Abstand<VisBorder)||(Temp->Mesh==NULL))
		{
			if(Temp->Mesh!=NULL) 
			{

				F=Abstand/DODAbstand;
				DODNr=F;
				if(DODNr>DODAnzahl) DODNr=DODAnzahl;

				DrawMesh=Temp->Mesh;
				for(I=0;I<DODNr;I++)
				{
					DrawMesh=DrawMesh->LowerPoly;
				}
				Alpha=Abstand-AlphaAnfang;
				if(Alpha<0) Alpha=0;
				Alpha=Alpha/(VisBorder-AlphaAnfang);
				if(Alpha>1) Alpha=1;

				if(Flag(Temp->Flags,_SF_Player))
				{
					if((RealAbstand<_Create_Player_Abstand)&&(Temp->Attr>0))
					{
						AddPlayer(Temp->Attr-1,Temp->Pos,vNull);
						Temp->Attr=-1;
						Temp->Flags=SetFlag(Temp->Flags,_SF_WalkThrough);
					}
				} else {
					if((Abstand<VisBorder))
						DrawGrund(DrawMesh,true,Temp->MatNr,Temp->Pos,Temp,1-Alpha);
				}
			}
			DrawSector(Temp->SubSector);
		}
	}
	DrawSector(Temp->Next);
}

void DrawSky(tP3D Pos)
{
#define SkyHoehe 900
#define Boden 17
#define Radius 900
#define HParts 10
#define VParts 10

	long I,K;
	float X1,X2,X11,X22,Y1,Y2,Y11,Y22,Z1,Z2,R1,R2,W1,W2,K1,K2,I1,I2,KK1,KK2;

	glLoadIdentity ();													// Reset The Modelview Matrix
	gluLookAt(CPos.X,CPos.Y,CPos.Z,CLook.X,CLook.Y,CLook.Z,0,1,0);


	glDisable(GL_COLOR_MATERIAL);
	glDisable(GL_LIGHT0);	
	glDisable(GL_LIGHTING);

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, textures[2].texID);	
	glBegin(GL_QUADS);


	for(K=0;K<VParts;K++)
	{
		K1=K;
		K1=K1/VParts;
		K2=(K+1);
		K2=K2/VParts;

		Z1=(SkyHoehe-(K1*SkyHoehe))-Boden;
		Z2=(SkyHoehe-(K2*SkyHoehe))-Boden;

		if(K1>1) K1=2-K1;
		if(K2>1) K2=2-K2;
		KK1=K1;
		KK2=K2;


		R1=sqrt(1-(1-K1)*(1-K1))*Radius;
		R2=sqrt(1-(1-K2)*(1-K2))*Radius;


		for(I=0;I<HParts;I++)
		{
			I1=I;
			I1=I1/HParts;
			I2=I+1;
			I2=I2/HParts;

			W1=I1*2*Pi;
			W2=I2*2*Pi;
			
			X1=sin(W1)*R1;
			Y1=cos(W1)*R1;
			X2=sin(W2)*R1;
			Y2=cos(W2)*R1;

			X11=sin(W1)*R2;
			Y11=cos(W1)*R2;
			X22=sin(W2)*R2;
			Y22=cos(W2)*R2;

			glTexCoord2f(I1, KK1);			
			  glVertex3f(Pos.X+X1,Pos.Y+Z1,Pos.Z+Y1);
			glTexCoord2f(I2, KK1);		
			  glVertex3f(Pos.X+X2,Pos.Y+Z1,Pos.Z+Y2);
			glTexCoord2f(I2,KK2);	
			  glVertex3f(Pos.X+X22,Pos.Y+Z2,Pos.Z+Y22);
			glTexCoord2f(I1, KK2);		
			  glVertex3f(Pos.X+X11,Pos.Y+Z2,Pos.Z+Y11);


		}
	}


	glEnd();

	glDisable(GL_TEXTURE_2D);

}

void InitWater()
{
	tWandPoly *TempP;
	long I,K;

	Water=CreatePolyList(WaterParts,(float)Radius/(float)WaterParts,vNull);
//	CreateHighMap(Water,WaterParts,2);
	CalcNormalsBasedOnPolys(Water);

	TempP=Water->Poly;
	while(TempP!=NULL)
	{
//		TempP->
		TempP=TempP->Next;
	}

	K=2*WaterParts*WaterParts*4;
	WaterFeld=(signed short *)malloc(K);
	OldWaterFeld=(signed short *)malloc(K);
	for(I=0;I<WaterParts*WaterParts*4;I++)
	{
		*(WaterFeld+I)=0;
		*(OldWaterFeld+I)=0;
	}
}

void CalcWater()
{
	tWandVertice *Temp;
	long I,K,M,S,V;
/*
	for(I=0;I<10;I++)
	{
		X=Random(WaterParts*2-2);
		Y=Random(WaterParts*2-2);
		M=-Random(1000);
		*(WaterFeld+Y*WaterParts*2+X)+=M;
	}
/**/
	S=WaterParts*2;
	*(WaterFeld+S+1) = (sin(GlobalTimer*0.1)*1000);
	*(WaterFeld+S*2-2) = (sin(GlobalTimer*0.1)*1000);
	*(WaterFeld+100) = (sin(GlobalTimer*0.1)*1000);
//	*(WaterFeld+300) = (sin(GlobalTimer*0.1)*3000);
//	*(WaterFeld+762) = (sin(GlobalTimer*0.1)*3000);

	TempWaterFeld=WaterFeld;
	WaterFeld=OldWaterFeld;
	OldWaterFeld=TempWaterFeld;


	for(K=1;K<WaterParts*2-1;K++)
	{
		M=K*WaterParts*2+1;
		for(I=1;I<WaterParts*2-1;I++)
		{
			V=((*(OldWaterFeld+M-1))+(*(OldWaterFeld+M+1))+
				(*(OldWaterFeld+M-S))+(*(OldWaterFeld+M+S)))/2 -
				(*(WaterFeld+M));
			*(WaterFeld+M)=(V*256)/256;
			M++;
		}
	}
	
	M=0;
	Temp=Water->Vertice;
	while(Temp!=NULL)
	{
		Temp->WorldPos=vAdd(Temp->Pos,vSet(CPos.X,WaterFeld[M]/100.0+CPos.Y-160,CPos.Z));
/*
		Temp->Normal.Y=1;
		Temp->Normal.X=0;
		Temp->Normal.Z=0;

		Temp->Normal.X=1-(float)((WaterFeld[M]-WaterFeld[M-1]))/10000.0;
		Temp->Normal.Z=1-(float)((WaterFeld[M]-WaterFeld[M-S]))/10000.0;

		Norm(&Temp->Normal);
*/
		M++;
		Temp=Temp->Next;
	}
	CalcNormalsBasedOnPolys(Water);
}

void DrawWater()
{
	DrawGrund(Water,true,2,vNull,NULL,1);
}

void DrawMesh(tMeshList *Mesh,float Alpha)
{
	if(Mesh==NULL) return;
	if(Mesh->Mesh!=NULL) 
	{
		DrawGrund(Mesh->Mesh,true,Mesh->MatNr,vNull,NULL,Alpha);
	}
	DrawMesh(Mesh->Next,Alpha);
}

void DrawSkelMesh(tSkeletonNode *Temp,float Alpha)
{
	if(Temp==NULL) return;

	DrawMesh(Temp->MeshList,Alpha);
	DrawSkelMesh(Temp->Child,Alpha);
	DrawSkelMesh(Temp->Next,Alpha);
}

void DrawItems(tItem *Item)
{
	if(Item==NULL) return;
	DrawMesh(Item->MeshList,(float)Item->Life/(float)Item->MaxLife);
	DrawItems(Item->Next);
}
void CalcItemsMesh(tItem *Temp)
{
	if(Temp==NULL) return;

	CalcMeshList(Temp->MeshList,Temp->Matrix,Temp->Pos);
	
	CalcItemsMesh(Temp->Next);
}

void DrawScene()
{
	long I,GunNr;
	float Entf,Alpha;
	tSkeletonNode *Node;

	DisplayedPolys=0;
	for(I=0;I<Players;I++)
	if(Player[I]->Active)
	{
		CalcSkelMesh(Player[I]->Obj->Skel);
	}

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
	glMatrixMode (GL_MODELVIEW);										// Select The Modelview Matrix

	SunLightPos[0]=CPos.X;
	SunLightPos[1]=CPos.Y+160;
	SunLightPos[2]=CPos.Z+100;
	glLightfv(GL_LIGHT1, GL_POSITION, SunLightPos);		// Set Light1 Position
	glLightfv(GL_LIGHT1, GL_AMBIENT, SunLightAmb);			// Set Light1 Ambience
	glLightfv(GL_LIGHT1, GL_DIFFUSE, SunLightDif);			// Set Light1 Diffuse
	glLightfv(GL_LIGHT1, GL_SPECULAR, SunLightSpc);		// Set Light1 Specular

	DrawSky(vSet(CPos.X,CPos.Y-160,CPos.Z));
	DrawWater();
	glClear(GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer
	DrawSector(Level);
	I=0;
	for(I=0;I<Players;I++)
	{
		Entf=vLength2(vSub(Player[I]->Pos,CPos));
		if(Entf<VisBorder)
		{
			if(Player[I]->Active)
				CalcSkelMeshNormalsFromRel(Player[I]->Obj->Skel);
			Alpha=(Entf-_Act_Player_Abstand)/(_Create_Player_Abstand-_Act_Player_Abstand);
			if(Alpha<0) Alpha=0;
			if(Alpha<1) DrawSkelMesh(Player[I]->Obj->Skel,1-Alpha);

			if(Player[I]->Gun>0)
			{
				GunNr=Player[I]->Gun-1;
				Node=GetSkelAddr(GunNode[GunNr],Player[I]->Obj->SkelList);
				ReCalcMatrices(GunModel[GunNr],Node->Matrix,1);
				ReCalcMeshes(GunModel[GunNr],Node->Matrix,Node->Pos);
				DrawSectorNoClip(GunModel[GunNr]);
			}
		}
	}
	CalcItemsMesh(Item);
	DrawItems(Item);
	DrawPartikel(Partikel);

	DrawStats();

}


void DoCamAdjust()
{
	tP3D Up,Forward,Right;
	float MX,MY;
	tSkeletonNode *Temp;
	tP3D TempP3D;
	POINT MPos;

	GetCursorPos(&MPos);
	MX=MPos.x;
	MX=(MX/ScreenXSize)-0.5;
	MY=MPos.y;
	MY=(MY/ScreenYSize)-0.5;
	SetCursorPos(ScreenXSize/2,ScreenYSize/2);
	mouse_x=ScreenXSize/2;
	mouse_y=ScreenYSize/2;


	if(CamMode==0)
	{
/*
		CZiel=vAdd(Player[0]->Pos,vMulK(Player[0]->Matrix.Forward,30));
		CZiel=vAdd(CZiel,vSet(0,10,0));
		CZiel=vAdd(CZiel,vMulK(Player[0]->Matrix.Left,-15));
*/
		CZiel=vAdd(Player[0]->Pos,vMulK(Player[0]->Matrix.Forward,30));
		CZiel=vAdd(CZiel,vSet(0,10,0));
		CZiel=vAdd(CZiel,vMulK(Player[0]->Matrix.Left,0));
		CLookZiel=Player[0]->Pos;

//		CZiel=vMulK(CZiel,MyScale);
//		CLookZiel=vMulK(CLookZiel,MyScale);

		CSpeed=vMulK(vSub(CZiel,CPos),CamSpeedAdd);
		CSpeed=vMulK(CSpeed,CamBrems);
		ClipAgainstSector(Level,CPos,&CSpeed,2,&TempP3D);
//	ClipAgainstSector(Level,vAdd(Temp->Pos,vNull),&Temp->Speed,Temp->SphereSize,&NSpeed);

		CPos=vAdd(CPos,CSpeed);

		CLookSpeed=vMulK(vSub(CLookZiel,CLook),CamSpeedAdd);
		CLookSpeed=vMulK(CLookSpeed,CamBrems);
		CLook=vAdd(CLook,CLookSpeed);
	
	} else if (CamMode==1)
	{
		Up.X = sin(Roll);
		Up.Y = -cos(Roll);
		Up.Z = 0;
		Forward=vSub(CLook,CPos);
		Norm(&Forward);

		Right=vCross(Up,Forward);
		Norm(&Right);

		Up=vCross(Forward,Right);
		Norm(&Up);

		CLook=vAdd(CLook,vMulK(Right,MX*20));
		CLook=vAdd(CLook,vMulK(Up,MY*20));
		if(Key['W']) 
				{
					CPos=vAdd(vMulK(Forward,CamSpeed*HandAcc),CPos);
					CLook=vAdd(vMulK(Forward,CamSpeed*HandAcc),CLook);
				}
		if(Key['S']) 
				{
					CPos=vAdd(vMulK(Forward,-CamSpeed*HandAcc),CPos);
					CLook=vAdd(vMulK(Forward,-CamSpeed*HandAcc),CLook);
				}
		if(Key['A']) 
				{
					CPos=vAdd(vMulK(Right,-CamSpeed*HandAcc),CPos);
					CLook=vAdd(vMulK(Right,-CamSpeed*HandAcc),CLook);
				}
		if(Key['D']) 
				{
					CPos=vAdd(vMulK(Right,CamSpeed*HandAcc),CPos);
					CLook=vAdd(vMulK(Right,CamSpeed*HandAcc),CLook);
				}

	} else if(CamMode==2)
	{
		Temp=GetSkelAddr(10,Player[0]->Obj->SkelList);
		CPos=Temp->Pos;
		CPos=vAdd(CPos,vMulK(Temp->Matrix.Forward,6.0));
		CLook=vAdd(CPos,vMulK(Temp->Matrix.Forward,-10));
		CPos=vAdd(CPos,vMulK(Temp->Matrix.Up,-2.0));

//		CPos=vMulK(CPos,MyScale);
//		CLook=vMulK(CLook,MyScale);

	
	}
}

tItem *AddItem(tItem *Start,tMeshList *MeshList,tP3D Pos,tP3D MeshPos,tP3D Speed,tP3D Rot,float RotSpeed,long MaxLife,bool MeshCopy,long Type,float SphereSize,long Attr)
{
	tItem *Temp,*Temp2;

	Temp=(tItem*)malloc(sizeof(tItem));
	Temp->Next=NULL;
	Temp->Type=Type;
	Temp->Attr=Attr;
	if(MeshCopy)
	{
		Temp->MeshList=CopyMeshList(MeshList);
	} else {
		Temp->MeshList=MeshList;
	}
	Temp->Matrix=CalcNewMatrix(Rot,vNull,KartMatrix(),0);
	SetRollMesh(Temp->MeshList,Temp->Matrix,MeshPos);
	Temp->SphereSize=SphereSize;
	Temp->Roll=0;
	Temp->Pos=Pos;
	Temp->Rot=Rot;
	Temp->Speed=Speed;
	Temp->RotSpeed=RotSpeed;
	Temp->MaxLife=MaxLife;
	Temp->Life=MaxLife;
	if(Start==NULL)
	{
		return(Temp);
	} else {
		Temp2=Start;
		while(Temp2->Next!=NULL)
		{
			Temp2=Temp2->Next;
		}
		Temp2->Next=Temp;
		return(Start);
	}
}


void DoKeyboardStuff()
{
	tSkeletonNode *Node;
	tP3D Speed,Pos;
	long GunNr;

	if(Key[VK_UP]) 
		{
			if(Player[0]->AniIndex!=_Ani_Walk) 
				if(Player[0]->AniIndex==_Ani_Shoot) 
				SetAnimation(Player[0],_Ani_Walk);
			Player[0]->Speed=vAdd(Player[0]->Speed,vMulK(Player[0]->Matrix.Forward,-PSpeed));
		}
	if(Key[VK_DOWN]) 
		{
//			if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
			if(Player[0]->AniIndex!=_Ani_Walk) 
				if(Player[0]->AniIndex==_Ani_Shoot) 
				SetAnimation(Player[0],_Ani_Walk);
			Player[0]->Speed=vAdd(Player[0]->Speed,vMulK(Player[0]->Matrix.Forward,PSpeed));
		}
	if(Key[VK_LEFT]) 
		{
//			if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
			if(Player[0]->AniIndex!=_Ani_Walk) 
				if(Player[0]->AniIndex==_Ani_Shoot) 
				SetAnimation(Player[0],_Ani_Walk);
			Player[0]->Rot.Y+=PTurnSpeed;
		}
	if(Key[VK_RIGHT]) 
		{
//			if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
			if(Player[0]->AniIndex!=_Ani_Walk) 
				if(Player[0]->AniIndex==_Ani_Shoot) 
				SetAnimation(Player[0],_Ani_Walk);
			Player[0]->Rot.Y-=PTurnSpeed;
		}
	if(KeyPr[VK_RETURN]) 
		{
			Player[0]->Speed.Y+=_Jump_Speed;
			SetAnimation(Player[0],_Ani_Jump);
//			ForwardAni(0,8);
			KeyPr[VK_RETURN]=false;
		} 
	if(Key['Y']) { DoMove(0,2);}	
	if(Key['X']) { DoMove(0,3);}
	if(Key['V']) { DoMove(0,4);}	
	if(Key['C']) { DoMove(0,5);}
	if((Key[VK_CONTROL])&&(Player[0]->Gun>0)) 
	{
		GunNr=Player[0]->Gun-1;
		if(Player[0]->Shooting==false)
		{
			Player[0]->Shooting=true;
			if(Player[0]->AniIndex!=_Ani_Shoot) SetAnimation(Player[0],_Ani_Shoot);
		}

⌨️ 快捷键说明

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