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

📄 invasion.cpp

📁 类似小蜜蜂的游戏,但是已经3D化了,斑竹给我开通吧,我已经上传了5个了.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		glBegin(GL_QUADS); 
			glNormal3f( 0.0f, 0.0f, 1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.0f       , 0.0f        , 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.0f       ,-WORLD_HEIGHT * 1.4f, 0.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f( WORLD_WIDTH,-WORLD_HEIGHT * 1.4f, 0.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f( WORLD_WIDTH, 0.0f        , 0.0f);
		glEnd();

		// Lower Left
		glBindTexture(GL_TEXTURE_2D, GameTexture[4].iOpenGLID);
		glBegin(GL_QUADS); 
			glNormal3f( 0.0f, 0.0f, 1.0f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-WORLD_WIDTH, 0.0f        , 0.0f);
			glTexCoord2f(0.0f, 0.0f); glVertex3f(-WORLD_WIDTH,-WORLD_HEIGHT * 1.4f, 0.0f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.0f       ,-WORLD_HEIGHT * 1.4f, 0.0f);
			glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.0f       , 0.0f        , 0.0f);
		glEnd();
		
	glEndList();
}

int InitGL(GLvoid)										// All Setup For OpenGL Goes Here
{
	if (!LoadGLTextures())								// Jump To Texture Loading Routine
		return FALSE;									// If Texture Didn't Load Return FALSE
	BuildFont();										// Build The Font
	CreateLists();										// Create All Required Display Lists
	switch(_ASConfig->byLight)
	{
		case 1:
			glShadeModel(GL_FLAT);					    // Enable Smooth Shading
		break;

		case 2:
			glShadeModel(GL_SMOOTH);					// Enable Smooth Shading
		break;
	}
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);				// Black Background
	glClearDepth(1.0f);									// Depth Buffer Setup
	glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
	glColor4f(1.0f, 1.0f, 1.0f, 1.0);
	
	
	
	
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glPolygonMode(GL_FRONT, GL_FILL);
	glPolygonMode(GL_BACK, GL_FILL);
	glDepthFunc(GL_LESS);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
	glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST);
	glHint(GL_FOG_HINT, GL_FASTEST);
	glHint(GL_POINT_SMOOTH_HINT, GL_FASTEST);
	glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
	glEnable(GL_CULL_FACE);
	glCullFace(GL_BACK);		
	glColor3f(1.0f, 1.0f, 1.0f);
	glColor4f(1.0f, 1.0f, 1.0f, 1.0);
	glEnable(GL_COLOR_MATERIAL);
	glEnable(GL_COLOR_MATERIAL_FACE);
	glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
	glMateriali(GL_FRONT,GL_SHININESS,128);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE);					// Set The Blending Function For Translucency
	glEnable(GL_TEXTURE_2D);

	glEnable(GL_COLOR_MATERIAL);
	glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
	glMateriali(GL_FRONT,GL_SHININESS,128);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
	
	glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);		// Setup The Ambient Light
	glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);		// Setup The Diffuse Light
	glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);	// Position The Light
	glEnable(GL_LIGHT1);								// Enable Light One
	glDepthFunc(GL_LEQUAL);								// The Type Of Depth Test To Do
	glBlendFunc(GL_SRC_ALPHA,GL_ONE);					// Select The Type Of Blending

	glEnableClientState(GL_COLOR_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	return TRUE;										// Initialization Went OK
}

