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

📄 game.cpp

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

	if((Temp==NULL)||(Temp->Father==NULL)) return(vNull);

	NPos=CalcRealPosition(Temp->Speed,Temp->Father->Matrix);
	return(vAdd(NPos,GetSpeed(Temp->Father)));
}

void CalcNextPlayerSkelPositions()
{
	long I,K;
	for(I=0;I<Players;I++)
	if(Player[I]->Active)
	{
		for(K=0;K<Player[I]->Obj->SkelNodes;K++)
		{
			GetSkelAddr(K,Player[I]->Obj->SkelList)->Pos=GetSkelAddr(K,Player[I]->NextPos)->Pos;
		}
	}
}


void AddSpeedToSkelNode(tSkeletonNode *Temp,tP3D MoveVek)
{
	tP3D ZielP,NewPos,RelPos,Pos1,Pos2,DaSpeed;
//	float A;
//	MoveVek=vMulK(MoveVek,0.8);
	
	if(Temp->Father!=NULL) 
	{
// Den Node in richtung des ZielPunktes Verschieben
		Pos1=Temp->Pos;
		ZielP=vAdd(Temp->Pos,MoveVek);
		NewPos=vSub(ZielP,Temp->Father->Pos);
		Norm(&NewPos);
		NewPos=vMulK(NewPos,Temp->FatherAbstand);

// Nur den Anteil des Knickvektors modifizieren
		RelPos=CalcRelPosition(NewPos,Temp->Father->Matrix);
		DaSpeed=vSub(RelPos,Temp->OrgPos);
		DaSpeed.X=0;
		Temp->Speed=vAdd(Temp->Speed,DaSpeed);

		Pos2=CalcRealPosition(DaSpeed,Temp->Father->Matrix);

// verschobenen Anteil aus Move-Vektor entfernen
		MoveVek=vSub(MoveVek,Pos2);


// Vater verschieben
		AddSpeedToSkelNode(Temp->Father,MoveVek);
	} else {
		Temp->Speed=vAdd(Temp->Speed,MoveVek);
	}
}

float FRandom()
{
	return((float)Random(10000)/10000.0);
}

void PartikelMob(tP3D Pos,tP3D Speed,float Abst,tP3D Color,long Anz)
{
	long I,L;
	float DaSpeed=0.3;
	tP3D Sp,V1,V2;


	V1=vCross(Speed,vSet(0,1,0));
	Norm(&V1);
	V2=vCross(V1,Speed);
	Norm(&V2);

	Norm(&Speed);
	Pos=vAdd(Pos,vMulK(Speed,Abst*1));

	for(I=0;I<Anz;I++)
	{
		Sp=vAdd(vAdd(vMulK(V1,(2.0*FRandom()-1.0)*DaSpeed),vMulK(V2,(2.0*FRandom()-1.0)*DaSpeed)),vMulK(Speed,FRandom()*DaSpeed));
/*
		Sp=Speed;
		Sp.X*=((float)Random(10000))/10000*DaSpeed;
		Sp.Y*=((float)Random(10000))/10000*DaSpeed;
		Sp.Z*=((float)Random(10000))/10000*DaSpeed;
*/
		L=10+Random(20);
		Partikel=AddPartikel(Partikel,Pos,Color,Sp,L);
	}
}

void CalcKloppe()
{
	long P1,P2,G1,G2;
	tP3D S1,S2;
	tSkeletonNode *N1,*N2,*NN1,*NN2;
	tObjekt *O1,*O2;
	float Abst;

	CalcNextPlayerSkelPositions();
	
	P1=0;
//	for(P1=0;P1<Players;P1++)
	{
	  O1=Player[P1]->Obj;
	  for(G1=0;G1<O1->SkelNodes;G1++)
	  {
		N1 =GetSkelAddr(G1,O1->SkelList);
		NN1=GetSkelAddr(G1,Player[P1]->NextPos);

		if(Flag(N1->Flags,_Attackable))
		{
		 for(P2=P1+1;P2<Players;P2++)
		 if(Player[P2]->Active)
		 {
		  O2=Player[P2]->Obj;
		  for(G2=0;G2<O2->SkelNodes;G2++)
		  {
			N2 =GetSkelAddr(G2,O2->SkelList);
			NN2=GetSkelAddr(G2,Player[P2]->NextPos);
			
			if(Flag(N2->Flags,_Attackable))
			{
			 if(AbstandQuadrat(NN1->Pos,NN2->Pos)<(N1->SphereSize*N1->SphereSize+N2->SphereSize*N2->SphereSize))
			 {

				S1=GetSpeed(N1);
				S2=GetSpeed(N2);
				

				Norm(&S1);
				S1=vMulK(S1,2.5);
				Norm(&S2);
				S2=vMulK(S2,2.5);

				Abst=N1->SphereSize+N2->SphereSize;

				if((Player[P1]->AttackPower!=0)&&(Flag(N1->Flags,_Klopping)))
				{
					PartikelMob(N2->Pos,S1,Abst,vSet(0.7,0,0),50);
					AddSpeedToSkelNode(N2,S1);
					Player[P1]->AttackPower=0;
					EndAnimation(Player[P1]);

					Player[P2]->Energy-=vLength2(S1)*(float)Player[P1]->Power;
				}
				if((Player[P2]->AttackPower!=0)&&(Flag(N2->Flags,_Klopping)))
				{
					PartikelMob(N1->Pos,S2,Abst,vSet(0.7,0,0),50);
					AddSpeedToSkelNode(N1,S2);
					Player[P2]->AttackPower=0;
					EndAnimation(Player[P2]);
					Player[P1]->Energy-=vLength2(S2)*(float)Player[P2]->Power;
				}
			 }
			}

		  }
		 }
		}
	  }
	}
}

