summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Sehmisch <crush@themanaworld.org>2008-12-14 03:43:37 +0100
committerIra Rice <irarice@gmail.com>2008-12-14 09:13:39 -0700
commit712744c5c985a906891a41679adbe6468e82649b (patch)
treec6f49cd89cf84e00212ba655629465a6c8cf106b
parentae7cd9ca453aee25ccf1f4eb277ab77144910da5 (diff)
downloadmana-client-712744c5c985a906891a41679adbe6468e82649b.tar.gz
mana-client-712744c5c985a906891a41679adbe6468e82649b.tar.bz2
mana-client-712744c5c985a906891a41679adbe6468e82649b.tar.xz
mana-client-712744c5c985a906891a41679adbe6468e82649b.zip
Fixed follow-parent of nested and being-following particle emitters
-rw-r--r--src/being.cpp6
-rw-r--r--src/particle.cpp47
-rw-r--r--src/particle.h17
-rw-r--r--src/particlecontainer.cpp20
-rw-r--r--src/particlecontainer.h6
-rw-r--r--src/particleemitter.cpp11
6 files changed, 62 insertions, 45 deletions
diff --git a/src/being.cpp b/src/being.cpp
index d98af29c..3f4c5d9c 100644
--- a/src/being.cpp
+++ b/src/being.cpp
@@ -424,8 +424,10 @@ void Being::logic()
}
}
- //Update particle effects
- mChildParticleEffects.setPositions((float)mPx + 16.0f, (float)mPy + 32.0f);
+ // Update particle effects
+ mChildParticleEffects.moveTo((float) mPx + 16.0f,
+ (float) mPy + 32.0f);
+
}
void Being::draw(Graphics *graphics, int offsetX, int offsetY) const
diff --git a/src/particle.cpp b/src/particle.cpp
index fd86195c..adc4aa5b 100644
--- a/src/particle.cpp
+++ b/src/particle.cpp
@@ -193,7 +193,7 @@ bool Particle::update()
p++
)
{
- (*p)->moveBy(mPos.x, mPos.y, mPos.z);
+ (*p)->moveBy(mPos);
mChildParticles.push_back (*p);
}
}
@@ -228,6 +228,30 @@ bool Particle::update()
}
return true;
+}
+
+void Particle::moveBy(Vector change)
+{
+ mPos += change;
+ for (ParticleIterator p = mChildParticles.begin();
+ p != mChildParticles.end();
+ p++)
+ {
+ if ((*p)->doesFollow())
+ {
+ (*p)->moveBy(change);
+ }
+ }
+ return;
+}
+
+void Particle::moveTo(float x, float y)
+{
+ Vector pos;
+ pos.x = x;
+ pos.y = y;
+ pos.z = mPos.z;
+ moveTo(pos);
}
Particle* Particle::addEffect(const std::string &particleEffectFile,
@@ -275,17 +299,18 @@ Particle* Particle::addEffect(const std::string &particleEffectFile,
}
// Read and set the basic properties of the particle
- int offsetX = XML::getProperty(effectChildNode, "position-x", 0);
- int offsetY = XML::getProperty(effectChildNode, "position-y", 0);
- int offsetZ = XML::getProperty(effectChildNode, "position-z", 0);
-
- int particleX = (int) mPos.x + pixelX + offsetX;
- int particleY = (int) mPos.y + pixelY + offsetY;
- int particleZ = (int) mPos.z + offsetZ;
+ float offsetX = XML::getFloatProperty(effectChildNode, "position-x", 0);
+ float offsetY = XML::getFloatProperty(effectChildNode, "position-y", 0);
+ float offsetZ = XML::getFloatProperty(effectChildNode, "position-z", 0);
+
+ Vector position;
+ position.x = mPos.x + (float)pixelX + offsetX;
+ position.y = mPos.y + (float)pixelY + offsetY;
+ position.z = mPos.z + offsetZ;
int lifetime = XML::getProperty(effectChildNode, "lifetime", -1);
- newParticle->setPosition(particleX, particleY, particleZ);
+ newParticle->moveTo(position);
newParticle->setLifetime(lifetime);
// Look for additional emitters for this particle
@@ -311,7 +336,7 @@ Particle *Particle::addTextSplashEffect(const std::string &text,
{
Particle *newParticle = new TextParticle(mMap, text, colorR, colorG, colorB,
font);
- newParticle->setPosition(x, y, 0);
+ newParticle->moveTo(x, y);
newParticle->setVelocity(((rand() % 100) - 50) / 200.0f, // X
((rand() % 100) - 50) / 200.0f, // Y
((rand() % 100) / 200.0f) + 4.0f); // Z
@@ -330,7 +355,7 @@ Particle *Particle::addTextRiseFadeOutEffect(const std::string &text,
int x, int y)
{
Particle *newParticle = new TextParticle(mMap, text, 255, 255, 255, font);
- newParticle->setPosition(x, y, 0);
+ newParticle->moveTo(x, y);
newParticle->setVelocity(0.0f, 0.0f, 0.5f);
newParticle->setGravity(0.0015f);
newParticle->setLifetime(300);
diff --git a/src/particle.h b/src/particle.h
index ab08968f..8359ab55 100644
--- a/src/particle.h
+++ b/src/particle.h
@@ -127,14 +127,13 @@ class Particle : public Sprite
/**
* Sets the position in 3 dimensional space in pixels relative to map.
*/
- void setPosition(float x, float y, float z)
- { mPos.x = x; mPos.y = y; mPos.z = z; }
+ void moveTo(Vector pos)
+ { moveBy (pos - mPos);}
/**
* Sets the position in 2 dimensional space in pixels relative to map.
*/
- void setPosition(float x, float y)
- { mPos.x = x; mPos.y = y; }
+ void moveTo(float x, float y);
/**
* Returns the particle position.
@@ -144,14 +143,8 @@ class Particle : public Sprite
/**
* Changes the particle position relative
- */
- void moveBy(float x, float y, float z)
- { mPos.x += x; mPos.y += y; mPos.z += z; }
-
- void moveChildren(Vector change);
-
- void moveBy (Vector change)
- { mPos += change; }
+ */
+ void moveBy (Vector change);
/**
* Sets the time in game ticks until the particle is destroyed.
diff --git a/src/particlecontainer.cpp b/src/particlecontainer.cpp
index 12ef5733..fbfb1505 100644
--- a/src/particlecontainer.cpp
+++ b/src/particlecontainer.cpp
@@ -44,12 +44,10 @@ ParticleContainer::clear()
mNext->clear();
}
-
-void
-ParticleContainer::setPositions(float x, float y)
+void ParticleContainer::moveTo(float x, float y)
{
if (mNext)
- mNext->setPositions(x, y);
+ mNext->moveTo(x, y);
}
// -- particle list ----------------------------------------
@@ -91,15 +89,14 @@ ParticleList::clearLocally()
mElements.clear();
}
-void
-ParticleList::setPositions(float x, float y)
+void ParticleList::moveTo(float x, float y)
{
- ParticleContainer::setPositions(x, y);
+ ParticleContainer::moveTo(x, y);
for (std::list<Particle *>::iterator it = mElements.begin();
it != mElements.end();)
{
- (*it)->setPosition(x, y);
+ (*it)->moveTo(x, y);
if ((*it)->isExtinct())
{
(*it)->kill();
@@ -156,16 +153,15 @@ ParticleVector::clearLocally()
delLocally(i);
}
-void
-ParticleVector::setPositions(float x, float y)
+void ParticleVector::moveTo(float x, float y)
{
- ParticleContainer::setPositions(x, y);
+ ParticleContainer::moveTo(x, y);
for (std::vector<Particle *>::iterator it = mIndexedElements.begin();
it != mIndexedElements.end(); it++)
if (*it)
{
- (*it)->setPosition(x, y);
+ (*it)->moveTo(x, y);
if ((*it)->isExtinct())
{
diff --git a/src/particlecontainer.h b/src/particlecontainer.h
index cf002fbc..ae02326e 100644
--- a/src/particlecontainer.h
+++ b/src/particlecontainer.h
@@ -58,7 +58,7 @@ public:
/**
* Sets the positions of all elements
*/
- virtual void setPositions(float x, float y);
+ virtual void moveTo(float x, float y);
protected:
bool mDelParent; /**< Delete mNext in destructor */
@@ -88,7 +88,7 @@ public:
virtual void clearLocally();
- virtual void setPositions(float x, float y);
+ virtual void moveTo(float x, float y);
protected:
std::list<Particle *> mElements; /**< Contained particle effects */
@@ -116,7 +116,7 @@ public:
virtual void delLocally(int index);
virtual void clearLocally();
- virtual void setPositions(float x, float y);
+ virtual void moveTo(float x, float y);
protected:
std::vector<Particle *> mIndexedElements;
diff --git a/src/particleemitter.cpp b/src/particleemitter.cpp
index 03fe4672..d1ba92ca 100644
--- a/src/particleemitter.cpp
+++ b/src/particleemitter.cpp
@@ -360,12 +360,13 @@ ParticleEmitter::createParticles(int tick)
{
newParticle = new Particle(mMap);
}
+
+ Vector position;
+ position.x = mParticlePosX.value(tick);
+ position.y = mParticlePosY.value(tick);
+ position.z = mParticlePosZ.value(tick);
-
- newParticle->setPosition(
- mParticlePosX.value(tick),
- mParticlePosY.value(tick),
- mParticlePosZ.value(tick));
+ newParticle->moveTo(position);
float angleH = mParticleAngleHorizontal.value(tick);
float angleV = mParticleAngleVertical.value(tick);