00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "Emiter.hpp"
00020 #include "Singletons.hpp"
00021 #include "MathFuncs.hpp"
00022
00023 CEmiter::CEmiter()
00024 : m_Active(true),
00025 m_FrameWidth(-1.0f),
00026 m_FrameHeight(-1.0f),
00027 m_FrameCount(1),
00028 m_FrameDelay(1000),
00029 m_X(0.0f),
00030 m_Y(0.0f),
00031 m_HalfXSize(0.0f),
00032 m_HalfYSize(0.0f),
00033 m_StartScaleX(1.0f),
00034 m_StartScaleY(1.0f),
00035 m_TargetScaleX(1.0f),
00036 m_TargetScaleY(1.0f),
00037 m_StartAlpha(255),
00038 m_EndAlpha(255),
00039 m_StartRed(255),
00040 m_EndRed(255),
00041 m_StartGreen(255),
00042 m_EndGreen(255),
00043 m_StartBlue(255),
00044 m_EndBlue(255),
00045 m_StartVelX(0.0f),
00046 m_EndVelX(0.0f),
00047 m_LowVelXMulti(1.0f),
00048 m_HighVelXMulti(1.0f),
00049 m_LowVelYMulti(1.0f),
00050 m_HighVelYMulti(1.0f)
00051 {}
00052
00053 CEmiter::~CEmiter()
00054 {
00055 for(std::size_t CurParticle = 0; CurParticle < m_Particels.size(); CurParticle++)
00056 {
00057 delete m_Particels[CurParticle];
00058 }
00059 m_Particels.clear();
00060 }
00061
00062 void CEmiter::Init(const std::string& TexName, float FrameWidth, float FrameHeight, int FrameCount)
00063 {
00064 m_TexName = TexName;
00065
00066 m_FrameWidth = FrameWidth;
00067 m_FrameHeight = FrameHeight;
00068 m_FrameCount = FrameCount;
00069 }
00070
00071 void CEmiter::InitFromFile(const std::string& FileName)
00072 {
00073 char strBuf[100];
00074 std::string HelpString;
00075 std::string OldString;
00076
00077
00078 FILE* EmiterFile = fopen(FileName.c_str(),"r");
00079 if(EmiterFile == NULL)
00080 {
00081 return;
00082 }
00083
00084 while(feof(EmiterFile) == 0)
00085 {
00086 fscanf(EmiterFile,"%s",strBuf);
00087 HelpString = strBuf;
00088
00089 if(HelpString == "=")
00090 {
00091 if(OldString == "Image")
00092 {
00093 fscanf(EmiterFile,"%s",strBuf);
00094 m_TexName = strBuf;
00095 }
00096 else if(OldString == "FrameWidth")
00097 {
00098 fscanf(EmiterFile,"%f",&m_FrameWidth);
00099 }
00100 else if(OldString == "FrameHeight")
00101 {
00102 fscanf(EmiterFile,"%f",&m_FrameHeight);
00103 }
00104 else if(OldString == "FrameCount")
00105 {
00106 fscanf(EmiterFile,"%d",&m_FrameCount);
00107 }
00108 else if(OldString == "FrameDelay")
00109 {
00110 fscanf(EmiterFile,"%d",&m_FrameDelay);
00111 }
00112
00113 else if(OldString == "XSize")
00114 {
00115 fscanf(EmiterFile,"%f",&m_HalfXSize);
00116 m_HalfXSize /= 2;
00117 }
00118 else if(OldString == "YSize")
00119 {
00120 fscanf(EmiterFile,"%f",&m_HalfYSize);
00121 m_HalfYSize /= 2;
00122 }
00123
00124 else if(OldString == "LifeSpan")
00125 {
00126 fscanf(EmiterFile,"%d",&m_ParticleLifeSpan);
00127 }
00128 else if(OldString == "SpawnDelay")
00129 {
00130 fscanf(EmiterFile,"%d",&m_SpawnDelay);
00131 }
00132
00133 else if(OldString == "StartAlpha")
00134 {
00135 fscanf(EmiterFile,"%d",&m_StartAlpha);
00136 }
00137 else if(OldString == "EndAlpha")
00138 {
00139 fscanf(EmiterFile,"%d",&m_EndAlpha);
00140 }
00141
00142 else if(OldString == "StartColorR")
00143 {
00144 fscanf(EmiterFile,"%d",&m_StartRed);
00145 }
00146 else if(OldString == "StartColorG")
00147 {
00148 fscanf(EmiterFile,"%d",&m_StartGreen);
00149 }
00150 else if(OldString == "StartColorB")
00151 {
00152 fscanf(EmiterFile,"%d",&m_StartBlue);
00153 }
00154
00155 else if(OldString == "EndColorR")
00156 {
00157 fscanf(EmiterFile,"%d",&m_EndRed);
00158 }
00159 else if(OldString == "EndColorG")
00160 {
00161 fscanf(EmiterFile,"%d",&m_EndGreen);
00162 }
00163 else if(OldString == "EndColorB")
00164 {
00165 fscanf(EmiterFile,"%d",&m_EndBlue);
00166 }
00167
00168 else if(OldString == "StartVelX")
00169 {
00170 fscanf(EmiterFile,"%f",&m_StartVelX);
00171 }
00172 else if(OldString == "StartVelY")
00173 {
00174 fscanf(EmiterFile,"%f",&m_StartVelY);
00175 }
00176
00177 else if(OldString == "EndVelX")
00178 {
00179 fscanf(EmiterFile,"%f",&m_EndVelX);
00180 }
00181 else if(OldString == "EndVelY")
00182 {
00183 fscanf(EmiterFile,"%f",&m_EndVelY);
00184 }
00185
00186 else if(OldString == "LowVelXMulti")
00187 {
00188 fscanf(EmiterFile,"%f",&m_LowVelXMulti);
00189 }
00190 else if(OldString == "HighVelXMulti")
00191 {
00192 fscanf(EmiterFile,"%f",&m_HighVelXMulti);
00193 }
00194
00195 else if(OldString == "LowVelYMulti")
00196 {
00197 fscanf(EmiterFile,"%f",&m_LowVelYMulti);
00198 }
00199 else if(OldString == "HighVelYMulti")
00200 {
00201 fscanf(EmiterFile,"%f",&m_HighVelYMulti);
00202 }
00203
00204 else if(OldString == "StartScaleX")
00205 {
00206 fscanf(EmiterFile,"%f",&m_StartScaleX);
00207 }
00208 else if(OldString == "EndScaleX")
00209 {
00210 fscanf(EmiterFile,"%f",&m_TargetScaleX);
00211 }
00212
00213 else if(OldString == "StartScaleY")
00214 {
00215 fscanf(EmiterFile,"%f",&m_StartScaleY);
00216 }
00217 else if(OldString == "EndScaleY")
00218 {
00219 fscanf(EmiterFile,"%f",&m_TargetScaleY);
00220 }
00221 }
00222
00223 OldString = HelpString;
00224 }
00225
00226 fclose(EmiterFile);
00227 }
00228
00229
00230 void CEmiter::Update()
00231 {
00232 if(sgl::get_clock().GetElapsedTime()/1000-m_LastSpawn > m_SpawnDelay && m_Active == true)
00233 {
00234 m_LastSpawn = sgl::get_clock().GetElapsedTime()/1000;
00235
00236 SpawnNewParticle();
00237 }
00238
00239 for(std::size_t CurParticle = 0; CurParticle < m_Particels.size(); CurParticle++)
00240 {
00241 m_Particels[CurParticle]->Update();
00242
00243 if(m_Particels[CurParticle]->Remove() == true)
00244 {
00245 delete m_Particels[CurParticle];
00246 m_Particels.erase(m_Particels.begin() + CurParticle);
00247 }
00248 }
00249 }
00250
00251 void CEmiter::Draw()
00252 {
00253 for(std::size_t CurParticle = 0; CurParticle < m_Particels.size(); CurParticle++)
00254 {
00255 m_Particels[CurParticle]->Draw();
00256 }
00257 }
00258
00259
00260 void CEmiter::SpawnNewParticle()
00261 {
00262 float Multi = 0.0f;
00263 float X = m_X + frnd(-m_HalfXSize,m_HalfXSize);
00264 float Y = m_Y + frnd(-m_HalfYSize,m_HalfYSize);
00265
00266 CParticle* Particle = new CParticle;
00267 Particle->Init(m_TexName,m_FrameWidth,m_FrameHeight,m_FrameCount);
00268 Particle->SetLifeSpan(m_ParticleLifeSpan);
00269 Particle->SetPosition(X,Y);
00270
00271 Particle->SetScale(m_StartScaleX,m_StartScaleY);
00272 Particle->SetTargetScale(m_TargetScaleX,m_TargetScaleY);
00273
00274 Particle->SetStartAlpha(m_StartAlpha);
00275 Particle->SetEndAlpha(m_EndAlpha);
00276
00277 Particle->SetStartRed(m_StartRed);
00278 Particle->SetEndRed(m_EndRed);
00279
00280 Particle->SetStartGreen(m_StartGreen);
00281 Particle->SetEndGreen(m_EndGreen);
00282
00283 Particle->SetStartBlue(m_StartBlue);
00284 Particle->SetEndBlue(m_EndBlue);
00285
00286 Multi = frnd(m_LowVelXMulti,m_HighVelXMulti);
00287 Particle->SetStartVelX(m_StartVelX*Multi);
00288 Particle->SetEndVelX(m_EndVelX*Multi);
00289
00290 Multi = frnd(m_LowVelYMulti,m_HighVelYMulti);
00291 Particle->SetStartVelY(m_StartVelY*Multi);
00292 Particle->SetEndVelY(m_EndVelY*Multi);
00293
00294 Particle->SetAniSpeed(m_FrameDelay);
00295
00296 m_Particels.push_back(Particle);
00297 }