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

📄 game.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	glPopAttrib();										// Pops The Display List Bits
}

GLvoid glPrintMid(float x, float y,const char *fmt, ...)					// Custom GL "Print" Routine
{
	char		text[256];								// Holds Our String
	va_list		ap;										// Pointer To List Of Arguments

	if (fmt == NULL)									// If There's No Text
		return;											// Do Nothing

	va_start(ap, fmt);									// Parses The String For Variables
	    vsprintf(text, fmt, ap);						// And Converts Symbols To Actual Numbers
	va_end(ap);											// Results Are Stored In Text

	glRasterPos2f(x-strlen(text)*5,y);

	glPushAttrib(GL_LIST_BIT);							// Pushes The Display List Bits
	glListBase(base - 32);								// Sets The Base Character to 32
	glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);	// Draws The Display List Text
	glPopAttrib();										// Pops The Display List Bits
}

void InitText()
{
	glDisable(GL_TEXTURE_2D);							// Disables DePth Testing
	glDisable(GL_DEPTH_TEST);							// Disables DePth Testing

	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
	glPushMatrix();										// Store The Projection Matrix
	glLoadIdentity();									// Reset The Projection Matrix
	glOrtho(0,640,0,480,-1,1);							// Set UP An Ortho Screen
	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
	glPushMatrix();										// Store The Modelview Matrix
	glLoadIdentity();									// Reset The Modelview Matrix
	glMatrixMode(GL_PROJECTION);								// Select The Projection Matrix
	glLoadIdentity();											// Reset The Projection Matrix
	glOrtho(0,640,0,480,-1,1);				// Set UP An Ortho Screen
	glMatrixMode(GL_MODELVIEW);									// Select The Modelview Matrix
	glDisable(GL_COLOR_MATERIAL);
	glDisable(GL_LIGHT0);	
	glDisable(GL_LIGHTING);
}

void DoneText()
{
	glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
	glPopMatrix();										// Restore The Old Projection Matrix
	glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
	glPopMatrix();										// Restore The Old Projection Matrix
	glEnable(GL_DEPTH_TEST);							// Enables DePth Testing
}

void ReCalcPlayer(tPlayer *DaPlayer,float Time)
{
	DaPlayer->Matrix=CalcNewMatrix(v010,vNull,&Kart_Matrix,DaPlayer->Rot.Y);
	ReCalcSkelNode(DaPlayer->Obj->Skel,&DaPlayer->Matrix,&DaPlayer->Pos,Time);
}

void SetAnimation(tPlayer *Player,long Index)
{
	tSkelList *SkelList;
	tAnimationList *AnimList;

	Player->AniCnt=0;
	Player->Ani=ModelAni[Player->ModelType][Index];
	Player->AniIndex=Index;

	SkelList=Player->Obj->SkelList;
	AnimList=Player->Ani->NodeList;

	while(SkelList!=NULL)
	{
// Letzter Animationsschritt , no calc
		SkelList->Node->Flags=AnimList->Frame0->Node->Flags;
		SkelList=SkelList->Next;
		AnimList=AnimList->Next;
	}

	if(Index<_Ani_Punch) Player->AttackPower=0;
	if((Index>=_Ani_Punch)&&(Index<_Ani_Jump)) 
	{
		Player->AttackCnt++;
		Player->AttackRefresh=_AttackRefresh;
	}
}

void EndAnimation(tPlayer *Player)
{
	Player->AniCnt=Player->Ani->EndCount+1;
}
void DoJump(tPlayer *DaPlayer)
{
			if(DaPlayer->JumpAble>0)
			{
				if(DaPlayer==Player[0]) AddSFX(_SFX_Jump,&DaPlayer->Pos);
				DaPlayer->Speed.Y+=_Jump_Speed;
				if((DaPlayer->ModelType==0)||(DaPlayer->ModelType==2))
					SetAnimation(DaPlayer,_Ani_Jump);
				DaPlayer->JumpAble=-10;
			}
}