void CalcItemKloppe()
{
	long P1,G1;
	tP3D S2;
	tSkeletonNode *N1,*NN1;
	tObjekt *O1;
	tItem *TempI;
	float Abst;

	CalcNextPlayerSkelPositions();
	
//	P1=0;
	for(P1=1;P1<Players;P1++)
	{
	  O1=Player[P1]->Obj;
	  for(G1=0;G1<O1->SkelNodes;G1++)
	  {
		N1 =GetSkelAddr(G1,O1->SkelList);
		NN1=GetSkelAddr(G1,Player[P1]->NextPos);
//		if(Flag(N1->Flags,_Attackable))
		{
/*
		if(Flag(N1->Flags,_Attackable))
		{
		 for(P2=P1+1;P2<Players;P2++)
		 if(Player[P2]->Active)
		 {
		  O2=Player[P2]->Obj;
		  for(G2=0;G2<O2->SkelNodes;G2++)
		  {
			N2 =GetSkelAddr(G2,O2->SkelList);
			NN2=GetSkelAddr(G2,Player[P2]->NextPos);
			
			if(Flag(N2->Flags,_Attackable))
			{
*/
		  TempI=Item;
		  while(TempI!=NULL)
		  {
			 if(AbstandQuadrat(NN1->Pos,TempI->Pos)<(N1->SphereSize*N1->SphereSize+3))
			 {
/*
				S1=GetSpeed(N1);
				S2=GetSpeed(N2);
				

				Norm(&S1);
				S1=vMulK(S1,2.5);
*/
				TempI->Life=0;
				S2=TempI->Speed;
				Norm(&S2);
				S2=vMulK(S2,1);

				Abst=N1->SphereSize+TempI->SphereSize;

				PartikelMob(N1->Pos,S2,Abst,vSet(0.7,0,0),50);
				AddSpeedToSkelNode(N1,S2);
				Player[P1]->Energy-=300.0;
			 }
			 TempI=TempI->Next;
		  }
		}
/*
			}
		  }
		 }
		}
*/
	  }

	}
}


void ForwardAni(long PlNum,long Amount)
{
	long I;

				CalcObjUsingAnimationAndCountReal(Player[PlNum]->Obj,Player[PlNum]->Ani,Player[PlNum]->AniCnt);
				SkelPhysicAusgleich(Player[PlNum]->Obj->Skel);
				for(I=0;I<Amount;I++) 
				{
					CalcSkelSpeeds(Player[PlNum]->Obj->Skel);
				}

}

void DoMove(long PlNum,char _Index)
{

			if((Player[PlNum]->AttackRefresh==0))
			{
				Player[PlNum]->AttackPower=10;
				SetAnimation(Player[PlNum],_Index);
				ForwardAni(PlNum,6);
/*				
				CalcObjUsingAnimationAndCountReal(Player[PlNum]->Obj,Player[PlNum]->Ani,Player[PlNum]->AniCnt);
				SkelPhysicAusgleich(Player[PlNum]->Obj->Skel);
				for(I=0;I<8;I++) 
				{
					CalcSkelSpeeds(Player[PlNum]->Obj->Skel);
				}
*/
			}
}


