📄 game.cpp
字号:
switch(Type)
{
case _SFX_Test:SetSFX(Nr,100,40+Random(40),TestNodeNr,Vol,Pan);break;
case _SFX_Punch:SetSFX(Nr,30,5+Random(170),5,Vol,Pan);break;
case _SFX_BulletMode:SetSFX(Nr,100,40,2,Vol,Pan);break;
case _SFX_Flamer:if(GlobalTimer%10==0) SetSFX(Nr,100,40,0x1B,Vol,Pan);break;
case _SFX_Jump:SetSFX(Nr,100,40,0x1C,Vol,Pan);break;
case _SFX_Bumper:SetSFX(Nr,100,40,0x1D,Vol,Pan);break;
case _SFX_Pickup:SetSFX(Nr,100,40,0x1E,Vol,Pan);break;
case _SFX_Hit:SetSFX(Nr,10,40,14,Vol/3,Pan);break;
case _SFX_Gun:SetSFX(Nr,10,40,3,Vol/7,Pan);break;
case _SFX_Beat:SetSFX(Nr,20,40,32,Vol/4,Pan);break;
case _SFX_Die:SetSFX(Nr,10,40,18,Vol,Pan);break;
}
// synth->process(&more);
}
void CalcSFX()
{
long I;
for(I=0;I<_SFX_Channels;I++)
if(SFX[I].IsOn)
{
/*
{
synth->triggerInstrument(_SFX_Start_Channel+I,
SFX[I].Note,
SFX[I].Instr,
SFX[I].Vol*SFX[I].Life/SFX[I].MaxLife,
SFX[I].Panning);
}
*/
SFX[I].Life--;
SFX[I].Cnt++;
if(SFX[I].Life<=0)
{
#ifdef SynthMukke
synth->triggerInstrument(_SFX_Start_Channel+I,40,1,0,128);
#endif
SFX[I].IsOn=false;
SFX[I].Life=0;
}
}
}
void StopMusic()
{
if(!MusicOn) return;
#ifdef SynthMukke
if(DoMusic) synth->stop();
delete synth;
delete song;
#endif
MusicOn=false;
}
void ChangeMusic(void *Addr,bool Looped)
{
// Addr=(void *)&emptynotes;
StopMusic();
#ifdef SynthMukke
more=true;
// synth...
song = new Tunefish::Song((unsigned char *)Addr, (double *)instruments);
synth = new Tunefish::Synth(song, (double *)effects);
SynthInit=true;
if(!synth) SynthInit=false;
if(DoMusic) synth->play(1.0f, Looped);
LastLoopBool=Looped;
#endif
MusicOn=true;
}
void SwitchGun()
{
do
{
Player[0]->Gun++;
if(Player[0]->Gun>Guns) Player[0]->Gun=0;
} while((Player[0]->Gun!=0)&&(Player[0]->Ammo[Player[0]->Gun-1]==0));
}
void SwitchGunTo(long Nr)
{
while(Player[0]->Gun!=Nr) SwitchGun();
}
GLuint EmptyTexture(long X,long Y) // Create An Empty Texture
{
GLuint txtnumber; // Texture ID
unsigned int* data; // Stored Data
unsigned char *MyData;
long I;
// Create Storage Space For Texture Data (128x128x4)
data = (unsigned int*)new GLuint[((X * Y)* 4 * sizeof(unsigned int))];
ZeroMemory(data,((X * Y)* 4 * sizeof(unsigned int))); // Clear Storage Memory
MyData=(unsigned char*)data;
for(I=0;I<X*Y;I++) *(MyData+I*4+3)=255;
glGenTextures(1, &txtnumber); // Create 1 Texture
glBindTexture(GL_TEXTURE_2D, txtnumber); // Bind The Texture
glTexImage2D(GL_TEXTURE_2D, 0, 4, X, Y, 0,
GL_RGBA, GL_UNSIGNED_BYTE, data); // Build Texture Using Information In data
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
delete [] data; // Release data
return txtnumber; // Return The Texture ID
}
/*
tWandVertice *GetThird(tWandPoly *Poly,tWandVertice *P1,tWandVertice *P2,tP2D T1,tP2D T2,tP2D *ResultT)
{
if((Poly->P1==P1)&&(Poly->P2==P2)&&(v2Equal(Poly->T1,T1))&&(v2Equal(Poly->T2,T2)))
// if((Poly->P1==P1)&&(Poly->P2==P2))
{
*ResultT=Poly->T3;
return(Poly->P3);
}
// if((Poly->P2==P1)&&(Poly->P3==P2))
if((Poly->P2==P1)&&(Poly->P3==P2)&&(v2Equal(Poly->T2,T1))&&(v2Equal(Poly->T3,T2)))
{
*ResultT=Poly->T1;
return(Poly->P1);
}
// if((Poly->P3==P1)&&(Poly->P1==P2))
if((Poly->P3==P1)&&(Poly->P1==P2)&&(v2Equal(Poly->T3,T1))&&(v2Equal(Poly->T1,T2)))
{
*ResultT=Poly->T2;
return(Poly->P2);
}
return(NULL);
}
bool StripAble(tWandPoly *Test,tWandPoly *Start)
{
tP2D T;
long I=0;
while(Start!=NULL)
{
if((GetThird(Start,Test->P3,Test->P2,Test->T3,Test->T2,&T)!=NULL)
&&(*(MDIndex+I)==0)) return(true);
Start=Start->Next;
I++;
}
return(false);
}
*/
void CreateDisplayList(tGrund *Mesh)
{
tWandPoly *Temp;
if(Mesh==NULL) return;
Mesh->DisplayList=glGenLists(1);
glNewList(Mesh->DisplayList,GL_COMPILE);
/*
memset(MDIndex,0,MaxManualDraw*4);
do
{
I=0;
Temp=Mesh->Poly;
while((Temp!=NULL)&&((*(MDIndex+I)!=0)||(!StripAble(Temp,Mesh->Poly)))) { I++;Temp=Temp->Next;}
if(Temp!=NULL)
{
*(MDIndex+I)=1;
M=0;
glBegin(GL_TRIANGLE_STRIP);
T1=Temp->T2;
T2=Temp->T3;
P1=Temp->P2;
P2=Temp->P3;
glNormal3fv((float*)&Temp->P1->Normal);
glTexCoord2fv((float*)&Temp->T1);
glVertex3fv((float*)&Temp->P1->WorldPos);
glNormal3fv((float*)&P1->Normal);
glTexCoord2fv((float*)&T1);
glVertex3fv((float*)&P1->WorldPos);
glNormal3fv((float*)&P2->Normal);
glTexCoord2fv((float*)&T2);
glVertex3fv((float*)&P2->WorldPos);
do
{
Follow=Mesh->Poly;
K=0;
do
{
Follow=Follow->Next;
K++;
if(Follow!=NULL)
P3=GetThird(Follow,P2,P1,T2,T1,&T3);
} while((Follow!=NULL)&&((P3==NULL)||(*(MDIndex+K)!=0)));
if(Follow!=NULL)
{
*(MDIndex+K)=1;
M++;
if(M%2==1)
{
P1=P3;
T1=T3;
} else {
P2=P3;
T2=T3;
}
glNormal3fv((float*)&P3->Normal);
glTexCoord2fv((float*)&T3);
glVertex3fv((float*)&P3->WorldPos);
}
} while(Follow!=NULL);
glEnd();
}
} while(Temp!=NULL);
glBegin(GL_TRIANGLES);
I=0;
Temp=Mesh->Poly;
while(Temp!=NULL)
{
if(*(MDIndex+I)==0)
{
glNormal3fv((float*)&Temp->P1->Normal);
glTexCoord2fv((float*)&Temp->T1);
glVertex3fv((float*)&Temp->P1->WorldPos);
glNormal3fv((float*)&Temp->P2->Normal);
glTexCoord2fv((float*)&Temp->T2);
glVertex3fv((float*)&Temp->P2->WorldPos);
glNormal3fv((float*)&Temp->P3->Normal);
glTexCoord2fv((float*)&Temp->T3);
glVertex3fv((float*)&Temp->P3->WorldPos);
}
I++;
Temp=Temp->Next;
}
glEnd();
*/
glBegin(GL_TRIANGLES);
Temp=Mesh->Poly;
while(Temp!=NULL)
{
{
glNormal3fv((float*)&Temp->P1->Normal);
glTexCoord2fv((float*)&Temp->T1);
glVertex3fv((float*)&Temp->P1->WorldPos);
glNormal3fv((float*)&Temp->P2->Normal);
glTexCoord2fv((float*)&Temp->T2);
glVertex3fv((float*)&Temp->P2->WorldPos);
glNormal3fv((float*)&Temp->P3->Normal);
glTexCoord2fv((float*)&Temp->T3);
glVertex3fv((float*)&Temp->P3->WorldPos);
}
Temp=Temp->Next;
}
glEnd();
/**/
glEndList();
Mesh->DisplayListOn=true;
}
void MakeGlMatrix(tOMatrix *Matrix,tP3D Add)
{
glPushMatrix();
__asm
{
mov esi,[Matrix]
mov edi,offset GlMatrix
fldz
mov edx,3
Loop33:
mov ecx,3
Loop3:
fld dword ptr [esi]
fstp dword ptr [edi]
add esi,4
add edi,4
dec ecx
jnz Loop3
fst dword ptr [edi]
add edi,4
dec edx
jnz Loop33
fld dword ptr [Add.X]
fstp dword ptr [edi]
fld dword ptr [Add.Y]
fstp dword ptr [edi+4]
fld dword ptr [Add.Z]
fstp dword ptr [edi+8]
faddp st(0),st(0)
fld1
fstp dword ptr [edi+12]
}
glMultMatrixf(GlMatrix);
}
void CreateMeshListDL(tMeshList *List)
{
if(List==NULL) return;
CreateDisplayList(List->Mesh);
CreateMeshListDL(List->Next);
}
void CreateSkelNodeDL(tSkeletonNode *Temp)
{
if(Temp==NULL) return;
CreateMeshListDL(Temp->MeshList);
CreateSkelNodeDL(Temp->Child);
CreateSkelNodeDL(Temp->Next);
}
void CreateSectorDL(tSector *Temp)
{
if(Temp==NULL) return;
CreateDisplayList(Temp->Mesh);
CreateSectorDL(Temp->Next);
CreateSectorDL(Temp->SubSector);
}
void CalcEnv(tGrund *Mesh)
{
tWandVertice *Temp;
tWandPoly *TempP;
tP3D Normal;
if(Mesh==NULL) return;
Temp=Mesh->Vertice;
while(Temp!=NULL)
{
Norm3(&Normal,Temp->Normal);
SetTexPos(Normal,&Temp->TexPos);
// SetTexPos(Normal,&Temp->EnvTex);
Temp=Temp->Next;
}
TempP=Mesh->Poly;
while(TempP!=NULL)
{
TempP->Env1=TempP->P1->TexPos;
TempP->Env2=TempP->P2->TexPos;
TempP->Env3=TempP->P3->TexPos;
if((fabs(TempP->Env1.X-TempP->Env2.X)>0.5f)||(fabs(TempP->Env1.X-TempP->Env3.X)>0.5f)||(fabs(TempP->Env3.X-TempP->Env2.X)>0.5f))
{
if(TempP->Env1.X<0.5f) TempP->Env1.X+=1.0f;
if(TempP->Env2.X<0.5f) TempP->Env2.X+=1.0f;
if(TempP->Env3.X<0.5f) TempP->Env3.X+=1.0f;
}
TempP=TempP->Next;
}
}
void SetMesh(tGrund *Mesh)
{
tWandVertice *Temp;
if(Mesh==NULL) return;
Temp=Mesh->Vertice;
while(Temp!=NULL)
{
Temp->WorldPos=Temp->Pos;
Temp=Temp->Next;
}
CalcNormalsBasedOnPolys(Mesh);
CalcEnv(Mesh);
}
void SetList(tMeshList *List)
{
if(List==NULL) return;
SetMesh(List->Mesh);
SetList(List->Next);
}
void SetSkelList(tSkelList *List)
{
if(List==NULL) return;
SetList(List->Node->MeshList);
SetSkelList(List->Next);
}
void SetSectorList(tSector *List)
{
if(List==NULL) return;
List->ModPos=vNull;
CalcEnv(List->Mesh);
SetSectorList(List->SubSector);
SetSectorList(List->Next);
}
#ifdef TCMMemoryLoading
BOOL LoadTCMTexture(unsigned int *texPntr, unsigned char* Addr)
{
BOOL success = FALSE;
AUX_RGBImageRec *TextureImage = NULL;
glGenTextures(1, texPntr); // Generate 1 texture
FILE* test=NULL;
TextureImage = NULL;
LoadToLoadedImage(Addr);
{ // if it loaded
success = TRUE;
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, *texPntr);
if(texPntr==&textures[3].texID)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
} else {
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, LoadedImage->XSize, LoadedImage->YSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, LoadedImage->Data);
glTexImage2D(GL_TEXTURE_2D, 0, 4,LoadedImage->XSize, LoadedImage->YSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, LoadedImage->Data);
}
DoneWithLoadedImage();
return success;
}
#else
BOOL LoadTCMTexture(unsigned int *texPntr, char* name)
{
BOOL success = FALSE;
AUX_RGBImageRec *TextureImage = NULL;
glGenTextures(1, texPntr); // Generate 1 texture
FILE* test=NULL;
TextureImage = NULL;
LoadToLoadedImage(name);
{ // if it loaded
success = TRUE;
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, *texPntr);
if(texPntr==&textures[3].texID)
{
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
} else {
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 4, LoadedImage->XSize, LoadedImage->YSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, LoadedImage->Data);
}
DoneWithLoadedImage();
return success;
}
#endif
GLvoid BuildFont(char *Name) // Build Our Bitmap Font
{
HFONT font; // Windows Font ID
HFONT oldfont; // Used For Good House Keeping
base = glGenLists(96); // Storage For 96 Characters
font = CreateFont( -24, // Height Of Font
0, // Width Of Font
0, // Angle Of Escapement
0, // Orientation Angle
FW_BOLD, // Font Weight
FALSE, // Italic
FALSE, // Underline
FALSE, // Strikeout
ANSI_CHARSET, // Character Set Identifier
OUT_TT_PRECIS, // Output Precision
CLIP_DEFAULT_PRECIS, // Clipping Precision
ANTIALIASED_QUALITY, // Output Quality
FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch
Name); // Font Name
oldfont = (HFONT)SelectObject(hDC, font); // Selects The Font We Want
wglUseFontBitmaps(hDC, 32, 96, base); // Builds 96 Characters Starting At Character 32
SelectObject(hDC, oldfont); // Selects The Font We Want
DeleteObject(font); // Delete The Font
}
/*
GLvoid KillFont(GLvoid) // Delete The Font List
{
glDeleteLists(base, 96); // Delete All 96 Characters
}
*/
GLvoid glPrint(GLint x, GLint y,const char *fmt, ...) // Custom GL "Print" Routine
{
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments
glRasterPos2f(x,y);
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
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -