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

📄 game.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if(Player[0]->AniIndex==_Ani_Stand) SetAnimation(Player[0],_Ani_Shoot);
		if(Player[0]->AttackRefresh==0)
		{ 
			Node=GetSkelAddr(GunNode[GunNr],Player[0]->Obj->SkelList);
			Speed=vMulK(Node->Matrix.Up,-2);
			Pos=vAdd(Node->Pos,CalcRealPosition(BulletStart[GunNr],Node->Matrix));
			Item=AddItem(Item,BulletMesh[GunNr],Pos,vNull,Speed,
				vSet(0,-1,0),0,60,true,_Item_Bullet,0.3,GunNr);
			Player[0]->AttackRefresh=GunReload[GunNr];
		}
	} else { 
		if(Player[0]->Shooting) SetAnimation(Player[0],_Ani_Stand);
		Player[0]->Shooting=false;
	}
	if(Key[VK_SPACE]) { DoMove(0,6);}	
	if(KeyPr[VK_TAB]) 
		{
			CamMode+=1;
			if(CamMode==3) CamMode=0;
			KeyPr[VK_TAB]=false;
		}
	if(KeyPr['Q']) 
		{
			Player[0]->Gun++;
			if(Player[0]->Gun>Guns) Player[0]->Gun=0;
			KeyPr['Q']=false;
		}
}

void KeyAction(char Key_,bool State)
{
	if((!Key[Key_])&&(State)) KeyPr[Key_]=true;
	Key[Key_]=State;
}

long GetClosestPlayer(tP3D Pos)
{
	long I,M;
	float Best,Ab;
	Best=-1;
	M=-1;
	for(I=1;I<Players;I++)
	if(Player[I]->Active)
	{
		Ab=vLength2(vSub(Player[I]->Pos,Pos));
		if((Ab<Best)||(M==-1))
		{
			M=I;
			Best=Ab;
		}
	}
	return(M);
}

void CalcItems(tItem *Temp)
{
	long Best;
	tP3D NSpeed,OldSpeed,RelV;
	if(Temp==NULL) return;

	NSpeed=vNull;
	OldSpeed=Temp->Speed;
	ClipAgainstSector(Level,vAdd(Temp->Pos,vNull),&Temp->Speed,Temp->SphereSize,&NSpeed);
	if((Temp->Speed.X!=OldSpeed.X)||(Temp->Speed.Y!=OldSpeed.Y)||(Temp->Speed.Z!=OldSpeed.Z))
		if(Temp->Type!=_Item_Part) 
		{
			Temp->Life=0;
			PartikelMob(Temp->Pos,Temp->Speed,1,vSet(0.7,0.7,0),3);
		}
	Temp->Pos=vAdd(Temp->Pos,Temp->Speed);

	if((NSpeed.X!=0)||(NSpeed.Y!=0)||(NSpeed.Z!=0)) 
	{
		Temp->Speed=NSpeed;
	}
	
	if(Temp->Type==_Item_Part)
	{
		Temp->Speed.Y-=_Fall_Speed_Item;
		Temp->Speed=vMulK(Temp->Speed,ItemBrems);
		Temp->RotSpeed*=ItemBrems;
		if(GlobalTimer%4==0)
			if(Temp->Life>20)
				Partikel=AddPartikel(Partikel,Temp->Pos,vSet(0.7,0,0),vMulK(Temp->Speed,0.2),50);
	}
	if(Temp->Type==_Item_Bullet)
	{
		Temp->Rot=vMulK(Temp->Speed,-1);
		Norm(&Temp->Rot);
//		if((Temp->Attr==0)&&(GlobalTimer%10==0)) PartikelMob(Temp->Pos,Temp->Speed,1,vSet(0.7,0.7,0),1);
		if(Temp->Attr==1) 
		{
			PartikelMob(Temp->Pos,Temp->Speed,1,vSet(0.7,0.7,0),1);
			Best=GetClosestPlayer(Temp->Pos);
			if(Best!=-1)
			{
				RelV=vSub(Player[Best]->Pos,Temp->Pos);
				Norm(&RelV);
				Temp->Speed=vAdd(vMulK(Temp->Speed,ItemBrems),vMulK(RelV,0.2));
			}
		}
	}
	Temp->Roll+=Temp->RotSpeed;

	Temp->Matrix=CalcNewMatrix(Temp->Rot,vNull,KartMatrix(),Temp->Roll);
	Temp->Life--;

	CalcItems(Temp->Next);
}

