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