tP3D CSOldPos;
tP3D *CSModP,*CSNewSpeed;
tPlayer *CSDaPlayer;
float CSAbSt;
//char ClipAgainstSector(tSector *Sector,tP3D OldPos,tP3D *ModP,float AbSt,tP3D *NewSpeed,tPlayer *DaPlayer)
long ClipAgainstSector(tSector *Sector)
{
	tP3D Pos,NextPos;
	if(Sector==NULL) return(_Hit_false);
	long Result=_Hit_false;
	Pos=vSub2(&CSOldPos,&Sector->ModPos);
	vAdd3v(&NextPos,&Pos,CSModP);
	if((Sector->Flags&_SF_SkeletonNode)
	   ||(IsInBoundBox(&Sector->BoundBox,&Pos,CSAbSt))
	   ||(IsInBoundBox(&Sector->BoundBox,&NextPos,CSAbSt)))
	{
	  if((!(Sector->Flags&_SF_WalkThrough)))
	  {
		if((Sector->Mesh!=NULL)&&(!(Sector->Flags&_SF_SkeletonNode)))
		{
			if(IsInBoundBox(&Sector->Mesh->BoundBox,&Pos,CSAbSt))
			{
				Result|=ClipPointAgainst(Pos,CSModP,Sector,CSAbSt,CSNewSpeed);
				if(((Sector->Flags&_SF_Bumper))&&(Result!=_Hit_false))
				{
					AddSFX(_SFX_Bumper,&Pos);
					*CSNewSpeed=vMulK2(&HitNormal,10);
				}
				if(((Sector->Flags&_SF_Dead))&&(Result!=_Hit_false)&&(CSDaPlayer!=NULL))
					CSDaPlayer->Energy=0;
			}
		}
		Result|=ClipAgainstSector(Sector->SubSector);
	  }
	}
	Result|=ClipAgainstSector(Sector->Next);
	return(Result);
}

char CheckSectorStand(tSector *Sector)
{
	tP3D Pos;
	if(Sector==NULL) return(_Hit_false);
	char Result=_Hit_false;
	Pos=vSub2(&CSOldPos,&Sector->ModPos);
	if((Sector->Flags&_SF_SkeletonNode)||(IsInBoundBox(&Sector->BoundBox,&Pos,CSAbSt)))
	{
	  if((!(Sector->Flags&_SF_WalkThrough)))
	  {
		if((Sector->Mesh!=NULL)&&(!(Sector->Flags&_SF_SkeletonNode)))
		{
			if(IsInBoundBox(&Sector->Mesh->BoundBox,&Pos,CSAbSt))
				Result|=CheckStand(Pos,Sector,CSAbSt);
			if(Result==_Hit_Stand) return(Result);
		}
		Result|=CheckSectorStand(Sector->SubSector);
		if(Result==_Hit_Stand) return(Result);
	  }
	}
	Result|=CheckSectorStand(Sector->Next);
	return(Result);
}

