⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 一个96K的3D游戏源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -