Particle* Particle::addEffect(const std::string &particleEffectFile, int pixelX, int pixelY, int rotation) { Particle *newParticle = NULL; XML::Document doc(particleEffectFile); xmlNodePtr rootNode = doc.rootNode(); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "effect")) { logger->log("Error loading particle: %s", particleEffectFile.c_str()); return NULL; } ResourceManager *resman = ResourceManager::getInstance(); // Parse particles for_each_xml_child_node(effectChildNode, rootNode) { // We're only interested in particles if (!xmlStrEqual(effectChildNode->name, BAD_CAST "particle")) continue; // Determine the exact particle type xmlNodePtr node; // Animation if ((node = XML::findFirstChildByName( effectChildNode, "animation"))) { newParticle = new AnimationParticle(mMap, node); } // Image else if ((node = XML::findFirstChildByName( effectChildNode, "image"))) { Image *img= resman->getImage((const char*) node->xmlChildrenNode->content); newParticle = new ImageParticle(mMap, img); } // Other else { newParticle = new Particle(mMap); } // 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; int lifetime = XML::getProperty(effectChildNode, "lifetime", -1); newParticle->setPosition(particleX, particleY, particleZ); newParticle->setLifetime(lifetime); // Look for additional emitters for this particle for_each_xml_child_node(emitterNode, effectChildNode) { if (!xmlStrEqual(emitterNode->name, BAD_CAST "emitter")) continue; ParticleEmitter *newEmitter; newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap, rotation); newParticle->addEmitter(newEmitter); } mChildParticles.push_back(newParticle); } return newParticle; }
Particle *Particle::addEffect(const std::string &particleEffectFile, int pixelX, int pixelY, int rotation) { Particle *newParticle = NULL; XML::Document doc(particleEffectFile); xmlNodePtr rootNode = doc.rootNode(); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "effect")) { logger->log("Error loading particle: %s", particleEffectFile.c_str()); return NULL; } ResourceManager *resman = ResourceManager::getInstance(); // Parse particles for_each_xml_child_node(effectChildNode, rootNode) { // We're only interested in particles if (!xmlStrEqual(effectChildNode->name, BAD_CAST "particle")) continue; // Determine the exact particle type xmlNodePtr node; // Animation if ((node = XML::findFirstChildByName(effectChildNode, "animation"))) { newParticle = new AnimationParticle(mMap, node); } // Rotational else if ((node = XML::findFirstChildByName(effectChildNode, "rotation"))) { newParticle = new RotationalParticle(mMap, node); } // Image else if ((node = XML::findFirstChildByName(effectChildNode, "image"))) { Image *img= resman->getImage((const char*) node->xmlChildrenNode->content); newParticle = new ImageParticle(mMap, img); } // Other else { newParticle = new Particle(mMap); } // Read and set the basic properties of the particle 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 (mPos.x + (float)pixelX + offsetX, mPos.y + (float)pixelY + offsetY, mPos.z + offsetZ); newParticle->moveTo(position); int lifetime = XML::getProperty(effectChildNode, "lifetime", -1); newParticle->setLifetime(lifetime); bool resizeable = "false" != XML::getProperty(effectChildNode, "size-adjustable", "false"); newParticle->setAllowSizeAdjust(resizeable); // Look for additional emitters for this particle for_each_xml_child_node(emitterNode, effectChildNode) { if (xmlStrEqual(emitterNode->name, BAD_CAST "emitter")) { ParticleEmitter *newEmitter; newEmitter = new ParticleEmitter(emitterNode, newParticle, mMap, rotation); newParticle->addEmitter(newEmitter); } else if (xmlStrEqual(emitterNode->name, BAD_CAST "deatheffect")) { std::string deathEffect = (const char*)emitterNode->xmlChildrenNode->content; char deathEffectConditions = 0x00; if (XML::getBoolProperty(emitterNode, "on-floor", true)) { deathEffectConditions += Particle::DEAD_FLOOR; } if (XML::getBoolProperty(emitterNode, "on-sky", true)) { deathEffectConditions += Particle::DEAD_SKY; } if (XML::getBoolProperty(emitterNode, "on-other", false)) { deathEffectConditions += Particle::DEAD_OTHER; } if (XML::getBoolProperty(emitterNode, "on-impact", true)) { deathEffectConditions += Particle::DEAD_IMPACT; } if (XML::getBoolProperty(emitterNode, "on-timeout", true)) { deathEffectConditions += Particle::DEAD_TIMEOUT; } newParticle->setDeathEffect(deathEffect, deathEffectConditions); } } mChildParticles.push_back(newParticle); } return newParticle; }