void DrawExplosion(short iExplosionStep)
{
	short x, y;
	float fX, fY;
	GLboolean bS, bT;

	glGetBooleanv(GL_TEXTURE_GEN_S, &bS);
	glGetBooleanv(GL_TEXTURE_GEN_T, &bT);
	glDisable(GL_TEXTURE_GEN_S);
	glDisable(GL_TEXTURE_GEN_T);
	glDepthMask(FALSE);
	y = (short) iExplosionStep/4;
	x = iExplosionStep-y*4;
	fX = (float) 64*x/256;
	fY = (float) 64*y/256;
	glEnable(GL_BLEND);
	glColor4f(1.0f, 1.0f, 1.0f, 0.8f);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
	glBindTexture(GL_TEXTURE_2D, GameTexture[12].iOpenGLID);
	glBegin(GL_QUADS);
		glTexCoord2f(fX, fY);
		glVertex3i(-5, -5, 0);
		glTexCoord2f(fX+0.25f, fY);
		glVertex3i(5, -5, 0);
		glTexCoord2f(fX+0.25f, fY+0.25f);
		glVertex3i(5, 5, 0);
		glTexCoord2f(fX, fY+0.25f);
		glVertex3i(-5, 5, 0);

		glTexCoord2f(fX, fY);
		glVertex3i(-5, 0, -5);
		glTexCoord2f(fX+0.25f, fY);
		glVertex3i(5, 0, -5);
		glTexCoord2f(fX+0.25f, fY+0.25f);
		glVertex3i(5, 0, 5);
		glTexCoord2f(fX, fY+0.25f);
		glVertex3i(-5, 0, 5);
	glEnd();
	glDepthMask(TRUE);
	if(bS)
		glEnable(GL_TEXTURE_GEN_S);
	if(bT)
		glEnable(GL_TEXTURE_GEN_T);
}

void DrawShot(void)
{
	AS_OBJECT *pObject;
	ACTOR *pActor;
	short i;

	glEnable(GL_BLEND);
	glColor4f(1.0f, 1.0f, 1.0f, 0.8f);
	for(i = 0; i < MAX_SHOTS; i++)
	{
		pActor = &pShot[i];
		if(!pActor->bActive)
			continue;
		glLoadIdentity();									// Reset The Current Modelview Matrix
		glTranslatef(-pPlayer.fPos[X], pPlayer.fPos[Y], fZPos);
		glRotatef(fXRot, 1.0f, 0.0f, 0.0f);
		glTranslatef(pActor->fPos[X], pActor->fPos[Y], 0.0f);
		switch(pActor->iType)
		{
			case PLAYER_SHOT: pObject = pShot1; break;
			case ALIEN_SHOT: pObject = pShot2; break;
			case ALIEN_5_SHOT: pObject = pShot3; break;
			case WORMHOLE_SHOT: pObject = pWormholeShot; break;
		}
		glMultMatrixf(pObject->Matrix[0]);
		pObject->Draw(TRUE, FALSE, Config.bDrawBounding);
		pActor->pFrameT = pObject->pChild[0]->pAnimationT->pStepT->pFrame;
	}
	glDisable(GL_BLEND);
}

void DrawAlien(void)
{
	AS_OBJECT *pObject;
	ACTOR *pActor;
	short i;

	for(i = 0; i < MAX_ALIENS; i++)
	{
		pActor = &pAlien[i];
		if(!pActor->bActive)
			continue;
		glLoadIdentity();									// Reset The Current Modelview Matrix
		glTranslatef(-pPlayer.fPos[X], pPlayer.fPos[Y], fZPos);
		glRotatef(fXRot, 1.0f, 0.0f, 0.0f);
		glTranslatef(pActor->fPos[X]+pActor->fPos2[X], pActor->fPos[Y]+pActor->fPos2[Y], 0.0f);
		if(pActor->iExplosionStep != -1)
		{
			glPushMatrix();
			glTranslatef(0.0f, 0.0f, -8.0f);
			DrawExplosion(pActor->iExplosionStep);
			glDisable(GL_BLEND);
			glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
			glPopMatrix();
			if(pActor->iExplosionStep > 8)
				continue;
		}
		if(pActor->iType != WALL)
			glBindTexture(GL_TEXTURE_2D, GameTexture[5].iOpenGLID);
		else
			glBindTexture(GL_TEXTURE_2D, GameTexture[6].iOpenGLID);
		switch(pActor->iType)
		{
			case ALIEN_1: pObject = pAlien1; break;
			case ALIEN_2: pObject = pAlien2; break;
			case ALIEN_3: pObject = pAlien3; break;
			case ALIEN_4: pObject = pAlien4; break;
			case ALIEN_5: pObject = pAlien5; break;			
			case BIG_BOSS: pObject = pBigBoss; break;			
			case WALL: pObject = pWall; break;
		}
		glMultMatrixf(pObject->Matrix[0]);
		glRotatef(pActor->fRot[X], 1.0f, 0.0f, 0.0f);
		glRotatef(pActor->fRot[Y], 0.0f, 1.0f, 0.0f);
		glRotatef(pActor->fRot[Z], 0.0f, 0.0f, 1.0f);
		pObject->SetAnimationT(pActor->iAnimationT);
		pObject->SetAnimationStepT(pActor->iStepT);
		pObject->pChild[0]->dwLastTime = pActor->dwLastTime;
		if(pActor->iType == ALIEN_5)
			pObject->Draw(TRUE, FALSE, Config.bDrawBounding);
		else
			pObject->Draw(TRUE, TRUE, Config.bDrawBounding);
		pActor->dwLastTime = pObject->pChild[0]->dwLastTime;
		pActor->iStepT = pObject->pChild[0]->pAnimationT->pStepT->iID;
		pActor->pFrameT = pObject->pChild[0]->pAnimationT->pStepT->pFrame;
	}
}

