quick fixes right before presentation, added readme
This commit is contained in:
parent
73b9141d3b
commit
c8b31268ee
19
README.md
19
README.md
|
@ -1,2 +1,21 @@
|
||||||
# flasim
|
# 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
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 61 KiB |
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
|
@ -57,7 +57,13 @@ bool Aircraft::evalShot(const irr::core::line3df &shotline)
|
||||||
{
|
{
|
||||||
// got hit for the first time: do smokey?
|
// got hit for the first time: do smokey?
|
||||||
auto pman = Globals::getSceneManager()->addParticleSystemSceneNode(true, model);
|
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->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;
|
healthy = false;
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace cAudio
|
||||||
class IAudioSource;
|
class IAudioSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Sends an aircraft along a line in a given time. Handles hits and smoke - that all
|
||||||
class Aircraft
|
class Aircraft
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -20,7 +20,7 @@ Dispatcher::~Dispatcher()
|
||||||
|
|
||||||
void Dispatcher::start()
|
void Dispatcher::start()
|
||||||
{
|
{
|
||||||
lastDispatchMS = Globals::getDevice()->getTimer()->getRealTime();
|
lastDispatchMS = Globals::getDevice()->getTimer()->getRealTime() - 40000;
|
||||||
active = true;
|
active = true;
|
||||||
aircraftsRemaining = 5;
|
aircraftsRemaining = 5;
|
||||||
points = 0;
|
points = 0;
|
||||||
|
@ -112,5 +112,5 @@ void Dispatcher::dispatchAircraft()
|
||||||
line3df l;
|
line3df l;
|
||||||
l.start = vector3df(start.X, alt, start.Y);
|
l.start = vector3df(start.X, alt, start.Y);
|
||||||
l.end = vector3df(end.X, alt, end.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>
|
#include <irrlicht.h>
|
||||||
|
|
||||||
|
//! Spawns aircraft, conducts hit-testing and points counting
|
||||||
class Dispatcher
|
class Dispatcher
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -42,7 +42,7 @@ FireUnit::FireUnit()
|
||||||
mflashR->setVisible(false);
|
mflashR->setVisible(false);
|
||||||
|
|
||||||
fireSound = Globals::getAudioManager()->create("fireSound", "../res/gunburst.wav", false);
|
fireSound = Globals::getAudioManager()->create("fireSound", "../res/gunburst.wav", false);
|
||||||
|
screenSize = Globals::getVideoDriver()->getScreenSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
FireUnit::~FireUnit()
|
FireUnit::~FireUnit()
|
||||||
|
@ -143,6 +143,11 @@ void FireUnit::draw()
|
||||||
{
|
{
|
||||||
auto drv = Globals::getVideoDriver();
|
auto drv = Globals::getVideoDriver();
|
||||||
auto& res = drv->getScreenSize();
|
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 );
|
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;
|
stripsRemaining = 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//drv->draw3DLine(shotline.start, shotline.end);
|
|
||||||
//cout << tgt.X << ' ' << tgt.Y << ' ' << tgt.Z << endl;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ namespace cAudio
|
||||||
class IAudioSource;
|
class IAudioSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Cannon control, input handling
|
||||||
class FireUnit : public irr::IEventReceiver
|
class FireUnit : public irr::IEventReceiver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -35,6 +36,7 @@ private:
|
||||||
irr::u32 reloadUntil;
|
irr::u32 reloadUntil;
|
||||||
|
|
||||||
class cAudio::IAudioSource* fireSound;
|
class cAudio::IAudioSource* fireSound;
|
||||||
|
irr::core::dimension2du screenSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FIREUNIT_HPP
|
#endif // FIREUNIT_HPP
|
||||||
|
|
|
@ -42,8 +42,6 @@ FlaSimApp::FlaSimApp()
|
||||||
{
|
{
|
||||||
cout << "Joystick support is enabled and " << joystickInfo.size() << " joystick(s) are present." << endl;
|
cout << "Joystick support is enabled and " << joystickInfo.size() << " joystick(s) are present." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FlaSimApp::~FlaSimApp()
|
FlaSimApp::~FlaSimApp()
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "FireUnit.hpp"
|
#include "FireUnit.hpp"
|
||||||
|
|
||||||
|
//! Main app class
|
||||||
class FlaSimApp : public irr::IEventReceiver
|
class FlaSimApp : public irr::IEventReceiver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -10,7 +10,8 @@ Globals* Globals::instance = nullptr;
|
||||||
|
|
||||||
Globals::Globals()
|
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();
|
drv = dev->getVideoDriver();
|
||||||
sman = dev->getSceneManager();
|
sman = dev->getSceneManager();
|
||||||
dispatcher = new Dispatcher();
|
dispatcher = new Dispatcher();
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace irr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Globally used stuff (mostly irrlicht-related) packed in a singleton
|
||||||
class Globals
|
class Globals
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include <irrlicht.h>
|
#include <irrlicht.h>
|
||||||
|
|
||||||
|
//! Super simple scene node animator that makes the camera look along the cannon
|
||||||
class TurretCamAnimator : public irr::scene::ISceneNodeAnimator
|
class TurretCamAnimator : public irr::scene::ISceneNodeAnimator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue