📄 invasion.cpp
字号:
glPrint(400, y, byTemp, 0);
sprintf(byTemp, "%d", Highscore[i].iScore);
glPrint(500, y, byTemp, 0);
}
}
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
float fTemp;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
if(bProgramStart)
{
SwapBuffers(hDC);
return 0;
}
glDisable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glLoadIdentity(); // Reset The Current Modelview Matrix
// Draw the background:
glColor4ub(255,255,255,128);
glTranslatef(0.0f, 0.0f, -30.0f);
glMatrixMode(GL_TEXTURE_2D);
glRotatef(180.0f*float(cos(g_fBackgroundRot/10.0f)),0.0f,0.0f,1.0f);
glTranslatef((3.0f*float(cos(g_fBackgroundRot)))+(2.1f*float(sin(g_fBackgroundRot*1.4f))),(2.8f*float(sin(g_fBackgroundRot)))+(1.3f*float(sin(g_fBackgroundRot*1.4f))),0.0f);
glRotatef(10.0f*float(sin(g_fBackgroundRot*1.2f)),1.0f,0.0f,0.0f);
glMatrixMode(GL_MODELVIEW);
glCallList(background_list);
glEnable(GL_CULL_FACE);
glColor4f(1.0f,1.0f,1.0f, 1.0f);
glScalef(fPlanetZScale, fPlanetZScale, fPlanetZScale);
glEnable(GL_DEPTH_TEST);
glDisable(GL_TEXTURE_2D);
pPlanet->pChild[1]->Draw(FALSE, FALSE, FALSE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glColor4f(1.0f,1.0f,1.0f, 0.3f);
glBindTexture(GL_TEXTURE_2D, GameTexture[5].iOpenGLID);
pPlanet->pChild[1]->Draw(FALSE, TRUE, FALSE);
glDisable(GL_BLEND);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
if(pPlayer.byLives == -1 || pPlayer.byLives == 0 || pPlayer.byLives == 1)
pPlanet->pChild[2]->Draw(FALSE, TRUE, FALSE);
if(pPlayer.byLives == -1 || pPlayer.byLives == 0)
pPlanet->pChild[3]->Draw(FALSE, TRUE, FALSE);
glClear(GL_DEPTH_BUFFER_BIT);
//
if(!bGameIntro)
{ // We Are In The Game
glEnable(GL_DEPTH_TEST);
/////////////////////////////////////////////////////////////////
// Dislay The View Data
/* sprintf(byTemp, "XRos: %f", fXRot);
glPrint(320, 100, byTemp, 0);
sprintf(byTemp, "ZPos: %f", fZPos);
glPrint(320, 130, byTemp, 0);
sprintf(byTemp, "PlayerYPos: %f", pPlayer.fPos[Y]);
glPrint(320, 160, byTemp, 0);*/
/////////////////////////////////////////////////////////////////
glEnableLighting();
ActivateShotLights();
// Outlines
glLoadIdentity();
glTranslatef(-pPlayer.fPos[X], pPlayer.fPos[Y], fZPos);
glRotatef(fXRot, 1.0f, 0.0f, 0.0f);
glPushMatrix();
glLineWidth(3.f);
glColor3f(1.0f, 1.0f, 1.0f);
glColor4f(1.0f, 1.0f, 1.0f, 0.8f);
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, SPACE_HEIGHT, 0.0f);
glVertex3f(SPACE_WIDTH, 0.0f, 0.0f);
glVertex3f(SPACE_WIDTH, SPACE_HEIGHT, 0.0f);
glEnd();
// Draw Actors
glDisable(GL_BLEND);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
DrawShot(); // Draw The Shots
DrawAlien(); // Draw The Aliens
if(pPlayer.bShield)
{
glEnable(GL_BLEND);
glColor4f(0.0f, 0.0f, 1.0f, 0.95f);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
}
DrawPlayer(); // Draw The Player
glPopMatrix();
// Wormhole
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
fTemp = fWormholeHitPoints/100;
glColor4f(1.0f-fTemp, fTemp, fTemp, 0.8f);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBindTexture(GL_TEXTURE_2D, GameTexture[byWormholeAni[byWormholeAniStep]].iOpenGLID);
glDepthMask(FALSE);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glBegin(GL_QUADS);
// Left bottom
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(0.0f, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 40.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(0.0f, SPACE_HEIGHT, 40.0f);
// Right bottom
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(SPACE_WIDTH, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(SPACE_WIDTH, SPACE_HEIGHT, 40.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 40.0f);
// Left Top
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(0.0f, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(0.0f, SPACE_HEIGHT, -40.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, -40.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 0.0f);
// Right Top
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, 0.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(SPACE_WIDTH/2, SPACE_HEIGHT, -40.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(SPACE_WIDTH, SPACE_HEIGHT, -40.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(SPACE_WIDTH, SPACE_HEIGHT, 0.0f);
glEnd();
glEnable(GL_CULL_FACE);
glDepthMask(TRUE);
// Show The Players Lives
glEnable(GL_BLEND);
glColor3f(0.0f, 0.0f, 1.0f);
glColor4f(0.0f, 0.0f, 1.0f, 0.95f);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
if(pPlayer.byLives != -1)
{
glBindTexture(GL_TEXTURE_2D, GameTexture[6].iOpenGLID);
glLoadIdentity();
glTranslatef(-45.0f, 35.0f, -100.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pShip->pChild[0]->Draw(TRUE, TRUE, FALSE);
// Display Players Power:
glLoadIdentity();
glTranslatef(7.0f, 5.0f, -15.0f);
glRotatef(90, 0.0f, 1.0f, 0.0f);
glRotatef(45, 1.0f, 0.0f, 0.0f);
glRotatef(45, 0.0f, 0.0f, 1.0f);
glScalef(pPlayer.fPower/pPlayer.fMaxPower, pPlayer.fPower/pPlayer.fMaxPower, pPlayer.fPower/pPlayer.fMaxPower);
pPower->Draw(TRUE, FALSE, FALSE);
glDisable(GL_BLEND);
}
DrawObjects(); // Draw The Objects
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glEnable(GL_BLEND);
// Draw Texts
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_TEXTURE_2D);
glColor4f(1.0f,1.0f,1.0f, 0.8f);
// Display The Level Name
glPrint(10, 465, pLevel->byName, 0);
if(pPlayer.byLives != -1)
{
// Show player lives:
sprintf(byTemp, "* %d", pPlayer.byLives);
glPrint(130, 430, byTemp, 0);
// Display Players Power
sprintf(byTemp, "P: %.3f", pPlayer.fPower);
glPrint(520, 420, byTemp, 0);
// Display highscore
sprintf(byTemp, "%d", iScore);
glPrint(400, 10, byTemp, 0);
}
if(Config.bShowFPS)
{
// Display FPS
sprintf(byTemp, "FPS: %d", g_iFps);
glPrint(0, 10, byTemp, 0);
}
// Draw The Highscore
if(bPlayerEnteringHighScore)
DrawPlayersHighscore();
}
else
{ // We Are In The Game Intro
// Wormhole
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -2.5f);
glEnable(GL_TEXTURE_2D);
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[byWormholeAni[byWormholeAniStep]].iOpenGLID);
glDepthMask(FALSE);
glBegin(GL_QUADS);
// Left bottom
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(-1.0f, 0.0f, 0.0f);
// Right bottom
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(0.0f, -1.0f, 0.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(0.0f, 0.0f, 0.0f);
// Left Top
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(0.0f, 1.0f, 0.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(-1.0f, 1.0f, 0.0f);
// Right Top
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.99f, 0.99f); glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f); glVertex3f(1.0f, 0.0f, 0.0f);
glTexCoord2f(0.01f, 0.01f); glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.99f, 0.01f); glVertex3f(0.0f, 1.0f, 0.0f);
glEnd();
// Draw Title
glLoadIdentity();
glTranslatef(0.0f, 1.0f, -6.0f);
glBindTexture(GL_TEXTURE_2D, GameTexture[13].iOpenGLID);
glBegin(GL_QUADS);
glTexCoord2f(0.01f, 0.01f);
glVertex3f(-3.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.01f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f);
glVertex3f(-3.0f, 1.0f, 0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, GameTexture[14].iOpenGLID);
glBegin(GL_QUADS);
glTexCoord2f(0.01f, 0.01f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.01f);
glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f);
glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f);
glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, GameTexture[15].iOpenGLID);
glBegin(GL_QUADS);
glTexCoord2f(0.01f, 0.01f);
glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.01f);
glVertex3f(3.0f, -1.0f, 0.0f);
glTexCoord2f(0.99f, 0.99f);
glVertex3f(3.0f, 1.0f, 0.0f);
glTexCoord2f(0.01f, 0.99f);
glVertex3f(1.0f, 1.0f, 0.0f);
glEnd();
glDepthMask(TRUE);
// Draw Some Objects On The Screen
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
if(LEVELS == EASTER_EGG_LEVELS)
{
glDisable(GL_TEXTURE_2D);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -20.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pAlien5->Draw(TRUE, FALSE, FALSE);
glEnable(GL_TEXTURE_2D);
}
else
{
glBindTexture(GL_TEXTURE_2D, GameTexture[5].iOpenGLID);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
glLoadIdentity();
glTranslatef(-30.0f, 20.0f, -70.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pAlien1->Draw(TRUE, TRUE, FALSE);
glLoadIdentity();
glTranslatef(30.0f, 20.0f, -70.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pAlien2->Draw(TRUE, TRUE, FALSE);
glLoadIdentity();
glTranslatef(-30.0f, 0.0f, -70.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pAlien3->Draw(TRUE, TRUE, FALSE);
glLoadIdentity();
glTranslatef(30.0f, 0.0f, -70.0f);
glRotatef(fRot[X], 1.0f, 0.0f, 0.0f);
glRotatef(fRot[Y], 0.0f, 1.0f, 0.0f);
glRotatef(fRot[Z], 0.0f, 0.0f, 1.0f);
pAlien4->Draw(TRUE, TRUE, FALSE);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
// Draw Texts
glEnable(GL_BLEND);
if(bShowHighscore)
DrawPlayersHighscore();
glColor4f(1.0f, 1.0f, 1.0f, 0.95f);
if(bAnyKeyMessage)
glPrint(200, 450, "Press Any Key To Start", 0);
else
if(LEVELS == EASTER_EGG_LEVELS)
glPrint(220, 420, "Or Any Moorhuhn", 0);
// Credits
glColor4f(0.7f, 0.7f, 0.7f, 0.95f);
glPrint(5, 50, "Invasion is a AblazeSpace project (www.ablazespace.de)", 0);
glPrint(130, 40, "Programmed & Designed by Christian Ofenberg", 0);
glPrint(170, 30, "Music by Mike Spang", 0);
glPrint(10, 20, "Thank's to NeHe (nehe.gamedev.net)", 0);
glPrint(150, 10, "and the Blender (www.blender.nl) crew", 0);
}
SwapBuffers(hDC); // Swap Buffers (Double Buffering)
DeactivateShotLights();
return TRUE; // Everything Went OK
}
GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
{
ASStopMidi();
DestroySounds();
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
if (Config.bFullScreen) // Are We In Fullscreen Mode?
{
ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop
ShowMouseCursor(TRUE); // Show Mouse Pointer
}
KillFont(); // Kill The Font
DestroyGLTextures();
glDeleteLists(background_list, NUM_LISTS);
if (hRC) // Do We Have A Rendering Context?
{
if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?
{
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
{
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
}
hRC=NULL; // Set RC To NULL
}
if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC
{
MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hDC=NULL; // Set DC To NULL
}
if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?
{
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hWnd=NULL; // Set hWnd To NULL
}
if (!UnregisterClass("OpenGL",hInstance)) // Are We Able To Unregister Class
{
MessageBox(NULL,"Could Not Unregister Class.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hInstance=NULL; // Set hInstance To NULL
}
}
/* This Code Creates Our OpenGL Window. Parameters Are: *
* title - Title To Appear At The Top Of The Window *
* width - Width Of The GL Window Or Fullscreen Mode *
* height - Height Of The GL Window Or Fullscreen Mode *
* bits - Number Of Bits To Use For Color (8/16/24/32) *
* fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
BOOL CreateGLWindow(char* title, int width, int height, int bits, BOOL *fullscreen)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -