Its pretty basic but it has missile effect by distance and at certain time.
Should be easy to extend.
trigger the missile:
tm3 = new Missile(Vec3(5.0f, 5.0f, 0.0f)); tm2 = new Missile(Vec3(0.0f, 0.0f, 0.0f), tm3->GetPosition(), true);
and call the Loop method in the game loop
#ifndef __S_MISSILE_H__ #define __S_MISSILE_H__ #include "Leadwerks.h" using namespace Leadwerks; class Missile { private: Emitter *mem; Material* unitexpmat; Model *model; Vec3 targetDirection; float mass; long creationTime; long detonationTime; void Init(); void Effect(Material* mat); public: Missile(); Missile(Vec3 pos); Missile(Vec3 pos, Vec3 targetDirection, bool launch); void SetDetonationTime(long detonationTime); void SetPosition(Vec3 pos); void SetDirection(Vec3 targetDirection); void SetMass(float mass); Vec3 GetPosition(); Vec3 GetTargetPosition(); void Launch(); void Loop(Material* mat); }; #endif
#include "Missile.h" void Missile::Init() { model = Model::Box(0.1, 0.1, 0.1); model->SetColor(0.1, 0.1, 0.1); mass = 0.01; model->SetMass(mass); model->SetGravityMode(false); Shape* shape = Shape::Box(0,0,0,0,0,0,0.1, 0.1, 0.1); model->SetShape(shape); shape->Release(); creationTime = Time::Millisecs(); detonationTime = -1; } Missile::Missile() { Init(); } Missile::Missile(Vec3 pos, Vec3 direction, bool launch) { Init(); SetPosition(pos); SetDirection(direction); if(launch == true) { model->AddForce(direction[0], direction[1], direction[2], true); } } Missile::Missile(Vec3 pos) { Init(); SetPosition(pos); } void Missile::SetPosition(Vec3 pos) { model->SetPosition(pos); } void Missile::SetDirection(Vec3 targetDirection) { this->targetDirection = targetDirection; } void Missile::SetMass(float mass) { this->mass = mass; } void Missile::SetDetonationTime(long detonationTime) { this->detonationTime = (creationTime + detonationTime); } Vec3 Missile::GetPosition() { return model->GetPosition(); } Vec3 Missile::GetTargetPosition() { return targetDirection; } void Missile::Launch() { model->AddForce(targetDirection[0], targetDirection[1], targetDirection[2], false); } void Missile::Effect(Material* mat) { Vec3 nd = targetDirection.Normalize(); mem = Emitter::Create(200); mem->SetMaterial(mat); mem->SetEmissionShape(1); mem->SetEmissionVolume(Vec3(.50,.50,.50)); mem->SetDuration(300); mem->SetVelocity(nd[0],nd[1],nd[2],0); mem->SetColor(.30,.0,.0,.5,0); mem->SetColor(.20,.10,.10,0.4,1); mem->AddScaleControlPoint(0,0); mem->AddScaleControlPoint(.9,3); mem->AddScaleControlPoint(0.1,0); mem->SetLoopMode(false); } void Missile::Loop(Material* mat) { if(detonationTime > 0) { if(Time::Millisecs() >= detonationTime) { Effect(mat); mem->SetPosition(GetPosition()[0], GetPosition()[1], GetPosition()[2],true); model->Hide(); detonationTime = -1; } } else { if(model->GetPosition().DistanceToPoint(targetDirection) < 0.5) { Effect(mat); mem->SetPosition(targetDirection[0], targetDirection[1], targetDirection[2],true); model->Hide(); } } }
- Read more...
- 0 comments
- 1,413 views