void KI(long PlayerNum)
{
	tPlayer *Temp;
	tP3D Richtung,Test;
	Temp=Player[PlayerNum];
	float DerCos,Entf;

	Richtung=vSub(Player[0]->Pos,Temp->Pos);
	Entf=vLength2(Richtung);
	Norm(&Richtung);

if(Entf<_Act_Player_Abstand)
{
	Player[PlayerNum]->Active=true;
	Test=vCross(Richtung,Temp->Matrix.Up);
	Norm(&Test);
	
	DerCos=vMul(Test,Temp->Matrix.Forward);
	if((DerCos>0.1)||(DerCos<-0.1))
	{
		if(DerCos>0)
		{
			Temp->Rot.Y-=PTurnSpeed/2;
		} else {
			Temp->Rot.Y+=PTurnSpeed/2;
		}
	}
	if((DerCos>-0.2)&&(DerCos<0.2))
		if(Entf>_KI_Entf)
			Temp->Speed=vAdd(Temp->Speed,vMulK(Temp->Matrix.Forward,-PSpeed*0.75));
	if(Entf<_KI_KloppEntf)
		if(Random(10)==0) DoMove(PlayerNum,2+Random(_Ani_Cnt-3));
} else { Player[PlayerNum]->Active=false;}
}

void DrawStats()
{
	InitText();
	glColor3f(1,1,1);

//	Test=GetHSchnittPunkt(vSet(0,0,0),vSet(0,1,0),vSet(0,0,1));
//	glPrint(0,300,"%f.4, %f.4, %f.4",Test.X,Test.Y,Test.Z);

	if(CamMode==0) glPrint(0,460,"[TAB] - Cam:Locked");	
	if(CamMode==1) glPrint(0,460,"[TAB] - Cam:Mouse+W/S/A/D");	
	if(CamMode==2) glPrint(0,460,"[TAB] - Cam:PlayerHead");	
	glPrint(550,460,ToString("FpS:%d",FramesPS));
	glPrint(500,440,ToString("Polys:%d",DisplayedPolys));
	glPrint(500,420,ToString("Players:%d",Players));
	glPrint(0,25,"[Q]->Change Weapon                               [CTRL]->Fire");
	glPrint(0,5,"[Y],[X],[C],[V],[SPACE]->Action [CURSORS]->Move [RETURN]->Jump");
	DoneText();
}

void DrawPartikel(tPartikel *Partikel)
{
	tP3D View,V1,V2,Pos;
	tPartikel *Temp;
	float Size=1;
	
	View=vSub(CLook,CPos);
	Norm(&View);
	V1=vCross(View,vSet(0,1,0));
	Norm(&V1);
	V2=vCross(V1,View);
	Norm(&V2);
	View=vCross(V1,V2);
	Norm(&View);


	glLoadIdentity ();													// Reset The Modelview Matrix
	gluLookAt(CPos.X,CPos.Y,CPos.Z,CLook.X,CLook.Y,CLook.Z,0,1,0);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, textures[3].texID);	

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

	glBegin(GL_QUADS);

	Temp=Partikel;
	while(Temp!=NULL)
	{
//		glColor4f(Temp->Color.X,Temp->Color.Y,Temp->Color.Z,0.2);
		glColor4f(Temp->Color.X,Temp->Color.Y,Temp->Color.Z,0.5*((float)Temp->Life/(float)Temp->MaxLife));

		glTexCoord2f(0,0);
		Pos=vAdd(Temp->Pos,vAdd(vMulK(V1,-Size),vMulK(V2,-Size)));
		glVertex3f(Pos.X,Pos.Y,Pos.Z);

		glTexCoord2f(1,0);
		Pos=vAdd(Temp->Pos,vAdd(vMulK(V1,Size),vMulK(V2,-Size)));
		glVertex3f(Pos.X,Pos.Y,Pos.Z);

		glTexCoord2f(1,1);
		Pos=vAdd(Temp->Pos,vAdd(vMulK(V1,Size),vMulK(V2,Size)));
		glVertex3f(Pos.X,Pos.Y,Pos.Z);

		glTexCoord2f(0,1);
		Pos=vAdd(Temp->Pos,vAdd(vMulK(V1,-Size),vMulK(V2,Size)));
		glVertex3f(Pos.X,Pos.Y,Pos.Z);

		Temp=Temp->Next;
	}

	glEnd();
	glDisable(GL_TEXTURE_2D);

}

