2018-11-14 18:17:25 +01:00
|
|
|
#include "Aircraft.hpp"
|
|
|
|
|
|
|
|
#include <iostream>
|
2021-08-05 16:00:19 +02:00
|
|
|
#include <cAudio.h>
|
2018-11-14 18:17:25 +01:00
|
|
|
#include "Globals.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-11-15 15:37:22 +01:00
|
|
|
|
2018-11-14 18:17:25 +01:00
|
|
|
using namespace irr;
|
|
|
|
using namespace irr::core;
|
|
|
|
|
2018-11-15 15:37:22 +01:00
|
|
|
Aircraft::Aircraft(const line3df &flightLine, u32 flightTimeMillis)
|
|
|
|
: flightDuration(flightTimeMillis)
|
|
|
|
, flightStarted(Globals::getDevice()->getTimer()->getRealTime())
|
2018-11-14 18:17:25 +01:00
|
|
|
{
|
|
|
|
model = Globals::getSceneManager()->addMeshSceneNode(Globals::getSceneManager()->getMesh("../res/SU35S.obj"));
|
|
|
|
model->setPosition(vector3df(25.f, 0.f, 0.f));
|
2018-11-15 15:37:22 +01:00
|
|
|
a = Globals::getSceneManager()->createFlyStraightAnimator(flightLine.start,
|
|
|
|
flightLine.end,
|
|
|
|
flightTimeMillis,
|
|
|
|
false,
|
|
|
|
false);
|
|
|
|
|
|
|
|
auto dvec = (flightLine.end - flightLine.start).normalize();
|
|
|
|
f64 rotBy = vector2df(dvec.X, dvec.Z).getAngleTrig();
|
|
|
|
model->setRotation(vector3df(0.f, -rotBy, 0.f));
|
2018-11-14 18:17:25 +01:00
|
|
|
|
|
|
|
model->addAnimator(a);
|
2018-11-15 15:37:22 +01:00
|
|
|
flybySound = Globals::getAudioManager()->create("flybySound", "../res/flyby.wav", false);
|
|
|
|
//std::cout << "Aircraft from " << flightTimeMillis << ' ' << flightLine.start.Y << " to " << flightLine.end.X << ' ' << flightLine.end.Y << " at " << flightLine.start.Z << std::endl;
|
2018-11-14 18:17:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Aircraft::~Aircraft()
|
|
|
|
{
|
2018-11-15 15:37:22 +01:00
|
|
|
a->drop();
|
2018-11-14 18:17:25 +01:00
|
|
|
Globals::getSceneManager()->addToDeletionQueue(model);
|
|
|
|
std::cout << "~Aircraft" << std::endl;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Aircraft::isGood() const
|
|
|
|
{
|
|
|
|
return healthy;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Aircraft::isTerminated() const
|
|
|
|
{
|
|
|
|
return a->hasFinished();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Aircraft::evalShot(const irr::core::line3df &shotline)
|
|
|
|
{
|
|
|
|
bool hit = model->getTransformedBoundingBox().intersectsWithLine(shotline);
|
|
|
|
if (hit)
|
|
|
|
{
|
|
|
|
if (healthy)
|
|
|
|
{
|
|
|
|
// got hit for the first time: do smokey?
|
|
|
|
auto pman = Globals::getSceneManager()->addParticleSystemSceneNode(true, model);
|
2018-11-19 01:07:50 +01:00
|
|
|
pman->getEmitter()->setMinStartSize(dimension2df(80.f, 80.f));
|
|
|
|
pman->getEmitter()->setMaxStartSize(dimension2df(120.f, 120.f));
|
2018-11-14 18:17:25 +01:00
|
|
|
pman->getEmitter()->setDirection(vector3df(0.f, 0.f, 0.f));
|
2018-11-19 01:07:50 +01:00
|
|
|
pman->setMaterialTexture(0, Globals::getVideoDriver()->getTexture("../res/smoke.png"));
|
|
|
|
pman->setMaterialTexture(1, Globals::getVideoDriver()->getTexture("../res/smoke1.png"));
|
|
|
|
pman->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
|
|
|
|
pman->setMaterialFlag(video::EMF_LIGHTING, false);
|
2018-11-14 18:17:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
healthy = false;
|
|
|
|
}
|
|
|
|
return hit;
|
|
|
|
}
|
2018-11-15 15:37:22 +01:00
|
|
|
|
|
|
|
void Aircraft::update(u32 curMS)
|
|
|
|
{
|
|
|
|
if (!flybySound->isPlaying())
|
|
|
|
{
|
|
|
|
|
|
|
|
u32 curTime = curMS;
|
|
|
|
curTime -= flightStarted;
|
|
|
|
if (curTime > flightDuration / 2 - 4000 && curTime < flightDuration / 2)
|
|
|
|
{
|
|
|
|
auto p = model->getAbsolutePosition();
|
|
|
|
flybySound->play3d(cAudio::cVector3(p.X, p.Y, p.Z));
|
|
|
|
//std::cout << "PLAY!" << std::endl;
|
|
|
|
// flybySound->play2d();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
auto p = model->getAbsolutePosition();
|
|
|
|
flybySound->move(cAudio::cVector3(p.X, p.Y, p.Z));
|
|
|
|
}
|
|
|
|
}
|
2018-11-15 18:17:22 +01:00
|
|
|
|
|
|
|
vector3df Aircraft::getPosition() const
|
|
|
|
{
|
|
|
|
return model->getAbsolutePosition();
|
|
|
|
}
|