📄 game.cpp
字号:
if((
(!Hidden(CPos,CLook,vSet(P1.X,P1.Y,P1.Z)))||
(!Hidden(CPos,CLook,vSet(P1.X,P1.Y,P2.Z)))||
(!Hidden(CPos,CLook,vSet(P1.X,P2.Y,P1.Z)))||
(!Hidden(CPos,CLook,vSet(P1.X,P2.Y,P2.Z)))||
(!Hidden(CPos,CLook,vSet(P2.X,P1.Y,P1.Z)))||
(!Hidden(CPos,CLook,vSet(P2.X,P1.Y,P2.Z)))||
(!Hidden(CPos,CLook,vSet(P2.X,P2.Y,P1.Z)))||
(!Hidden(CPos,CLook,vSet(P2.X,P2.Y,P2.Z)))
))
{
RealAbstand=vLength2(vSub(Temp->BoundBox->Mid,CPos));
Abstand=RealAbstand-DODAnfang;
if((Abstand<VisBorder)||(Temp->Mesh==NULL))
{
if(Temp->Mesh!=NULL)
{
F=Abstand/DODAbstand;
DODNr=F;
if(DODNr>DODAnzahl) DODNr=DODAnzahl;
DrawMesh=Temp->Mesh;
for(I=0;I<DODNr;I++)
{
DrawMesh=DrawMesh->LowerPoly;
}
Alpha=Abstand-AlphaAnfang;
if(Alpha<0) Alpha=0;
Alpha=Alpha/(VisBorder-AlphaAnfang);
if(Alpha>1) Alpha=1;
if(Flag(Temp->Flags,_SF_Player))
{
if((RealAbstand<_Create_Player_Abstand)&&(Temp->Attr>0))
{
AddPlayer(Temp->Attr-1,Temp->Pos,vNull);
Temp->Attr=-1;
Temp->Flags=SetFlag(Temp->Flags,_SF_WalkThrough);
}
} else {
if((Abstand<VisBorder))
DrawGrund(DrawMesh,true,Temp->MatNr,Temp->Pos,Temp,1-Alpha);
}
}
DrawSector(Temp->SubSector);
}
}
DrawSector(Temp->Next);
}
void DrawSky(tP3D Pos)
{
#define SkyHoehe 900
#define Boden 17
#define Radius 900
#define HParts 10
#define VParts 10
long I,K;
float X1,X2,X11,X22,Y1,Y2,Y11,Y22,Z1,Z2,R1,R2,W1,W2,K1,K2,I1,I2,KK1,KK2;
glLoadIdentity (); // Reset The Modelview Matrix
gluLookAt(CPos.X,CPos.Y,CPos.Z,CLook.X,CLook.Y,CLook.Z,0,1,0);
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHT0);
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures[2].texID);
glBegin(GL_QUADS);
for(K=0;K<VParts;K++)
{
K1=K;
K1=K1/VParts;
K2=(K+1);
K2=K2/VParts;
Z1=(SkyHoehe-(K1*SkyHoehe))-Boden;
Z2=(SkyHoehe-(K2*SkyHoehe))-Boden;
if(K1>1) K1=2-K1;
if(K2>1) K2=2-K2;
KK1=K1;
KK2=K2;
R1=sqrt(1-(1-K1)*(1-K1))*Radius;
R2=sqrt(1-(1-K2)*(1-K2))*Radius;
for(I=0;I<HParts;I++)
{
I1=I;
I1=I1/HParts;
I2=I+1;
I2=I2/HParts;
W1=I1*2*Pi;
W2=I2*2*Pi;
X1=sin(W1)*R1;
Y1=cos(W1)*R1;
X2=sin(W2)*R1;
Y2=cos(W2)*R1;
X11=sin(W1)*R2;
Y11=cos(W1)*R2;
X22=sin(W2)*R2;
Y22=cos(W2)*R2;
glTexCoord2f(I1, KK1);
glVertex3f(Pos.X+X1,Pos.Y+Z1,Pos.Z+Y1);
glTexCoord2f(I2, KK1);
glVertex3f(Pos.X+X2,Pos.Y+Z1,Pos.Z+Y2);
glTexCoord2f(I2,KK2);
glVertex3f(Pos.X+X22,Pos.Y+Z2,Pos.Z+Y22);
glTexCoord2f(I1, KK2);
glVertex3f(Pos.X+X11,Pos.Y+Z2,Pos.Z+Y11);
}
}
glEnd();
glDisable(GL_TEXTURE_2D);
}
void InitWater()
{
tWandPoly *TempP;
long I,K;
Water=CreatePolyList(WaterParts,(float)Radius/(float)WaterParts,vNull);
// CreateHighMap(Water,WaterParts,2);
CalcNormalsBasedOnPolys(Water);
TempP=Water->Poly;
while(TempP!=NULL)
{
// TempP->
TempP=TempP->Next;
}
K=2*WaterParts*WaterParts*4;
WaterFeld=(signed short *)malloc(K);
OldWaterFeld=(signed short *)malloc(K);
for(I=0;I<WaterParts*WaterParts*4;I++)
{
*(WaterFeld+I)=0;
*(OldWaterFeld+I)=0;
}
}
void CalcWater()
{
tWandVertice *Temp;
long I,K,M,S,V;
/*
for(I=0;I<10;I++)
{
X=Random(WaterParts*2-2);
Y=Random(WaterParts*2-2);
M=-Random(1000);
*(WaterFeld+Y*WaterParts*2+X)+=M;
}
/**/
S=WaterParts*2;
*(WaterFeld+S+1) = (sin(GlobalTimer*0.1)*1000);
*(WaterFeld+S*2-2) = (sin(GlobalTimer*0.1)*1000);
*(WaterFeld+100) = (sin(GlobalTimer*0.1)*1000);
// *(WaterFeld+300) = (sin(GlobalTimer*0.1)*3000);
// *(WaterFeld+762) = (sin(GlobalTimer*0.1)*3000);
TempWaterFeld=WaterFeld;
WaterFeld=OldWaterFeld;
OldWaterFeld=TempWaterFeld;
for(K=1;K<WaterParts*2-1;K++)
{
M=K*WaterParts*2+1;
for(I=1;I<WaterParts*2-1;I++)
{
V=((*(OldWaterFeld+M-1))+(*(OldWaterFeld+M+1))+
(*(OldWaterFeld+M-S))+(*(OldWaterFeld+M+S)))/2 -
(*(WaterFeld+M));
*(WaterFeld+M)=(V*256)/256;
M++;
}
}
M=0;
Temp=Water->Vertice;
while(Temp!=NULL)
{
Temp->WorldPos=vAdd(Temp->Pos,vSet(CPos.X,WaterFeld[M]/100.0+CPos.Y-160,CPos.Z));
/*
Temp->Normal.Y=1;
Temp->Normal.X=0;
Temp->Normal.Z=0;
Temp->Normal.X=1-(float)((WaterFeld[M]-WaterFeld[M-1]))/10000.0;
Temp->Normal.Z=1-(float)((WaterFeld[M]-WaterFeld[M-S]))/10000.0;
Norm(&Temp->Normal);
*/
M++;
Temp=Temp->Next;
}
CalcNormalsBasedOnPolys(Water);
}
void DrawWater()
{
DrawGrund(Water,true,2,vNull,NULL,1);
}
void DrawMesh(tMeshList *Mesh,float Alpha)
{
if(Mesh==NULL) return;
if(Mesh->Mesh!=NULL)
{
DrawGrund(Mesh->Mesh,true,Mesh->MatNr,vNull,NULL,Alpha);
}
DrawMesh(Mesh->Next,Alpha);
}
void DrawSkelMesh(tSkeletonNode *Temp,float Alpha)
{
if(Temp==NULL) return;
DrawMesh(Temp->MeshList,Alpha);
DrawSkelMesh(Temp->Child,Alpha);
DrawSkelMesh(Temp->Next,Alpha);
}
void DrawItems(tItem *Item)
{
if(Item==NULL) return;
DrawMesh(Item->MeshList,(float)Item->Life/(float)Item->MaxLife);
DrawItems(Item->Next);
}
void CalcItemsMesh(tItem *Temp)
{
if(Temp==NULL) return;
CalcMeshList(Temp->MeshList,Temp->Matrix,Temp->Pos);
CalcItemsMesh(Temp->Next);
}
void DrawScene()
{
long I,GunNr;
float Entf,Alpha;
tSkeletonNode *Node;
DisplayedPolys=0;
for(I=0;I<Players;I++)
if(Player[I]->Active)
{
CalcSkelMesh(Player[I]->Obj->Skel);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix
SunLightPos[0]=CPos.X;
SunLightPos[1]=CPos.Y+160;
SunLightPos[2]=CPos.Z+100;
glLightfv(GL_LIGHT1, GL_POSITION, SunLightPos); // Set Light1 Position
glLightfv(GL_LIGHT1, GL_AMBIENT, SunLightAmb); // Set Light1 Ambience
glLightfv(GL_LIGHT1, GL_DIFFUSE, SunLightDif); // Set Light1 Diffuse
glLightfv(GL_LIGHT1, GL_SPECULAR, SunLightSpc); // Set Light1 Specular
DrawSky(vSet(CPos.X,CPos.Y-160,CPos.Z));
DrawWater();
glClear(GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
DrawSector(Level);
I=0;
for(I=0;I<Players;I++)
{
Entf=vLength2(vSub(Player[I]->Pos,CPos));
if(Entf<VisBorder)
{
if(Player[I]->Active)
CalcSkelMeshNormalsFromRel(Player[I]->Obj->Skel);
Alpha=(Entf-_Act_Player_Abstand)/(_Create_Player_Abstand-_Act_Player_Abstand);
if(Alpha<0) Alpha=0;
if(Alpha<1) DrawSkelMesh(Player[I]->Obj->Skel,1-Alpha);
if(Player[I]->Gun>0)
{
GunNr=Player[I]->Gun-1;
Node=GetSkelAddr(GunNode[GunNr],Player[I]->Obj->SkelList);
ReCalcMatrices(GunModel[GunNr],Node->Matrix,1);
ReCalcMeshes(GunModel[GunNr],Node->Matrix,Node->Pos);
DrawSectorNoClip(GunModel[GunNr]);
}
}
}
CalcItemsMesh(Item);
DrawItems(Item);
DrawPartikel(Partikel);
DrawStats();
}
void DoCamAdjust()
{
tP3D Up,Forward,Right;
float MX,MY;
tSkeletonNode *Temp;
tP3D TempP3D;
POINT MPos;
GetCursorPos(&MPos);
MX=MPos.x;
MX=(MX/ScreenXSize)-0.5;
MY=MPos.y;
MY=(MY/ScreenYSize)-0.5;
SetCursorPos(ScreenXSize/2,ScreenYSize/2);
mouse_x=ScreenXSize/2;
mouse_y=ScreenYSize/2;
if(CamMode==0)
{
/*
CZiel=vAdd(Player[0]->Pos,vMulK(Player[0]->Matrix.Forward,30));
CZiel=vAdd(CZiel,vSet(0,10,0));
CZiel=vAdd(CZiel,vMulK(Player[0]->Matrix.Left,-15));
*/
CZiel=vAdd(Player[0]->Pos,vMulK(Player[0]->Matrix.Forward,30));
CZiel=vAdd(CZiel,vSet(0,10,0));
CZiel=vAdd(CZiel,vMulK(Player[0]->Matrix.Left,0));
CLookZiel=Player[0]->Pos;
// CZiel=vMulK(CZiel,MyScale);
// CLookZiel=vMulK(CLookZiel,MyScale);
CSpeed=vMulK(vSub(CZiel,CPos),CamSpeedAdd);
CSpeed=vMulK(CSpeed,CamBrems);
ClipAgainstSector(Level,CPos,&CSpeed,2,&TempP3D);
// ClipAgainstSector(Level,vAdd(Temp->Pos,vNull),&Temp->Speed,Temp->SphereSize,&NSpeed);
CPos=vAdd(CPos,CSpeed);
CLookSpeed=vMulK(vSub(CLookZiel,CLook),CamSpeedAdd);
CLookSpeed=vMulK(CLookSpeed,CamBrems);
CLook=vAdd(CLook,CLookSpeed);
} else if (CamMode==1)
{
Up.X = sin(Roll);
Up.Y = -cos(Roll);
Up.Z = 0;
Forward=vSub(CLook,CPos);
Norm(&Forward);
Right=vCross(Up,Forward);
Norm(&Right);
Up=vCross(Forward,Right);
Norm(&Up);
CLook=vAdd(CLook,vMulK(Right,MX*20));
CLook=vAdd(CLook,vMulK(Up,MY*20));
if(Key['W'])
{
CPos=vAdd(vMulK(Forward,CamSpeed*HandAcc),CPos);
CLook=vAdd(vMulK(Forward,CamSpeed*HandAcc),CLook);
}
if(Key['S'])
{
CPos=vAdd(vMulK(Forward,-CamSpeed*HandAcc),CPos);
CLook=vAdd(vMulK(Forward,-CamSpeed*HandAcc),CLook);
}
if(Key['A'])
{
CPos=vAdd(vMulK(Right,-CamSpeed*HandAcc),CPos);
CLook=vAdd(vMulK(Right,-CamSpeed*HandAcc),CLook);
}
if(Key['D'])
{
CPos=vAdd(vMulK(Right,CamSpeed*HandAcc),CPos);
CLook=vAdd(vMulK(Right,CamSpeed*HandAcc),CLook);
}
} else if(CamMode==2)
{
Temp=GetSkelAddr(10,Player[0]->Obj->SkelList);
CPos=Temp->Pos;
CPos=vAdd(CPos,vMulK(Temp->Matrix.Forward,6.0));
CLook=vAdd(CPos,vMulK(Temp->Matrix.Forward,-10));
CPos=vAdd(CPos,vMulK(Temp->Matrix.Up,-2.0));
// CPos=vMulK(CPos,MyScale);
// CLook=vMulK(CLook,MyScale);
}
}
tItem *AddItem(tItem *Start,tMeshList *MeshList,tP3D Pos,tP3D MeshPos,tP3D Speed,tP3D Rot,float RotSpeed,long MaxLife,bool MeshCopy,long Type,float SphereSize,long Attr)
{
tItem *Temp,*Temp2;
Temp=(tItem*)malloc(sizeof(tItem));
Temp->Next=NULL;
Temp->Type=Type;
Temp->Attr=Attr;
if(MeshCopy)
{
Temp->MeshList=CopyMeshList(MeshList);
} else {
Temp->MeshList=MeshList;
}
Temp->Matrix=CalcNewMatrix(Rot,vNull,KartMatrix(),0);
SetRollMesh(Temp->MeshList,Temp->Matrix,MeshPos);
Temp->SphereSize=SphereSize;
Temp->Roll=0;
Temp->Pos=Pos;
Temp->Rot=Rot;
Temp->Speed=Speed;
Temp->RotSpeed=RotSpeed;
Temp->MaxLife=MaxLife;
Temp->Life=MaxLife;
if(Start==NULL)
{
return(Temp);
} else {
Temp2=Start;
while(Temp2->Next!=NULL)
{
Temp2=Temp2->Next;
}
Temp2->Next=Temp;
return(Start);
}
}
void DoKeyboardStuff()
{
tSkeletonNode *Node;
tP3D Speed,Pos;
long GunNr;
if(Key[VK_UP])
{
if(Player[0]->AniIndex!=_Ani_Walk)
if(Player[0]->AniIndex==_Ani_Shoot)
SetAnimation(Player[0],_Ani_Walk);
Player[0]->Speed=vAdd(Player[0]->Speed,vMulK(Player[0]->Matrix.Forward,-PSpeed));
}
if(Key[VK_DOWN])
{
// if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
if(Player[0]->AniIndex!=_Ani_Walk)
if(Player[0]->AniIndex==_Ani_Shoot)
SetAnimation(Player[0],_Ani_Walk);
Player[0]->Speed=vAdd(Player[0]->Speed,vMulK(Player[0]->Matrix.Forward,PSpeed));
}
if(Key[VK_LEFT])
{
// if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
if(Player[0]->AniIndex!=_Ani_Walk)
if(Player[0]->AniIndex==_Ani_Shoot)
SetAnimation(Player[0],_Ani_Walk);
Player[0]->Rot.Y+=PTurnSpeed;
}
if(Key[VK_RIGHT])
{
// if(Player[0]->AniIndex!=_Ani_Walk) SetAnimation(Player[0],_Ani_Walk);
if(Player[0]->AniIndex!=_Ani_Walk)
if(Player[0]->AniIndex==_Ani_Shoot)
SetAnimation(Player[0],_Ani_Walk);
Player[0]->Rot.Y-=PTurnSpeed;
}
if(KeyPr[VK_RETURN])
{
Player[0]->Speed.Y+=_Jump_Speed;
SetAnimation(Player[0],_Ani_Jump);
// ForwardAni(0,8);
KeyPr[VK_RETURN]=false;
}
if(Key['Y']) { DoMove(0,2);}
if(Key['X']) { DoMove(0,3);}
if(Key['V']) { DoMove(0,4);}
if(Key['C']) { DoMove(0,5);}
if((Key[VK_CONTROL])&&(Player[0]->Gun>0))
{
GunNr=Player[0]->Gun-1;
if(Player[0]->Shooting==false)
{
Player[0]->Shooting=true;
if(Player[0]->AniIndex!=_Ani_Shoot) SetAnimation(Player[0],_Ani_Shoot);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -