📄 game.cpp
字号:
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 + -