Skip to content

Commit

Permalink
Particles Effect supimpa tb
Browse files Browse the repository at this point in the history
  • Loading branch information
ozires committed Sep 7, 2011
1 parent 835d765 commit 172c162
Show file tree
Hide file tree
Showing 5 changed files with 170 additions and 121 deletions.
4 changes: 2 additions & 2 deletions src/gdx-cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ graphics/g2d/detail/stb_truetype.h
# graphics/g2d/BitmapFont.hpp
graphics/g2d/TextureRegion.hpp
graphics/g2d/SpriteCache.hpp
# graphics/g2d/ParticleEffect.hpp
graphics/g2d/ParticleEffect.hpp
# graphics/g2d/TextureAtlas.hpp
graphics/g2d/NinePatch.hpp
graphics/g2d/ParticleEmitter.hpp
Expand Down Expand Up @@ -446,7 +446,7 @@ graphics/g2d/Gdx2DPixmap.cpp
# graphics/g2d/tiled/TiledObjectGroup.cpp
# graphics/g2d/tiled/TiledLayer.cpp
graphics/g2d/TextureRegion.cpp
# graphics/g2d/ParticleEffect.cpp
graphics/g2d/ParticleEffect.cpp
graphics/g2d/Animation.cpp
graphics/g2d/Sprite.cpp
graphics/TextureData.cpp
Expand Down
211 changes: 115 additions & 96 deletions src/gdx-cpp/graphics/g2d/ParticleEffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,95 +19,114 @@
*/

#include "ParticleEffect.hpp"
#include "ParticleEmitter.hpp"

using namespace gdx_cpp::graphics::g2d;

ParticleEffect::ParticleEffect () {
emitters.resize(8);
}

ParticleEffect::ParticleEffect (ParticleEffect& effect) {
emitters.resize(effect.emitters.size());
for (unsigned int i = 0, n = effect.emitters.size(); i < n; i++)
emitters[i] = new ParticleEmitter(*effect.emitters[i]);
}

ParticleEffect::~ParticleEffect () {
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
{
if (emitters[i] != NULL) {
delete emitters[i];
}
}
}

void ParticleEffect::start () {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).start();
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->start();
}

void ParticleEffect::update (float delta) {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).update(delta);
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->update(delta);
}

void ParticleEffect::draw (const SpriteBatch& spriteBatch) {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).draw(spriteBatch);
void ParticleEffect::draw (SpriteBatch& spriteBatch) {
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->draw(spriteBatch);
}

void ParticleEffect::draw (const SpriteBatch& spriteBatch,float delta) {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).draw(spriteBatch, delta);
void ParticleEffect::draw (SpriteBatch& spriteBatch, float delta) {
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->draw(spriteBatch, delta);
}

void ParticleEffect::allowCompletion () {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).allowCompletion();
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->allowCompletion();
}

bool ParticleEffect::isComplete () {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
if (emitter.isContinuous()) return false;
if (!emitter.isComplete()) return false;
for (unsigned int i = 0, n = emitters.size(); i < n; i++) {
ParticleEmitter * emitter = emitters[i];
if (emitter->isContinuous()) return false;
if (!emitter->isComplete()) return false;
}
return true;
}

void ParticleEffect::setDuration (int duration) {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
emitter.setContinuous(false);
emitter.duration = duration;
emitter.durationTimer = 0;
for (unsigned int i = 0, n = emitters.size(); i < n; i++) {
ParticleEmitter * emitter = emitters[i];
emitter->setContinuous(false);
emitter->duration = duration;
emitter->durationTimer = 0;
}
}

void ParticleEffect::setPosition (float x,float y) {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).setPosition(x, y);
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->setPosition(x, y);
}

void ParticleEffect::setFlip (bool flipX,bool flipY) {
for (int i = 0, n = emitters.size; i < n; i++)
emitters.get(i).setFlip(flipX, flipY);
for (unsigned int i = 0, n = emitters.size(); i < n; i++)
emitters[i]->setFlip(flipX, flipY);
}