void MovePlayer(tPlayer *DaPlayer)
{
	long I;
	tP3D Richtung,NSpeed,V1,OldSpeed;
	long Hit;
	float Abst;

	for(I=0;I<Players;I++)
	if(Player[I]->Active)
	{

		if(Player[I]!=DaPlayer)
		{
			Richtung=vSub2(&Player[I]->Pos,&DaPlayer->Pos);
			Abst=vLength2(Richtung)-ModelAbstand[DaPlayer->ModelType]-ModelAbstand[Player[I]->ModelType];
			Norm(&Richtung);

			if(Abst<_Player_MinAbstand)
			{
//				DaPlayer->Speed=vSub(DaPlayer->Speed,vMulK(Richtung,_Player_MinAbstand-Abst+_Player_Wegdrueck));
				DaPlayer->Pos=vSub(DaPlayer->Pos,vMulK2(&Richtung,_Player_MinAbstand-Abst+_Player_Wegdrueck));
			}

		}
	}

	vAdd3(&DaPlayer->Speed,&DaPlayer->Obj->Skel->Speed);
	DaPlayer->Obj->Skel->Speed=vNull;

	if(DaPlayer->JumpAble>0)
//	if(DaPlayer->StandOnSector!=NULL)
	{
		vAdd3(&DaPlayer->Pos,&DaPlayer->StandOnSector->ModPos);
		vSub3(&DaPlayer->Pos,&DaPlayer->SOSPos);
		DaPlayer->SOSPos=DaPlayer->StandOnSector->ModPos;
	}
	Hit=_Hit_false;

	if(DaPlayer->JumpAble>0) DaPlayer->JumpAble--;
	if(DaPlayer->JumpAble<0) DaPlayer->JumpAble++;
	CSAbSt=ModelSize[DaPlayer->ModelType];
	if(DaPlayer->JumpAble>=0)
	{
		CSOldPos=vAdd5(&DaPlayer->Pos,vSet(0,-4.0f,0));
		if(CheckSectorStand(Level)==_Hit_Stand)
		{
			if((DaPlayer->JumpAble==0)||(StandSector!=DaPlayer->StandOnSector))
			{
				DaPlayer->StandOnSector=StandSector;
				DaPlayer->SOSPos=StandSector->ModPos;
			}
			DaPlayer->JumpAble=10;
		}
	}
	RutschAble=!(DaPlayer->JumpAble>0);	
	V1=DaPlayer->Speed;
	CSOldPos=vAdd(vAdd2(&DaPlayer->Pos,&DaPlayer->Speed),vSet(0,-0.3f,0));
	Hit=CheckSectorStand(Level);

	OldSpeed=DaPlayer->Speed;
	NSpeed=vNull;
	CSOldPos=DaPlayer->Pos;
	CSModP=&DaPlayer->Speed;
	CSNewSpeed=&NSpeed;
	CSDaPlayer=DaPlayer;
	CSAbSt=ModelSize[DaPlayer->ModelType];

//	ClipAgainstSector(Level,DaPlayer->Pos,&DaPlayer->Speed,ModelSize[DaPlayer->ModelType],&NSpeed,DaPlayer);
	if(ClipAgainstSector(Level)!=_Hit_false) DaPlayer->FallCnt=0;

	if((DaPlayer==Player[0])&&(OldSpeed.Y<-0.5f)&&(NSpeed.Y>0.2f)) AddSFX(_SFX_Hit,&DaPlayer->Pos);

	if(DaPlayer->JumpAble==0)
	{
		DaPlayer->FallCnt++;
	} else {
		DaPlayer->FallCnt=0;
	}

	DaPlayer->LastPos=DaPlayer->Pos;
	DaPlayer->LastSpeed=DaPlayer->Speed;
	if((NSpeed.X!=0)||(NSpeed.Y!=0)||(NSpeed.Z!=0))
		DaPlayer->Speed=NSpeed;


	if(Hit!=_Hit_Stand)
	{  DaPlayer->Speed.Y-=_Fall_Speed; }
	else
	{  DaPlayer->Speed.Y-=_Fall_Speed_Minimal; }

	vMulK3(&DaPlayer->Speed,PBrems);

	CalcObjUsingAnimationAndCountReal(DaPlayer->Obj,DaPlayer->Ani,DaPlayer->AniCnt);
	SkelPhysicAusgleich(DaPlayer->Obj->Skel);
//	CalcSkelMovement(DaPlayer->Obj->Skel,false);

	if(DaPlayer->AttackRefresh>0) DaPlayer->AttackRefresh--;
	DaPlayer->AniCnt+=AniStep;
	if(DaPlayer->Ani->LoopPoint!=-1)
	{
		if(DaPlayer->AniCnt>=DaPlayer->Ani->LoopPoint)
		{
			DaPlayer->AniCnt=0;
		}
	} else {
		if(DaPlayer->AniCnt>=DaPlayer->Ani->EndCount)
		{
			SetAnimation(DaPlayer,_Ani_Stand);
		}
	}

	if(vLength2(DaPlayer->Speed)<_Ani_Stand_Grenze)
	{
		if(DaPlayer->AniIndex==_Ani_Walk)
		{
			SetAnimation(DaPlayer,_Ani_Stand);
		}
	} else {
		if(DaPlayer->AniIndex==_Ani_Stand)
		{
			SetAnimation(DaPlayer,_Ani_Walk);
		}
	}
}

