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