void DelItem(tItem *Temp)
{
	DelMeshList(Temp->MeshList);
	free(Temp);
}

tItem *ScanForDeleteAbleItems(tItem *Start)
{
	tItem *Old,*Temp,*ToKill;
	if(Start==NULL) return(NULL);
	Old=NULL;
	Temp=Start;
	while(Temp!=NULL)
	{
		if(Temp->Life<=0)
		{
			if(Temp->Type==_Item_Bullet)
			{
				if(Temp->Attr==1)
				{
					PartikelMob(Temp->Pos,vMulK(Temp->Speed,100),1,vSet(0.7,0.5,0),100);
				}
			}
			if(Old==NULL)
			{
				ToKill=Temp;
				Temp=Temp->Next;
				Start=Temp;
				DelItem(ToKill);
			} else {
				ToKill=Temp;
				Temp=Temp->Next;
				Old->Next=Temp;
				DelItem(ToKill);
			}
		} else {
			Old=Temp;
			Temp=Temp->Next;
		}
	}
	return(Start);
}

void CalcAllStuff(long FramesToDo)
{
	long I,K;
	for(I=0;I<FramesToDo;I++)
	{
		DoCamAdjust();
		Item=ScanForDeleteAbleItems(Item);
		Partikel=CalcPartikel(Partikel);
		GlobalTimer++;
		DoKeyboardStuff();
		CalcItems(Item);
		if(GlobalTimer%4==0) CalcWater();
		for(K=0;K<Players;K++)
		{
			if(Player[K]->Active)
				ReCalcPlayer(Player[K]);
		}
		for(K=1;K<Players;K++)
		{
			KI(K);
		}
		for(K=0;K<Players;K++)
		{ 
			if(Player[K]->Active)
				CalcSkelSpeeds(Player[K]->Obj->Skel);
		}
		CalcKloppe();
		CalcItemKloppe();
		for(K=0;K<Players;K++)
		{ 
			if(Player[K]->Active)
				MovePlayer(Player[K]);
		}
		for(K=1;K<Players;K++)
		{ 
			if(Player[K]->Energy<=0)
			{
				DelPlayer(K,true);
				K--;
			}
		}

	}

	if(Players<_Players)
		AddPlayer(0,vSet(-5+Random(10),80,-5+Random(10)),vSet(0,3.14159/2,0));

}

void SetSpeedNull(tSkeletonNode *Temp)
{
	if(Temp==NULL) return;
	Temp->Speed=vNull;
	SetSpeedNull(Temp->Child);
	SetSpeedNull(Temp->Next);
}

void AddPlayer(long ModelNr,tP3D Pos,tP3D Rot)
{
	tPlayer *Temp;

	Temp=(tPlayer*) malloc(sizeof(tPlayer));
	Player[Players]=Temp;


	Temp->Active=true;
	Temp->Obj=CopyObject(Model[ModelNr]);
	SetSpeedNull(Temp->Obj->Skel);
	Temp->Pos=Pos;
	Temp->Rot=Rot;
	Temp->Speed=vNull;
	Temp->ModelType=ModelNr;
	Temp->Energy=ModelEnergy[ModelNr];
	Temp->Power=ModelPower[ModelNr];
	SetAnimation(Temp,_Ani_Stand);
	ReCalcPlayer(Temp);
	Temp->NextPos=CreateSkelList(Temp->Obj->Skel,Temp->Obj);
	Temp->Shooting=false;
	Temp->Gun=0;
	Temp->AttackPower=0;
	Temp->AttackRefresh=0;
	CalcSkelMesh(Temp->Obj->Skel);
	Players++;
}

