00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "CreditsManager.hpp"
00020 #include "Singletons.hpp"
00021 #include "MathFuncs.hpp"
00022
00023 #include <cmath>
00024 #include <libintl.h>
00025 #define _(string) gettext(string)
00026
00027 CCreditsManager::CCreditsManager()
00028 : m_BitMapFont(NULL),
00029 m_CurName(0)
00030 {}
00031
00032 CCreditsManager::~CCreditsManager()
00033 {
00034 CleanUp();
00035 }
00036
00037 void CCreditsManager::CleanUp()
00038 {
00039 for(std::size_t CurAsteroid = 0; CurAsteroid < m_Asteroids.size(); CurAsteroid++)
00040 {
00041 delete m_Asteroids[CurAsteroid];
00042 }
00043 m_Asteroids.clear();
00044 }
00045
00046 void CCreditsManager::Init(CBitmapFont* BitMapFont)
00047 {
00048 CleanUp();
00049
00050 m_BitMapFont = BitMapFont;
00051
00052 m_PlayerShip.Init("data/ships/Credits.txt");
00053 m_PlayerShip.SetPosition(SCREEN_X_SIZE/2,SCREEN_Y_SIZE + 100);
00054
00055 AddAsteroid(_("Programming:"),50);
00056 AddAsteroid("Steffen Nörtershäuser",110);
00057 AddAsteroid("Christoph Egger",190);
00058
00059 AddAsteroid(_("Graphics:"),650);
00060 AddAsteroid("Fabian Wächter",710);
00061 AddAsteroid("Steffen Nörtershäuser",830);
00062 AddAsteroid("Christoph Egger",910);
00063 AddAsteroid("Mats Witte",990);
00064 AddAsteroid("Lauritz Beck",1070);
00065 AddAsteroid("James Hastings-Trew",1150);
00066 AddAsteroid("http://planetpixelemporium.com/",1230);
00067
00068 AddAsteroid(_("Music:"),1850);
00069 AddAsteroid("Devin Anderson",1930);
00070 AddAsteroid("http://www.devinanderson.com/",2010);
00071
00072 AddAsteroid(_("Betatesting:"),2710);
00073 AddAsteroid("Michael Stiebert",2790);
00074 }
00075
00076 void CCreditsManager::Draw()
00077 {
00078 if(m_BitMapFont == NULL)
00079 {
00080 return;
00081 }
00082
00083 m_PlayerShip.Draw();
00084
00085 for(std::size_t CurAsteroid = 0; CurAsteroid < m_Asteroids.size(); CurAsteroid++)
00086 {
00087 if(m_Asteroids[CurAsteroid]->Ship.IsDead() == false)
00088 {
00089 m_Asteroids[CurAsteroid]->LastSizeUpdate = sgl::get_clock().GetElapsedTime()*1000;
00090 m_Asteroids[CurAsteroid]->Ship.MoveY(1);
00091
00092 if(m_Asteroids[CurAsteroid]->Ship.GetYPosition() > CREDITS_Y_DAMAGE)
00093 {
00094 m_Asteroids[CurAsteroid]->Ship.SetInvulnerable(false);
00095 }
00096
00097 m_PlayerShip.CheckCollision(&m_Asteroids[CurAsteroid]->Ship);
00098 }
00099 else
00100 {
00101 if(sgl::get_clock().GetElapsedTime()*1000 - m_Asteroids[CurAsteroid]->LastSizeUpdate > CREDITS_SIZE_UPDATE_SPEED)
00102 {
00103 m_Asteroids[CurAsteroid]->TextSize++;
00104 if(m_Asteroids[CurAsteroid]->TextSize > CREDITS_END_SIZE)
00105 {
00106 m_Asteroids[CurAsteroid]->TextSize = CREDITS_END_SIZE;
00107 }
00108
00109 m_Asteroids[CurAsteroid]->LastSizeUpdate = sgl::get_clock().GetElapsedTime()*1000;
00110 }
00111 }
00112 m_Asteroids[CurAsteroid]->Ship.Draw();
00113 }
00114
00115 for(std::size_t CurAsteroid = 0; CurAsteroid < m_Asteroids.size(); CurAsteroid++)
00116 {
00117 if(m_Asteroids[CurAsteroid]->Ship.IsDead() == false)
00118 {
00119 continue;
00120 }
00121
00122 float Alpha = 255;
00123 Alpha = 1.0f - (sgl::get_clock().GetElapsedTime()*1000 - m_Asteroids[CurAsteroid]->Ship.GetDeadTime()) / CREDITS_FADE_OUT_TIME;
00124 Alpha *= 255;
00125
00126 if(Alpha < 0.0f)
00127 {
00128 delete m_Asteroids[CurAsteroid];
00129 m_Asteroids.erase(m_Asteroids.begin() + CurAsteroid);
00130 continue;
00131 }
00132
00133 m_BitMapFont->DrawText(m_Asteroids[CurAsteroid]->Ship.GetXPosition(),m_Asteroids[CurAsteroid]->Ship.GetYPosition(),
00134 m_Asteroids[CurAsteroid]->Name,m_Asteroids[CurAsteroid]->TextSize, 10000.0f, 10000.0f, 0,
00135 NULL, Alpha, true);
00136 }
00137
00138 if(m_PlayerShip.GetYPosition() > SCREEN_Y_SIZE - 100)
00139 {
00140 m_PlayerShip.MoveY(-1);
00141 }
00142
00143 if(m_Asteroids.size() == 0)
00144 {
00145 return;
00146 }
00147
00148 int Index = -1;
00149 for(std::size_t CurAsteroid = 0; CurAsteroid < m_Asteroids.size(); CurAsteroid++)
00150 {
00151 if(m_Asteroids[CurAsteroid]->Ship.IsDead() == false && m_Asteroids[CurAsteroid]->Ship.GetYPosition() > -50)
00152 {
00153 Index = CurAsteroid;
00154 break;
00155 }
00156 }
00157
00158 if(Index == -1)
00159 {
00160 return;
00161 }
00162
00163 if (m_Asteroids[Index]->Ship.GetXPosition() > m_PlayerShip.GetXPosition() + m_PlayerShip.GetCollisionSystemWidth()/2)
00164 {
00165 m_PlayerShip.MoveX(1);
00166 }
00167 else if(m_Asteroids[Index]->Ship.GetXPosition() < m_PlayerShip.GetXPosition() - m_PlayerShip.GetCollisionSystemWidth()/2)
00168 {
00169 m_PlayerShip.MoveX(-1);
00170 }
00171 else
00172 {
00173 m_PlayerShip.Shoot();
00174 }
00175 }
00176
00177 void CCreditsManager::AddAsteroid(std::string Name, int YOff)
00178 {
00179 int X = 0;
00180 int Y = -(rand() % 50 + YOff);
00181 if(m_Asteroids.size() == 0)
00182 {
00183 X = SCREEN_X_SIZE / 2 - frnd(-50,50);
00184 }
00185 else
00186 {
00187 int OldX = m_Asteroids[m_Asteroids.size() - 1]->Ship.GetXPosition();
00188
00189 if(OldX - CREDITS_SPACE_X < CREDITS_SPACE_SIDE)
00190 {
00191 X = frnd(OldX + CREDITS_SPACE_X, SCREEN_X_SIZE - CREDITS_SPACE_SIDE);
00192 }
00193 else if(OldX + CREDITS_SPACE_X > SCREEN_X_SIZE - CREDITS_SPACE_SIDE)
00194 {
00195 X = frnd(CREDITS_SPACE_SIDE, OldX - CREDITS_SPACE_X);
00196 }
00197 else
00198 {
00199 float Side = 0;
00200 float YWeigth = 0.0f;
00201 for(int CurAsteroid = 0; CurAsteroid < m_Asteroids.size() - 1; CurAsteroid++)
00202 {
00203 YWeigth = std::fabs(m_Asteroids[CurAsteroid]->Ship.GetYPosition() - Y) / CREDITS_Y_INFLUENCE;
00204 if(YWeigth > 1.0f)
00205 {
00206 continue;
00207 }
00208 YWeigth = 1.0f - YWeigth;
00209
00210 if(m_Asteroids[CurAsteroid]->Ship.GetXPosition() > OldX)
00211 {
00212 Side += YWeigth;
00213 }
00214 else
00215 {
00216 Side -= YWeigth;
00217 }
00218 }
00219
00220 if(Side > 0)
00221 {
00222 X = frnd(CREDITS_SPACE_SIDE, OldX - CREDITS_SPACE_X);
00223 }
00224 else
00225 {
00226 X = frnd(OldX + CREDITS_SPACE_X, SCREEN_X_SIZE - CREDITS_SPACE_SIDE);
00227 }
00228 }
00229 }
00230
00231
00232 CreditsAsteroid* Asteroid = new CreditsAsteroid;
00233 Asteroid->Ship.Init("data/ships/CreditsAsteroid.txt");
00234 Asteroid->Ship.SetPosition(X, Y);
00235 Asteroid->Ship.SetInvulnerable(true);
00236 Asteroid->Name = Name;
00237 Asteroid->TextSize = CREDITS_START_SIZE;
00238 Asteroid->LastSizeUpdate = sgl::get_clock().GetElapsedTime()*1000;
00239
00240 m_Asteroids.push_back(Asteroid);
00241 }