/********************************************************************* * Animates a muzzle flash billboard with firing sound and does * damage to borbie. This method is only called when the soldier * is within range and has direct line of sight. He has an 80% * chance of hitting his target. *********************************************************************/ void Soldier::fire(int distance){ lastFireTime = gameInstance->getDevice()->getTimer()->getTime(); IBillboardSceneNode * bill; bill = smgr->addBillboardSceneNode(); bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); bill->setMaterialTexture(0, driver->getTexture("assets/textures/muzFlash.png")); bill->setMaterialFlag(video::EMF_LIGHTING, false); bill->setMaterialFlag(video::EMF_ZBUFFER, false); float randomNum = Random::randomFloat(-10.0, 15.0); bill->setSize(core::dimension2d<f32>(30.0+randomNum, 30.0+randomNum)); bill->setID(0);//not pickable by ray caster //get enemy position, adjust muzzle flash height to barrel vector3df start = sceneNode->getPosition(); start.Y+=60; bill->setPosition(start); this->audioSystem->playSound3d(gameInstance->gunShot1, this); const int MUZZLE_FLASH_TIME = 50; ISceneNodeAnimator* anim = gameInstance->getSceneManager()->createDeleteAnimator(MUZZLE_FLASH_TIME); bill->addAnimator(anim); anim->drop(); if (!miss(distance)) gameInstance->player->applyBulletDamage(BULLET_DAMAGE); else gameInstance->player->ricochet(); }
void CRaycastTankExample::createMuzzleFlash(irr::scene::IBoneSceneNode *node) { IBillboardSceneNode *muzzleFlash = device->getSceneManager()->addBillboardSceneNode(0, dimension2d<f32>(30.0f, 30.0f), node->getAbsoluteTransformation().getTranslation()); muzzleFlash->setMaterialFlag(EMF_LIGHTING, false); muzzleFlash->setMaterialTexture(0,device->getVideoDriver()->getTexture("particlewhite.bmp")); muzzleFlash->setMaterialType(EMT_TRANSPARENT_ADD_COLOR); ISceneNodeAnimator* deleteAnim = device->getSceneManager()->createDeleteAnimator(100); muzzleFlash->addAnimator(deleteAnim); deleteAnim->drop(); }
/** Tests the offset capability of the fly circle animator */ bool flyCircleAnimator(void) { IrrlichtDevice *device = createDevice(video::EDT_BURNINGSVIDEO, core::dimension2du(160,120), 32); if (!device) return false; IVideoDriver* driver = device->getVideoDriver(); ISceneManager* smgr = device->getSceneManager(); const f32 offsetDegrees[] = { 0.f, 45.f, 135.f, 270.f }; for(u32 i = 0; i < sizeof(offsetDegrees) / sizeof(offsetDegrees[0]); ++i) { IBillboardSceneNode * node = smgr->addBillboardSceneNode(); // Have the animator rotate around the Z axis plane, rather than the default Y axis ISceneNodeAnimator * animator = smgr->createFlyCircleAnimator( vector3df(0, 0, 0), 30.f, 0.001f, vector3df(0, 0, 1), (offsetDegrees[i] / 360.f)); if(!node || !animator) return false; node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR ); node->setMaterialTexture(0, driver->getTexture("../media/particle.bmp")); node->setMaterialFlag(video::EMF_LIGHTING, false); node->addAnimator(animator); animator->drop(); } (void)smgr->addCameraSceneNode(0, vector3df(0, 0, -50), vector3df(0, 0, 0)); bool result = false; // Don't do device->run() since I need the time to remain at 0. if (driver->beginScene(true, true, video::SColor(0, 80, 80, 80))) { smgr->drawAll(); driver->endScene(); result = takeScreenshotAndCompareAgainstReference(driver, "-flyCircleAnimator.png", 100); } device->closeDevice(); device->run(); device->drop(); return result; }