void ConvertSkelToItem(tSkeletonNode *Temp,tP3D Mid)
{
	tP3D Speed,Speed2,Pos,Rot;
	if(Temp==NULL) return;

	Speed2=vSub(Temp->Pos,Mid);
//	Norm(&Speed2);
//	Speed2=vMulK(Speed2,1);

	Speed=GetSpeed(Temp);
	Speed=Speed2;
//	if(vLength2(Speed)!=0) Norm(&Speed);
	Speed=vAdd(Speed,vSet(0.01,0.01,0.01));
	Speed=vMulK(Speed,0.1);
	Speed.Y+=0.5;

	Pos=vAdd(Temp->Pos,vNull);
	Rot=vCross(Speed,KartMatrix().Up);
	Item=AddItem(Item,Temp->MeshList,Pos,Temp->Pos,Speed,Rot,-vLength2(Speed)*0.7,80,true,_Item_Part,3,0);
	ConvertSkelToItem(Temp->Child,Mid);
	ConvertSkelToItem(Temp->Next,Mid);
}

void DelPlayer(long Nr,bool ConvertToItems)
{
	tPlayer *Temp;

	Temp=Player[Nr];
	Player[Nr]=Player[Players-1];
	Players--;

	if(ConvertToItems)
	{
		ConvertSkelToItem(Temp->Obj->Skel,Temp->Pos);
	}

	DestroySkelList(Temp->NextPos);
	DelObj(Temp->Obj);
	free(Temp);
}

void SetSectorMeshes(tSector *Sector,tOMatrix FMatrix,tP3D FPos)
{
	tWandVertice *Temp;
	tP3D RelP;

	if(Sector==NULL) return;

	Sector->OrgPos=CalcRelPosition(vSub(Sector->Pos,FPos),FMatrix);
/*
	if(Sector->Mesh!=NULL)
		SetMeshPointsRelTo(Sector->Mesh,Sector->Matrix,Sector->Pos);
*/
	if(Sector->Mesh!=NULL)
	{
		Temp=Sector->Mesh->Vertice;
		while(Temp!=NULL)
		{
			RelP=vSub(Temp->WorldPos,Sector->Pos);
			RelP=CalcRelPosition(RelP,Sector->Matrix);
			Temp->Pos=RelP;
			Temp=Temp->Next;
		}
	}
	SetSectorMeshes(Sector->SubSector,Sector->Matrix,Sector->Pos);
	SetSectorMeshes(Sector->Next,FMatrix,FPos);
}

tSector *LoadGunModel(char *fName,tOMatrix Matrix,tP3D Rot,float Size)
{
	tCommand *CommandList;
	tSector *Level;
	tOMatrix NMatrix;

	CommandList=LoadLevel(fName);
	Level=ReCalcCommandList(CommandList);
	Level=Level->SubSector;

	NMatrix=KartMatrix();
	NMatrix.Forward=vMulK(NMatrix.Forward,Size);
	NMatrix.Up=vMulK(NMatrix.Up,Size);
	NMatrix.Left=vMulK(NMatrix.Left,Size);

	ReCalcMatrices(Level,NMatrix,1);
	ReCalcMeshes(Level,NMatrix,vNull);

	Matrix=CalcNewMatrix(Rot,vNull,Matrix,0);
//	Matrix=KartMatrix();
/*
	ReCalcMatrices(Level,Matrix,1);
//	SetPointsAsTheyAre(Level);
	ReCalcMeshes(Level,Matrix,vNull);
*/

	ReCalcMatrices(Level,Matrix,1);
	SetSectorMeshes(Level,Matrix,Level->Pos);
	ReCalcMeshes(Level,Matrix,vNull);

	ReduceSector(Level,DODMin);
	CalcLowerVersions(Level,DODAnzahl,DODMin,DODMax);

	ReCalcSectorBoundBoxes(Level);
	return(Level);
}

