// Jetpac remake using Irrlicht // Copyright Gaz Davidson (gaz@bitplane.net) #ifndef __JETPAC_FIRE_INCLUDED__ #define __JETPAC_FIRE_INCLUDED__ #include "GameEntity.h" #include namespace irr { namespace scene { class PhaserFire : public GameEntity { public: PhaserFire(ISceneManager* mgr) : GameEntity(mgr) { Finished = true; } void shoot(core::vector3df pos, s32 direction, u32 length) { u32 c = rand() % 3; // % 5 // I only like the first 3 switch (c) { case 0: Mat.AmbientColor = (video::SColor)Magenta1; break; case 1: Mat.AmbientColor = (video::SColor)White1; break; case 2: Mat.AmbientColor = (video::SColor)Blue1; break; //case 3: Mat.AmbientColor = (video::SColor)Yellow1; break; //case 4: Mat.AmbientColor = (video::SColor)Cyan1; break; } StartY = pos.Y; StartX = pos.X; EndX = pos.X; Direction = PhaserSpeed * (f32)direction; Length = length; Box.reset(pos); LastTime=0; Finished = false; Stopped = false; } virtual void OnAnimate(u32 timeMs) { if (!LastTime) { LastTime=timeMs; EndTime = timeMs+Length; return; } f32 tdif = (f32)(timeMs-LastTime); LastTime=timeMs; if (timeMs > EndTime) { // move the tail, check if we've finished StartX += Direction * tdif; if ((Direction > 0 && StartX > EndX) || (Direction < 0 && EndX > StartX) ) { Finished = true; } } else if (!Stopped) { EndX += Direction * tdif; } Box.reset(core::vector3df(StartX, StartY-PhaserWidth,-PhaserWidth )); Box.addInternalPoint(core::vector3df(EndX, StartY+PhaserWidth,PhaserWidth )); ISceneNode::OnAnimate(timeMs); } virtual void OnRegisterSceneNode() { if (!Finished) { SceneManager->registerNodeForRendering(this, ESNRP_TRANSPARENT); } ISceneNode::OnRegisterSceneNode(); } virtual void render() { SceneManager->getVideoDriver()->setMaterial(Mat); SceneManager->getVideoDriver()->setTransform(video::ETS_WORLD, AbsoluteTransformation); SceneManager->getVideoDriver()->draw3DBox(Box); core::aabbox3df b2; if (Box.MaxEdge.X > MaxX) { b2 = Box; b2.MaxEdge.X -= MaxX*2; b2.MinEdge.X -= MaxX*2; SceneManager->getVideoDriver()->draw3DBox(b2); } if (Box.MinEdge.X < -MaxX) { b2 = Box; b2.MaxEdge.X += MaxX*2; b2.MinEdge.X += MaxX*2; SceneManager->getVideoDriver()->draw3DBox(b2); } } video::SMaterial Mat; f32 StartY, StartX, EndX; bool Stopped, Finished; u32 Length; f32 Direction; u32 LastTime, EndTime; }; } // scene } // irr #endif