void DrawPlayer(void)
{
	if(!pPlayer.bActive)
		return;
	glLoadIdentity();									// Reset The Current Modelview Matrix
	glTranslatef(0.0f, pPlayer.fPos[Y], fZPos);
	glRotatef(fXRot, 1.0f, 0.0f, 0.0f);
	glMultMatrixf(pShip->Matrix[0]);
	glRotatef(pPlayer.fRot[X], 1.0f, 0.0f, 0.0f);
	glRotatef(pPlayer.fRot[Y], 0.0f, 1.0f, 0.0f);
	glRotatef(pPlayer.fRot[Z], 0.0f, 0.0f, 1.0f);
	if(pPlayer.iExplosionStep != -1)
	{
		glPushMatrix();
		DrawExplosion(pPlayer.iExplosionStep);
		glDisable(GL_BLEND);
		glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
		glPopMatrix();
		if(pPlayer.iExplosionStep > 8)
			return;
	}
	glBindTexture(GL_TEXTURE_2D, GameTexture[6].iOpenGLID);
	pShip->pChild[0]->Draw(TRUE, TRUE, Config.bDrawBounding);
	if(byPlayerWeapon == DOUBLE_LASER_WEAPON)
		pShip->pChild[1]->Draw(TRUE, TRUE, Config.bDrawBounding);
	pPlayer.pFrameT = pShip->pChild[0]->pAnimationT->pStepT->pFrame;
}

void ActivateShotLights(void)
{
	short i, iLightCounter = 1;
	GLfloat afLightData[4]  = {0.0f, 0.0f, 0.0f, 0.0f};
	ACTOR *pActor;

	if(!_ASConfig->byLight)
		return;
	if(pPlayer.bShield)	
	{
		afLightData[0] = pPlayer.fPos[X];
		afLightData[1] = pPlayer.fPos[Y];
		afLightData[2] = pPlayer.fPos[Z]+5.0f;
		afLightData[3] = 1.0f;
		glLightfv(GL_LIGHT2+iLightCounter, GL_POSITION, afLightData);
		afLightData[0] = 0.0f;
		afLightData[1] = 0.0f;
		afLightData[2] = 1.0f;
		glLightfv(GL_LIGHT2+iLightCounter, GL_DIFFUSE, afLightData);
		glEnable(GL_LIGHT2+iLightCounter);
		iLightCounter++;
	}
	for(i = 0; i < MAX_SHOTS; i++)
	{
		pActor = &pShot[i];
		if(!pActor->bActive)
			continue;
		if(iMaxLights < iLightCounter-2)
			break;
		afLightData[0] = pActor->fPos[X];
		afLightData[1] = pActor->fPos[Y];
		afLightData[2] = pActor->fPos[Z]-10.0f;
		afLightData[3] = 1.0f;
		glLightfv(GL_LIGHT2+iLightCounter, GL_POSITION, afLightData);
		switch(pActor->iType)
		{
			case PLAYER_SHOT:
				afLightData[0] = 1.0f;
				afLightData[1] = 0.0f;
				afLightData[2] = 0.0f;
			break;

			case ALIEN_SHOT:
				afLightData[0] = 0.0f;
				afLightData[1] = 1.0f;
				afLightData[2] = 0.0f;
			break;
		}
		glLightfv(GL_LIGHT2+iLightCounter, GL_DIFFUSE, afLightData);
		glEnable(GL_LIGHT2+iLightCounter);
		iLightCounter++;
	}
}