tP3D GetSpeed(tSkeletonNode *Temp)
{
	tP3D NPos;

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

	NPos=CalcRealPosition(Temp->Speed,&Temp->Father->Matrix);
	return(vAdd5(&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,Pos2,DaSpeed;
	
	if(Temp->Father!=NULL) 
	{

// Den Node in richtung des ZielPunktes Verschieben
		vAdd3v(&ZielP,&Temp->Pos,&MoveVek);
		vScale3(&NewPos,vSub2(&ZielP,&Temp->Father->Pos),Temp->FatherAbstand);
// Nur den Anteil des Knickvektors modifizieren
		RelPos=CalcRelPosition(NewPos,&Temp->Father->Matrix);
		DaSpeed=vSub2(&RelPos,&Temp->OrgPos);
		DaSpeed.X=0;
		vAdd3(&Temp->Speed,&DaSpeed);

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

// verschobenen Anteil aus Move-Vektor entfernen
		vSub3(&MoveVek,&Pos2);

// Vater verschieben
		AddSpeedToSkelNode(Temp->Father,MoveVek);

	};
}

void PartikelMob(tP3D Pos,tP3D Speed,float Abst,tP3D Color,long Anz,float Fluk)
{
	long I,L;
	float DaSpeed=0.3f;
	tP3D Sp,P;
	Norm(&Speed);
	vAdd4(&Pos,vMulK2(&Speed,Abst));
	Fluk*=2;

	for(I=0;I<Anz;I++)
	{
		Sp=SpreadVek(vMulK(Speed,FRandom()*DaSpeed),DaSpeed);
		L=10+Random(20);
		P=SpreadVek(vMulK(Speed,FRandom()*Fluk),Fluk);
		AddPartikel(vAdd2(&Pos,&P),Color,Sp,L,1);
	}
}

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

	CalcNextPlayerSkelPositions();
	
	P1=0;
	{
	  O1=Player[P1]->Obj;
	 for(P2=P1+1;P2<Players;P2++)
	 if((Player[P2]->RealActive)&&(AbstandQuadrat(Player[P1]->Pos,Player[P2]->Pos)<300))
	 {
	  for(G1=0;G1<O1->SkelNodes;G1++)
	  {
		N1 =GetSkelAddr(G1,O1->SkelList);
		NN1=N1;
		if((N1->Flags&_Attackable))
		{
		  O2=Player[P2]->Obj;
		  for(G2=0;G2<O2->SkelNodes;G2++)
		  {
			N2 =GetSkelAddr(G2,O2->SkelList);
			NN2=N2;
			
			if((N2->Flags&_Attackable))
			{
			 if(AbstandQuadrat(NN1->Pos,NN2->Pos)<(N1->SphereSize*N1->SphereSize+N2->SphereSize*N2->SphereSize))
			 {
				vScale3(&S1,GetSpeed(N1),2.3f);
				vScale3(&S2,GetSpeed(N2),2.3f);
				Abst=N1->SphereSize+N2->SphereSize;

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

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

		  }
		 }
		}
	  }
	}
}

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

	CalcNextPlayerSkelPositions();
	
//	P1=0;
for(It=0;It<Items;It++)
{
TempI=(Item+It);
   if((TempI->Type==_Item_Bullet)||(TempI->Type==_Item_Box))
	for(P1=0;P1<Players;P1++)
	{
	  SpS=ModelSize[Player[P1]->ModelType];
	  if(Player[P1]->Energy>0)
	  if(AbstandQuadrat(Player[P1]->Pos,TempI->Pos)<(SpS*SpS+TempI->SphereSize*TempI->SphereSize))
	  {
		  O1=Player[P1]->Obj;
		  for(G1=0;G1<O1->SkelNodes;G1++)
		  {
			N1 =GetSkelAddr(G1,O1->SkelList);
			NN1=GetSkelAddr(G1,Player[P1]->NextPos);
			{
				 if(TempI->Owner!=P1)
				 {
				 if(AbstandQuadrat(NN1->Pos,TempI->Pos)<(N1->SphereSize*N1->SphereSize+TempI->SphereSize*TempI->SphereSize))
				 {
					if((TempI->Type==_Item_Box)&&(TempI->Life!=0)&&(P1==0))
					{
						AddSFX(_SFX_Pickup,&TempI->Pos);
						if(TempI->Attr==_ItemBox_Medikit)
						{
							Player[0]->Energy+=MediHeal;
							if(Player[0]->Energy>PlayerEnergy) Player[0]->Energy=PlayerEnergy;
						}
						if(TempI->Attr==_ItemBox_Gun1)
						{
							Player[0]->Ammo[0]+=100;
							SwitchGunTo(1);
						}
						if(TempI->Attr==_ItemBox_Gun2)
						{
							Player[0]->Ammo[1]+=150;
							SwitchGunTo(2);
						}
						if(TempI->Attr==_ItemBox_Continue)
						{
							ContinueOn=true;
							ContinuePos=TempI->Pos;
						}
						if(TempI->Attr==_ItemBox_LevEnd)
						{
							LevComplete=true;
							ChangeMusic((void*)&levelendnotes,false);
						}
						TempI->Life=0;
						for(I=0;I<100;I++)
						{
							vScale3(&Sp,vSet(FRandom3(),FRandom3(),FRandom3()),0.7f);
							AddPartikel(TempI->Pos,vSet(0.75f,0.75f,0.3f),Sp,5+Random(25),1);
						}
					}
					if(TempI->Type==_Item_Bullet)
					{
						/*if(TempI->Attr!=3)*/ TempI->Life=0;
						vScale3(&S2,TempI->Speed,0.5f);
						Abst=N1->SphereSize+TempI->SphereSize;

						PartikelMob(N1->Pos,S2,Abst,vSet(0.7f,0,0),10,0.5f);
						AddSpeedToSkelNode(N1,S2);
						Player[P1]->Energy-=BulletPower[TempI->Attr];
						if(TempI->Attr==0)
						{	AddSFX(_SFX_Beat,&N1->Pos); }
						  else 
						{	if(Random(20)==0) AddSFX(_SFX_Beat,&N1->Pos); }
					  
					}
				 }
				}
			  }
			}
		  }
	  }
	}
}


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

⌨️ 快捷键说明

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