void Init_Engine()
{
	long I,K;
	tSkeletonNode *Temp;
	tOMatrix Matrix;

	vNull=vSet(0,0,0);

	LoadTGA(&textures[9],"Data/Font.tga");				// Load The Crosshair Texture

    LoadGLTexture(&textures[1].texID, "Data/ground.bmp");
    LoadGLTexture(&textures[2].texID, "Data/sky31.bmp");
	LoadTGA(&textures[3],"Data/particle2.tga");				// Load The Crosshair Texture
	LoadTGA(&textures[4],"Data/blueface.tga");				// Load The Crosshair Texture
	LoadTGA(&textures[5],"Data/point.tga");				// Load The Crosshair Texture
/*
    LoadGLTexture(&textures[6].texID, "Data/ground.bmp");
    LoadGLTexture(&textures[7].texID, "Data/skin.bmp");
    LoadGLTexture(&textures[8].texID, "Data/3steck2.bmp");
    LoadGLTexture(&textures[10].texID, "Data/fetus_skin.bmp");
    LoadGLTexture(&textures[11].texID, "Data/jeans.bmp");
    LoadGLTexture(&textures[12].texID, "Data/marmor1.bmp");
    LoadGLTexture(&textures[13].texID, "Data/mflor.bmp");
    LoadGLTexture(&textures[14].texID, "Data/weste.bmp");
    LoadGLTexture(&textures[15].texID, "Data/wall.bmp");
*/
    LoadGLTexture(&textures[6].texID, "Data/ground.bmp");
    LoadGLTexture(&textures[7].texID, "Data/jeans.bmp");
    LoadGLTexture(&textures[8].texID, "Data/marmor1.bmp");


	BuildFont();

	glDisable(GL_TEXTURE_2D);

	CreateMaterials();
/*
	PPos=vSet(0,0,70);
    PRot=vSet(0,0,1);
*/
/*
	ModelAni[0][_Ani_Stand]=LoadAnimation("Stand3.ani");
	ModelAni[0][_Ani_Walk] =LoadAnimation("Walk.ani");
	ModelAni[0][_Ani_Punch]=LoadAnimation("Punch.ani");
	ModelAni[0][_Ani_Kick]=LoadAnimation("Kick.ani");
	ModelAni[0][_Ani_Punch2]=LoadAnimation("Punch4.ani");
	ModelAni[0][_Ani_Kick2]=LoadAnimation("Kick2.ani");
	ModelAni[0][_Ani_Headmove]=LoadAnimation("Headbutt.ani");
	ModelAni[0][_Ani_Jump]=LoadAnimation("Jump.ani");
*/

	ModelAni[0][_Ani_Stand]=LoadAnimation("PlStand.ani");
	ModelAni[0][_Ani_Walk] =LoadAnimation("PlWalk.ani");
	ModelAni[0][_Ani_Punch]=LoadAnimation("PlPunch2.ani");
	ModelAni[0][_Ani_Kick]=LoadAnimation("PlKick2.ani");
	ModelAni[0][_Ani_Punch2]=LoadAnimation("PlPunch.ani");
	ModelAni[0][_Ani_Kick2]=LoadAnimation("PlKick.ani");
	ModelAni[0][_Ani_Headmove]=LoadAnimation("PlHeadButt.ani");
	ModelAni[0][_Ani_Jump]=LoadAnimation("PlHeadButt.ani");
	ModelAni[0][_Ani_Shoot]=LoadAnimation("PlStand.ani");

	Model[0]=LoadObjFromBCL("Player1.bcl");
	LoadBaseAnimation(Model[0],"PlBase.ani");
	CalcSkelMeshNormals(Model[0]->Skel);
//	CalcNormalVectors(Model[0]);
//	MakeRelNormals(Model[0]);
	for(K=0;K<Model[0]->SkelNodes;K++)
	{
		Temp=GetSkelAddr(K,Model[0]->SkelList);
		Temp->Flags=UnSetFlag(Temp->Flags,_Fixed);
	}

	ModelEnergy[0]=10000;
	ModelPower[0]=1000;

	Item=NULL;
/*
	GunReload[0]=3;
	GunSize[0]=0.3;
	GunNode[0]=13;
	Temp=GetSkelAddr(GunNode[0],Model[0]->SkelList);
	GunModel[0]=LoadGunModel("Gun.bcl",Temp->Matrix,vSet(0,0,1),GunSize[0]);

	BulletSize[0]=0.2;
	BulletStart[0]=vSet(-1.8,0.7,0.2);
	BulletModel[0]=LoadGunModel("Bullet.bcl",Temp->Matrix,vSet(0,0,1),BulletSize[0]);
	BulletMesh[0]=ConvertToMeshList(NULL,BulletModel[0],KartMatrix(),vNull);

	GunReload[1]=20;
	GunSize[1]=0.8;
	GunNode[1]=13;
	Temp=GetSkelAddr(GunNode[1],Model[0]->SkelList);
	GunModel[1]=LoadGunModel("Gun_2.bcl",Temp->Matrix,vSet(0,0,1),GunSize[1]);

	BulletSize[1]=0.4;
	BulletStart[1]=vSet(-1.8,0.7,0.4);
	BulletModel[1]=LoadGunModel("Bullet_2.bcl",Temp->Matrix,vSet(0,0,1),BulletSize[1]);
	BulletMesh[1]=ConvertToMeshList(NULL,BulletModel[1],KartMatrix(),vNull);
*/

	for(I=0;I<_Players;I++)
	{
		AddPlayer(0,vSet(-5+Random(10),150+50,-5+Random(10)),vSet(0,3.14159/2,0));
/*
		Player[I]=(tPlayer*) malloc(sizeof(tPlayer));
		Player[I]->Obj=CopyObject(Model[0]);

		CalcNormalVectors(Player[I]->Obj);
		MakeRelNormals(Player[I]->Obj);
		for(K=0;K<Player[I]->Obj->SkelNodes;K++)
		{
			Temp=GetSkelAddr(K,Player[I]->Obj->SkelList);
			Temp->Flags=UnSetFlag(Temp->Flags,_Fixed);
		}
		Player[I]->Pos=vSet(-15+I*30,150+50,0);
		Player[I]->Rot=vSet(0,3.14159/2,0);
		if(I==0) Player[I]->Rot=vSet(0,3.14159/2,0);
		if(I==1) Player[I]->Rot=vSet(0,3.14159/2,0);
		Player[I]->Speed=vNull;
		Player[I]->ModelType=0;
		SetAnimation(Player[I],_Ani_Stand);
		ReCalcPlayer(Player[I]);
		Player[I]->NextPos=CreateSkelList(Player[I]->Obj->Skel,Player[I]->Obj);
		Player[I]->AttackPower=0;
		Player[I]->AttackRefresh=0;
*/
	}
	CSpeed=vNull;
	CPos=Player[0]->Pos;
	CZiel=vNull;
	CLookZiel=vNull;
	CLookSpeed=vNull;
	Grund=CreatePolyList(20,50,vNull);
//	CreateHighMap(Grund,20,40);
	CPos=vNull;
	CLook=vSet(0,0,1);

	CommandList=LoadLevel(LevelName);
	Level=ReCalcCommandList(CommandList);

	Matrix=KartMatrix();
	Matrix.Forward=vMulK(Matrix.Forward,LevelSize);
	Matrix.Up=vMulK(Matrix.Up,LevelSize);
	Matrix.Left=vMulK(Matrix.Left,LevelSize);

	ReCalcMatrices(Level,Matrix,1);
	ReCalcMeshes(Level,Matrix,vNull);

	ReduceSector(Level,DODMin);
	CalcLowerVersions(Level,DODAnzahl,DODMin,DODMax);

	ReCalcSectorBoundBoxes(Level);
//	ReCalcPolyNormals(Level);
	
	InitWater();

	Partikel=NULL;
	for(I=0;I<1;I++)
	{
		Partikel=AddPartikel(Partikel,vSet(I,0,0),vSet(1,0,1),vSet(0,Random(10),0),300+Random(100));
	}

}

void DeInit_Engine()
{
}

⌨️ 快捷键说明

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