void DrawGrund(tGrund *Grund,bool Textured,long MatNr,tP3D Mid,tSector *Sector,float Alpha)
{
	long M;
	tWandPoly *Temp;
	tWandVertice *P1,*P2,*P3;
	tP3D View;
	tMaterial *TempM;

	TempM=GetMaterial(Material,MatNr);

	glLoadIdentity ();													// Reset The Modelview Matrix
	gluLookAt(CPos.X,CPos.Y,CPos.Z,CLook.X,CLook.Y,CLook.Z,0,1,0);
	
	View=vSub(CLook,CPos);
	Norm(&View);

	if(Textured)
	{
		if(TempM->Textured)
		{
			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, textures[TempM->TexNr].texID);	

			glDisable(GL_LIGHT0);	
			glEnable(GL_COLOR_MATERIAL);
			glEnable(GL_LIGHT1);	
			glEnable(GL_LIGHTING);
/*
			glEnable(GL_COLOR_MATERIAL);
			glEnable(GL_LIGHT0);	
			glEnable(GL_LIGHTING);
*/
		} else {
			glEnable(GL_COLOR_MATERIAL);
			glEnable(GL_LIGHT0);	
			glEnable(GL_LIGHTING);
		}

	}
if(TempM->Textured)
{
//	glColor3f(1,1,1);
	glColor4f(1,1,1,Alpha);
	glBegin(GL_TRIANGLES);

	M=1;
	Temp=Grund->Poly;
	while(Temp!=NULL)
	{
		M++;
		DisplayedPolys++;	

		P1=Temp->P1;
		P2=Temp->P2;
		P3=Temp->P3;
		glNormal3f(P1->Normal.X,P1->Normal.Y,P1->Normal.Z);
		glTexCoord2f(Temp->T1.X,Temp->T1.Y); 
		glVertex3f(P1->WorldPos.X,P1->WorldPos.Y,P1->WorldPos.Z);
		glNormal3f(P2->Normal.X,P2->Normal.Y,P2->Normal.Z);
		glTexCoord2f(Temp->T2.X,Temp->T2.Y); 
		glVertex3f(P2->WorldPos.X,P2->WorldPos.Y,P2->WorldPos.Z);
		glNormal3f(P3->Normal.X,P3->Normal.Y,P3->Normal.Z);
		glTexCoord2f(Temp->T3.X,Temp->T3.Y); 
		glVertex3f(P3->WorldPos.X,P3->WorldPos.Y,P3->WorldPos.Z);
		
		Temp=Temp->Next;
	}
	glEnd();
} else {

//	glColor3f(TempM->Color.X,TempM->Color.Y,TempM->Color.Z);
	glColor4f(TempM->Color.X,TempM->Color.Y,TempM->Color.Z,Alpha);
	glBegin(GL_TRIANGLES);
	M=1;
	Temp=Grund->Poly;
	while(Temp!=NULL)
	{
		M++;
		DisplayedPolys++;	

		P1=Temp->P1;
		P2=Temp->P2;
		P3=Temp->P3;

		glNormal3f(P1->Normal.X,P1->Normal.Y,P1->Normal.Z);
		glVertex3f(P1->WorldPos.X,P1->WorldPos.Y,P1->WorldPos.Z);
		glNormal3f(P2->Normal.X,P2->Normal.Y,P2->Normal.Z);
		glVertex3f(P2->WorldPos.X,P2->WorldPos.Y,P2->WorldPos.Z);
		glNormal3f(P3->Normal.X,P3->Normal.Y,P3->Normal.Z);
		glVertex3f(P3->WorldPos.X,P3->WorldPos.Y,P3->WorldPos.Z);

		
		Temp=Temp->Next;
	}
	glEnd();
}

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_LIGHT0);	
	glEnable(GL_LIGHT1);	
	glDisable(GL_LIGHTING);

}

bool Hidden(tP3D Start,tP3D P1,tP3D P2)
{
	return(vMul(vSub(P1,Start),vSub(P2,Start))<0);
}
void DrawSectorNoClip(tSector *Temp)
{
	if(Temp==NULL) return;
	if(Temp->Mesh!=NULL)
		DrawGrund(Temp->Mesh,true,Temp->MatNr,Temp->Pos,Temp,1);
	DrawSectorNoClip(Temp->SubSector);
	DrawSectorNoClip(Temp->Next);
}

void DrawSector(tSector *Temp)
{
	tP3D P1,P2;
	float Abstand,F,Alpha,RealAbstand;
	long DODNr,I;
	tGrund *DrawMesh;

	if(Temp==NULL) return;
//	DrawNr++;
//	glLoadName(DrawNr);
	P1=Temp->BoundBox->P1;
	P2=Temp->BoundBox->P2;

⌨️ 快捷键说明

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