void DeactivateShotLights(void)
{
	short i, iLightCounter = 1;

	if(!_ASConfig->byLight)
		return;
	for(i = 0; i < MAX_SHOTS; i++)
	{
		if(!pShot[i].bActive)
			continue;
		if(iMaxLights < iLightCounter-2)
			break;
		glDisable(GL_LIGHT2+iLightCounter);
		iLightCounter++;
	}
}

void DrawObjects(void)
{
	ACTOR *pActor;
	AS_OBJECT *pObjectT;
	short i;

	for(i = 0; i < MAX_OBJECTS; i++)
	{
		pActor = &pObject[i];
		if(!pActor->bActive)
			continue;
		glLoadIdentity();
		glTranslatef(-pPlayer.fPos[X], pPlayer.fPos[Y], fZPos);
		glRotatef(fXRot, 1.0f, 0.0f, 0.0f);
		glTranslatef(pActor->fPos[X], pActor->fPos[Y], 0.0f);
		switch(pActor->iType)
		{
			case OBJECT_LIVE: pObjectT = pObjectLive; break;
			case OBJECT_WALL: pObjectT = pObjectWall; break;
			case OBJECT_SINGLE_LASER_WEAPON: pObjectT = pObjectSingleLaser; break;
			case OBJECT_DOUBLE_LASER_WEAPON: pObjectT = pObjectDoubleLaser; break;
			case OBJECT_POWER_INCREASE: pObjectT = pObjectPowerIncrease; break;
		}
		glMultMatrixf(pObjectT->Matrix[0]);
		glRotatef(pActor->fRot[X], 1.0f, 0.0f, 0.0f);
		glRotatef(pActor->fRot[Y], 0.0f, 1.0f, 0.0f);
		glRotatef(pActor->fRot[Z], 0.0f, 0.0f, 1.0f);
		pObjectT->Draw(TRUE, TRUE, Config.bDrawBounding);
		pActor->pFrameT = pObjectT->pChild[0]->pAnimationT->pStepT->pFrame;
	}
}

void DrawPlayersHighscore(void)
{
	short i, y;

	glDisable(GL_LIGHTING);
	glEnable(GL_BLEND);
	glColor4ub(255,255,255,255);
	if(bGameWon)
	{
		glPrint(200, 420, "You Have Won The Game!", 1);
		if(LEVELS == NORMAL_LEVELS)
		{
			glPrint(110, 400, "Try to start the program whith the parameter", 1);
			glPrint(260, 380, "Moorhuhn", 1);
		}

	}
	if(!bPlayerEnteringHighScore)
		glPrint(270, 390, "Highscore", 1);
	else
	{ // The player enters or not his name into the highscore:
		if(byPlayersHScorePlace != -2)
		{
			glPrint(260, 300, "Congratulations!", 0);
			glPrint(220, 290, "You are in the highscore!", 0);
			glPrint(140, 280, "Enter your name and hit enter when done.", 0);
		}
		else // He's a looser:
		{
			glPrint(270, 300, "You looser!", 0);
			glPrint(180, 290, "You are not in the highscore!", 0);
			glPrint(270, 280, "Press enter.", 0);
		}
	}
	glPrint(50, 230, "Place", 0);
	glPrint(150, 230, "Name", 0);
	glPrint(400, 230, "Level", 0);
	glPrint(500, 230, "Score", 0);
	for(i = 0, y = 220; i < MAX_HIGHSCORES; i++, y -= 15)
	{
		if(byPlayersHScorePlace == i)
			glColor4f(1.0f, 1.0f, 1.0f, 0.9f);
		else
			glColor4f(0.6f, 0.6f, 0.6f, 0.9f);
		sprintf(byTemp, "%d.", i);
		glPrint(50, y, byTemp, 0);
		glPrint(150, y, Highscore[i].byName, 0);
		sprintf(byTemp, "%d", Highscore[i].iLevel);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -