Commit c8b31268 authored by ottona's avatar ottona

quick fixes right before presentation, added readme

parent 73b9141d
# flasim
FlaSim is a mini game I did as a birthday party gag. It lets you manually control an anti-aircraft cannon with your joystick. Five jets are then randomly spawned (one after the other) as targets to be engaged by the player.
## Controls
You'll need a joystick to play the game. The game starts out with no enemies so you can get used to steering the cannons. Joystick button 1 fires, button 2 reloads the guns (15 seconds penalty). Pressing F9 activates the game mode which spawns a plane every 45 secs (so scan your horizon!), F10 quits game mode (same as when 'aircraft remain' is zero), F12 quits the game.
Successfully engaging a plane rewards you with 1000 points plus bonus for the distance (the further out the more points). Relevant info is shown in the top-left corner.
## About the game
The game uses the irrlicht graphics engine for the eye and cAudio for the ear. It's quite of simple complexity and might hence serve as a good example for someone learning about game and/or graphics programming.
About the visual content shown in the game: I did some parts myself (cannon model, crosshairs, terrain), all other stuff is from free content websites.
## Building flasim
Currently only Linux works, should have a windows buildability in a couple of days.
The game is written in QtCreator and hence uses the qmake build system. You should have gcc, qmake, irrlicht and cAudio installed and handy.
cd to the 'prj' folder and run qmake to get a Makefile out of flasim.pro. Build the game using 'make'. Done.
Questions? Reach me at otto@socialnerds.org
......@@ -57,7 +57,13 @@ bool Aircraft::evalShot(const irr::core::line3df &shotline)
{
// got hit for the first time: do smokey?
auto pman = Globals::getSceneManager()->addParticleSystemSceneNode(true, model);
pman->getEmitter()->setMinStartSize(dimension2df(80.f, 80.f));
pman->getEmitter()->setMaxStartSize(dimension2df(120.f, 120.f));
pman->getEmitter()->setDirection(vector3df(0.f, 0.f, 0.f));
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);
}
healthy = false;
......
......@@ -5,6 +5,7 @@ namespace cAudio
class IAudioSource;
}
//! Sends an aircraft along a line in a given time. Handles hits and smoke - that all
class Aircraft
{
public:
......
......@@ -20,7 +20,7 @@ Dispatcher::~Dispatcher()
void Dispatcher::start()
{
lastDispatchMS = Globals::getDevice()->getTimer()->getRealTime();
lastDispatchMS = Globals::getDevice()->getTimer()->getRealTime() - 40000;
active = true;
aircraftsRemaining = 5;
points = 0;
......@@ -112,5 +112,5 @@ void Dispatcher::dispatchAircraft()
line3df l;
l.start = vector3df(start.X, alt, start.Y);
l.end = vector3df(end.X, alt, end.Y);
aircrafts.push_back(std::make_shared<Aircraft>(l, 30000 + static_cast<u32>(rand->frand() * 30000.f)));
aircrafts.push_back(std::make_shared<Aircraft>(l, 30000 + static_cast<u32>(rand->frand() * 15000.f)));
}
......@@ -3,6 +3,7 @@
#include <irrlicht.h>
//! Spawns aircraft, conducts hit-testing and points counting
class Dispatcher
{
public:
......
......@@ -42,7 +42,7 @@ FireUnit::FireUnit()
mflashR->setVisible(false);
fireSound = Globals::getAudioManager()->create("fireSound", "../res/gunburst.wav", false);
screenSize = Globals::getVideoDriver()->getScreenSize();
}
FireUnit::~FireUnit()
......@@ -143,6 +143,11 @@ void FireUnit::draw()
{
auto drv = Globals::getVideoDriver();
auto& res = drv->getScreenSize();
if (screenSize != res)
{
screenSize = res;
cam->setAspectRatio(static_cast<f32>(res.Width) / static_cast<f32>(res.Height));
}
drv->draw2DImage(crosshair, position2di(res.Width / 2 - 128, res.Height / 2 - 128), recti(0, 0, 256, 256), nullptr, video::SColor(255,255,255,255), true );
......@@ -182,6 +187,4 @@ void FireUnit::draw()
stripsRemaining = 5;
}
}
//drv->draw3DLine(shotline.start, shotline.end);
//cout << tgt.X << ' ' << tgt.Y << ' ' << tgt.Z << endl;
}
......@@ -8,6 +8,7 @@ namespace cAudio
class IAudioSource;
}
//! Cannon control, input handling
class FireUnit : public irr::IEventReceiver
{
public:
......@@ -35,6 +36,7 @@ private:
irr::u32 reloadUntil;
class cAudio::IAudioSource* fireSound;
irr::core::dimension2du screenSize;
};
#endif // FIREUNIT_HPP
......@@ -42,8 +42,6 @@ FlaSimApp::FlaSimApp()
{
cout << "Joystick support is enabled and " << joystickInfo.size() << " joystick(s) are present." << endl;
}
}
FlaSimApp::~FlaSimApp()
......
#include "FireUnit.hpp"
//! Main app class
class FlaSimApp : public irr::IEventReceiver
{
public:
......
......@@ -10,7 +10,8 @@ Globals* Globals::instance = nullptr;
Globals::Globals()
{
dev = createDevice(video::EDT_OPENGL, core::dimension2du(1600, 900), 32, false, false, true);
dev = createDevice(video::EDT_OPENGL, core::dimension2du(1366, 768), 32, false, false, true);
dev->setResizable(true);
drv = dev->getVideoDriver();
sman = dev->getSceneManager();
dispatcher = new Dispatcher();
......
......@@ -24,7 +24,7 @@ namespace irr
}
}
//! Globally used stuff (mostly irrlicht-related) packed in a singleton
class Globals
{
public:
......
#include <irrlicht.h>
//! Super simple scene node animator that makes the camera look along the cannon
class TurretCamAnimator : public irr::scene::ISceneNodeAnimator
{
public:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment