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