gdx_cpp::utils::ArrayParticleEmitter>& ParticleEffect::getEmitters () {
std::vector< ParticleEmitter * >& ParticleEffect::getEmitters () {
return emitters;
}

ParticleEmitter& ParticleEffect::findEmitter (const std::string& name) {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
if (emitter.getName().equals(name)) return emitter;
ParticleEmitter* ParticleEffect::findEmitter (const std::string& name) {
for (unsigned int i = 0, n = emitters.size(); i < n; i++) {
if (emitters[i]->getName() == name) return emitters[i];
}
return null;
return NULL;
}

void ParticleEffect::save (const File& file) {
Writer output = null;
try {
output = new FileWriter(file);
int index = 0;
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
if (index++ > 0) output.write("\n\n");
emitter.save(output);
output.write("- Image Path -\n");
output.write(emitter.getImagePath() + "\n");
}
} catch (IOException ex) {
throw new GdxRuntimeException("Error saving effect: " + file, ex);
}
finally {
try {
if (output != null) output.close();
} catch (IOException ex) {
}
}
// Writer output = NULL;
// try {
// output = new FileWriter(file);
// int index = 0;
// for (unsigned int i = 0, n = emitters.size(); i < n; i++) {
// ParticleEmitter * emitter = emitters[i];
// if (index++ > 0) output.write("\n\n");
// emitter.save(output);
// output.write("- Image Path -\n");
// output.write(emitter.getImagePath() + "\n");
// }
// } catch (IOException ex) {
// throw new GdxRuntimeException("Error saving effect: " + file, ex);
// }
// finally {
// try {
// if (output != null) output.close();
// } catch (IOException ex) {
// }
// }
}

void ParticleEffect::load (const gdx_cpp::files::FileHandle& effectFile,const gdx_cpp::files::FileHandle& imagesDir) {
Expand All @@ -121,62 +140,62 @@ void ParticleEffect::load (const gdx_cpp::files::FileHandle& effectFile,const Te
}

void ParticleEffect::loadEmitters (const gdx_cpp::files::FileHandle& effectFile) {
InputStream input = effectFile.read();
emitters.clear();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(input), 512);
while (true) {
ParticleEmitter emitter = new ParticleEmitter(reader);
reader.readLine();
emitter.setImagePath(reader.readLine());
emitters.add(emitter);
if (reader.readLine() == null) break;
if (reader.readLine() == null) break;
}
} catch (IOException ex) {
throw new GdxRuntimeException("Error loading effect: " + effectFile, ex);
}
finally {
try {
if (reader != null) reader.close();
} catch (IOException ex) {
}
}
// InputStream input = effectFile.read();
// emitters.clear();
// BufferedReader reader = null;
// try {
// reader = new BufferedReader(new InputStreamReader(input), 512);
// while (true) {
// ParticleEmitter emitter = new ParticleEmitter(reader);
// reader.readLine();
// emitter.setImagePath(reader.readLine());
// emitters.add(emitter);
// if (reader.readLine() == null) break;
// if (reader.readLine() == null) break;
// }
// } catch (IOException ex) {
// throw new GdxRuntimeException("Error loading effect: " + effectFile, ex);
// }
// finally {
// try {
// if (reader != null) reader.close();
// } catch (IOException ex) {
// }
// }
}

void ParticleEffect::loadEmitterImages (const TextureAtlas& atlas) {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
String imagePath = emitter.getImagePath();
if (imagePath == null) continue;
String imageName = new File(imagePath.replace('\\', '/')).getName();
int lastDotIndex = imageName.lastIndexOf('.');
if (lastDotIndex != -1) imageName = imageName.substring(0, lastDotIndex);
Sprite sprite = atlas.createSprite(imageName);
if (sprite == null) throw new IllegalArgumentException("SpriteSheet missing image: " + imageName);
emitter.setSprite(sprite);
}
// for (unsigned int i = 0, n = emitters.size; i < n; i++) {
// ParticleEmitter emitter = emitters.get(i);
// String imagePath = emitter.getImagePath();
// if (imagePath == null) continue;
// String imageName = new File(imagePath.replace('\\', '/')).getName();
// int lastDotIndex = imageName.lastIndexOf('.');
// if (lastDotIndex != -1) imageName = imageName.substring(0, lastDotIndex);
// Sprite sprite = atlas.createSprite(imageName);
// if (sprite == null) throw new IllegalArgumentException("SpriteSheet missing image: " + imageName);
// emitter.setSprite(sprite);
// }
}

void ParticleEffect::loadEmitterImages (const gdx_cpp::files::FileHandle& imagesDir) {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
String imagePath = emitter.getImagePath();
if (imagePath == null) continue;
String imageName = new File(imagePath.replace('\\', '/')).getName();
emitter.setSprite(new Sprite(loadTexture(imagesDir.child(imageName))));
}
// for (unsigned int i = 0, n = emitters.size; i < n; i++) {
// ParticleEmitter emitter = emitters.get(i);
// String imagePath = emitter.getImagePath();
// if (imagePath == null) continue;
// String imageName = new File(imagePath.replace('\\', '/')).getName();
// emitter.setSprite(new Sprite(loadTexture(imagesDir.child(imageName))));
// }
}

gdx_cpp::graphics::Texture& ParticleEffect::loadTexture (const gdx_cpp::files::FileHandle& file) {
return new Texture(file, false);
gdx_cpp::graphics::Texture::ptr ParticleEffect::loadTexture (const gdx_cpp::files::FileHandle& file) {
return gdx_cpp::graphics::Texture::ptr(new Texture(file, false));
}

void ParticleEffect::dispose () {
for (int i = 0, n = emitters.size; i < n; i++) {
ParticleEmitter emitter = emitters.get(i);
emitter.getSprite().getTexture().dispose();
for (unsigned int i = 0, n = emitters.size(); i < n; i++) {
ParticleEmitter * emitter = emitters[i];
emitter->getSprite()->getTexture()->dispose();
}
}

29 changes: 23 additions & 6 deletions src/gdx-cpp/graphics/g2d/ParticleEffect.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,24 +20,41 @@

#ifndef GDX_CPP_GRAPHICS_G2D_PARTICLEEFFECT_HPP_
#define GDX_CPP_GRAPHICS_G2D_PARTICLEEFFECT_HPP_
#include "gdx-cpp/utils/Disposable.hpp"
#include <vector>
#include <string>
#include <gdx-cpp/utils/Aliases.hpp>

namespace gdx_cpp {
namespace files{
class FileHandle;
}
namespace graphics {
class Texture;
namespace g2d {

class TextureAtlas;
class SpriteBatch;
class ParticleEmitter;
class File;

class ParticleEffect: public gdx_cpp::utils::Disposable {
public:

ParticleEffect ();
ParticleEffect (ParticleEffect& effect);
~ParticleEffect();
void start ();
void update (float delta);
void draw (const SpriteBatch& spriteBatch);
void draw (const SpriteBatch& spriteBatch,float delta);
void draw (SpriteBatch& spriteBatch);
void draw (SpriteBatch& spriteBatch,float delta);
void allowCompletion ();
bool isComplete ();
void setDuration (int duration);
void setPosition (float x,float y);
void setFlip (bool flipX,bool flipY);
gdx_cpp::utils::ArrayParticleEmitter>& getEmitters ();
ParticleEmitter& findEmitter (const std::string& name);
std::vector< ParticleEmitter* >& getEmitters ();
ParticleEmitter* findEmitter (const std::string& name);
void save (const File& file);
void load (const gdx_cpp::files::FileHandle& effectFile,const gdx_cpp::files::FileHandle& imagesDir);
void load (const gdx_cpp::files::FileHandle& effectFile,const TextureAtlas& atlas);
Expand All @@ -47,10 +64,10 @@ class ParticleEffect: public gdx_cpp::utils::Disposable {
void dispose ();

protected:
gdx_cpp::graphics::Texture& loadTexture (const gdx_cpp::files::FileHandle& file);
ref_ptr_maker<Texture>::type loadTexture (const gdx_cpp::files::FileHandle& file);

private:
Array<ParticleEmitter> emitters;
std::vector<ParticleEmitter *> emitters;
};

} // namespace gdx_cpp
Expand Down
Loading

0 comments on commit 172c162

Please sign in to comment.