/* ************************************************************************* * SDL-Ball - DX-Ball/Breakout remake with openGL and SDL for Linux Copyright (C) 2008 Jimmy Christensen ( dusted at dusted dot dk ) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . * ************************************************************************* */ class powerupDescriptionClass : public moving_object { public: powerupDescriptionClass(); textureClass *tex; void draw(); string name; string description; }; powerupDescriptionClass::powerupDescriptionClass() { width=0.055; height=0.055; } void powerupDescriptionClass::draw() { tex->play(); glBindTexture( GL_TEXTURE_2D, tex->prop.texture); glColor4f(tex->prop.glTexColorInfo[0],tex->prop.glTexColorInfo[1],tex->prop.glTexColorInfo[2],tex->prop.glTexColorInfo[3]); glBegin( GL_QUADS ); glTexCoord2f(tex->pos[0],tex->pos[1]);glVertex3f( -width+posx, height+posy, 0.00 ); // øverst venst glTexCoord2f(tex->pos[2],tex->pos[3]);glVertex3f( width+posx, height+posy, 0.00 ); // øverst højre glTexCoord2f(tex->pos[4],tex->pos[5]);glVertex3f( width+posx,-height+posy, 0.00 ); // nederst højre glTexCoord2f(tex->pos[6],tex->pos[7]);glVertex3f( -width+posx,-height+posy, 0.00 ); // nederst venstre glEnd( ); glColor4f(1.0, 1.0, 1.0, 1.0); //Write her glText->write(name, FONT_INTRODESCRIPTION, 0, 1.0, posx+width, posy+(glText->getHeight(FONT_INTRODESCRIPTION)/2.0)); glText->write(description, FONT_INTRODESCRIPTION, 0, 1.0, posx+width, posy-(glText->getHeight(FONT_INTRODESCRIPTION)/2.0)); } class titleScreenClass { private: effectManager *fxMan; int ticksSinceLastSpawn; textureManager texMgr; textureClass texTitle; textureClass *texPowerups; GLuint glTitleList; float rot; bool rotDir; powerupDescriptionClass powerUp[MAXPOTEXTURES]; int numHighScores; //Number of highscores to show in the intro struct pos runnerPos; menuClass *menu; //Here is the highscore text int runnerTime; float runnerVelX,runnerVelY; int hilight; bool hilightDir; int hilightTime; void readDescriptions(powerupDescriptionClass po[]); public: titleScreenClass(effectManager *m, textureClass tp[], menuClass *me); void draw(int * frameAge, int * maxFrameAge); }; titleScreenClass::titleScreenClass(effectManager *m, textureClass tp[], menuClass *me) { menu = me; numHighScores=7; texPowerups = tp; fxMan = m; ticksSinceLastSpawn=100; texMgr.load(useTheme("/gfx/title/title.png",setting.gfxTheme), texTitle); glTitleList = glGenLists(1); glNewList(glTitleList, GL_COMPILE); glBindTexture(GL_TEXTURE_2D, texTitle.prop.texture); glBegin( GL_QUADS ); for(int i=0; i < 32; i++) { glColor4f(1,1,1,0.1); glTexCoord2f(0.0, 0.0); glVertex3f(-1.2,1.15, 0.005*i ); glTexCoord2f(1.0, 0.0); glVertex3f( 1.2,1.15, 0.005*i ); glColor4f(0,0,1,0.00); glTexCoord2f(1.0, 1.0); glVertex3f( 1.2, 0.75, 0.005*i ); glTexCoord2f(0.0, 1.0); glVertex3f(-1.2, 0.75, 0.005*i ); } glEnd( ); glEndList(); for(int ii = 0; ii < 3; ii++) { for(int i=0; i < 7; i++) { powerUp[i+(7*ii)].tex = &texPowerups[i+(7*ii)]; powerUp[i+(7*ii)].posx = -1.5 + (0.8*ii); powerUp[i+(7*ii)].posy = -0.35 - (0.135*i); } } readDescriptions(powerUp); runnerPos.x=0.0; runnerPos.y=0.66; runnerVelX = rndflt(2,1)+2; runnerVelY = rndflt(2,1)+2; runnerTime=0; hilight=0; hilightDir=1; hilightTime=0; } int delta(int a, int b) { if(a >= b) { return(a-b); } else { return(b-a); } } void titleScreenClass::draw(int * frameAge, int * maxFrameAge) { pos p,s; if(*frameAge >= *maxFrameAge) { soundMan.play(); if(var.clearScreen) { glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); } glEnable(GL_TEXTURE_2D); ticksSinceLastSpawn +=globalTicksSinceLastDraw; if(ticksSinceLastSpawn > 125) { s.x = 3.25; s.y = 0.525; p.x = 0; p.y = 1; ticksSinceLastSpawn=0; fxMan->set(FX_VAR_TYPE, FX_PARTICLEFIELD); fxMan->set(FX_VAR_COLDET, 0); fxMan->set(FX_VAR_LIFE, 1500); fxMan->set(FX_VAR_NUM, 50); fxMan->set(FX_VAR_SIZE, 0.01f); fxMan->set(FX_VAR_SPEED, 0.0f); fxMan->set(FX_VAR_GRAVITY, 0.0f); fxMan->set(FX_VAR_RECTANGLE, s); fxMan->set(FX_VAR_COLOR, 1.0f, 1.0f, 1.0f); fxMan->spawn(p); } fxMan->draw(); int i; glLoadIdentity(); glTranslatef(0.0, 0.0, -3.0); for(i=0; i < MAXPOTEXTURES; i++) { powerUp[i].draw(); } runnerTime+=globalTicksSinceLastDraw; if(runnerTime>10) { fxMan->set(FX_VAR_TYPE, FX_SPARKS); fxMan->set(FX_VAR_COLDET,0); fxMan->set(FX_VAR_LIFE, 250); fxMan->set(FX_VAR_NUM, 2); fxMan->set(FX_VAR_SIZE, 0.09f); fxMan->set(FX_VAR_SPEED, 0.5f); fxMan->set(FX_VAR_GRAVITY, -0.4f); fxMan->set(FX_VAR_COLOR, 1.0f, 0.7f, 0.0f); fxMan->spawn(runnerPos); fxMan->set(FX_VAR_COLOR, 1.0f, 0.8f, 0.0f); fxMan->spawn(runnerPos); fxMan->set(FX_VAR_COLOR, 1.0f, 0.9f, 0.0f); fxMan->spawn(runnerPos); fxMan->set(FX_VAR_COLOR, 1.0f, 1.0f, 0.0f); fxMan->spawn(runnerPos); runnerPos.x += runnerVelX*(runnerTime/1000.0); runnerPos.y += runnerVelY*(runnerTime/1000.0); if(runnerPos.x > 1.64 && runnerVelX > 0) { runnerVelX *= -1; } if(runnerPos.x < -1.64 && runnerVelX < 0) { runnerVelX *= -1; } if(runnerPos.y > 1.24 && runnerVelY > 0) { runnerVelY *= -1; } if(runnerPos.y < -1.24 && runnerVelY < 0) { runnerVelY *= -1; } runnerTime=0; } hilightTime += globalTicksSinceLastDraw; if(hilightTime > 50) { if(hilightDir) { hilight++; if(hilight == numHighScores*3)//-1) { hilight= numHighScores-1; hilightDir=0; } } else { hilight--; if(hilight == -numHighScores*2) { hilightDir=1; hilight=0; } } hilightTime=0; } glTranslatef(0.0, 0.59, 0.0); float a; for(i=0; i < numHighScores; i++) { if((hilightDir && i < hilight+1) || (!hilightDir && i > hilight-1)) { a=1.0-((1.0/(float)(numHighScores*2))*(delta(hilight,i))); glColor4f(1,1,1,a); glText->write(menu->highScores[i], FONT_INTROHIGHSCORE, 1, 1.0, 0.0, 0.0); } glTranslatef(0.0,-glText->getHeight(FONT_INTROHIGHSCORE),0.0); } //Draw the info string with website and version glColor4f(1,1,0,1); glText->write("Visit http://sdl-ball.sf.net/ for info, help and updates!", FONT_INTROHIGHSCORE, 1, 1.0, 0,0); if(!rotDir) { rot += 0.01 * globalTicksSinceLastDraw; if(rot > 40) { rotDir=1; } } else { rot -= 0.01 * globalTicksSinceLastDraw; if(rot < -40) { rotDir=0; } } glLoadIdentity(); glTranslatef(0.0,0.0,-3.0); glRotatef(20, 1,0,0); glRotatef(rot, 0,1,0); glCallList(glTitleList); SDL_GL_SwapBuffers( ); globalTicksSinceLastDraw=0; globalMilliTicksSinceLastDraw=0; *frameAge = 0; } } void titleScreenClass::readDescriptions(powerupDescriptionClass po[]) { ifstream f; string line; int p=0; bool flip=0; f.open( useTheme("/powerupdescriptions.txt", setting.gfxTheme).data() ); if(f.is_open()) { while(!f.eof()) { getline(f, line); if(!flip) { flip=1; po[p].name=line; } else { flip=0; po[p].description=line; p++; } if(p == MAXPOTEXTURES) break; } f.close(); } else { cout << "Could not open powerupdescriptions"<