The Isetta Engine is a C++ game engine developed over 3 months for the twin-stick shooter genre. Please visit our website https://isetta.io for a full documentation of our journey in making this engine.
- A 64-bit Windows operating system (How to check?)
- Visual Studio 2017
- Install VC++ 2017 and Windows 10 SDK (10.0.17134.0). With Visual Studio Installer, select "Desktop development with C++" and the correct Windows 10 SDK version.
- You may need to restart your computer
- CMake 3.10.2 or later
- Make sure you add it to your PATH (either check the box during the installation process of follow this)
To clone the engine:
git clone --recursive https://github.com/Isetta-Team/Isetta-Engine.git
Before you build you must pull and build the submodules:
- Pull all submodules by using
git submodule update --init --recursive
- Build the submodules
- GLFW & Horde3D. Either:
- Run the
Dependency.bat
batch script in the repo (requires CMake in path), if it failed, see below - Build manually:
- GLFW:
- Open a CMake Window
- Set the source path to
REPO/Isetta/External/GLFW
- Set the binary path to
REPO/Isetta/External/GLFW/Build
- Click "configure" (select Visual Studio 15 2017 Win64 compiler), "generate" and then "open" the project
- Build under both Debug and Release configurations
- Horde3D (should be built AFTER GLFW):
- Open a CMake Window
- Set the source path to
REPO/Isetta/External/Horde3D
- Set the binary path to
REPO/Isetta/External/Horde3D/Build
- Configure (select Visual Studio 15 2017 Win64 compiler)
- Set the
GLFW_INCLUDE_DIR
toREPO/Isetta/External/GLFW/include
- Set the
GLFW_LIBRARY_PATH
toREPO/Isetta/External/GLFW/Build/src/Release/glfw3.lib
- Uncheck
HORDE_BUILD_EXAMPLES
- Generate and open the project
- Build under both Debug and Release configurations
- GLFW:
- Run the
- ImGui
- Open the Isetta.sln
- In the solution explorer expand the folders:
Solution 'Isetta' > External > imgui
- Right-click lib_glfw_opengl3, select
Build
- Yojimbo
- Go to the yojimbo folder and run
.\premake5.exe solution
- Build the yojimbo project (only that project, not the entire solution!) for both the Release and Debug configurations
- Go to the yojimbo folder and run
- GLFW & Horde3D. Either:
You can start playing with our first demo game! You'll need a controller for it.
- Set build configuration to
Debug DLL
- Set "IsettaTestBed" as start up project
- Build "IsettaEngine"
- Set
start_level
inconfig.cfg
oruser.cfg
to "Level1"- Refer below for configuration settings
- Build and run and start playing! There will also be a bunch of values for you to tweak
There are currently 3 configuration options with this solution of the engine:
- Debug:
Debug
settings and level is built/run in-engine (not using engine dll) - Debug DLL:
Debug
settings and level uses engine DLL (separate project from engine source) - Release:
Release
settings (optimized code) and level is built/run in-engine (not using engine dll)
There are different levels available in the projects of the solution; ones in IsettaEngine have most recent/testing features, ones in IsettaTestbed are functional tech demos and games. To run any level built within the engine, use Debug or Release and set startup project as IsettaEngine (right-click the IsettaEngine project and select "Set as Startup Project"). To run any level within IsettaTestbed, the configuration must be Debug DLL (to build the engine into a DLL), the startup project should then be IsettaTestbed.
Debug DLL
will build the .dll
for you to use and export. To use your version of the engine in another solution/project, build with Debug DLL
and use those .dll
and .lib
built files in your project (follow Isetta-Game instructions for more information). You will also need to export your changed header files, external library headers, resources, etc. Use the ExportHeaders.bat
batch script, located in the top level of the repo, which will export all of the necessary files to a folder labeled includes. You can alter the batch script as needed to include more/less of the engine.
The configuration settings of the engine are placed with config.cfg
within the IsettaEngine folder.
For personal configuration settings, create a user.cfg
in the same folder as config.cfg
If you want any personal options when using the engine (such as selecting a level for your computer to run) without changing the config.cfg
you will need a user.cfg
. You will need a user.cfg
for each project (ie. IsettaEngine, IsettaTest, and IsettaTestbed), this fill needs to be placed at the root directory of the project (not the .sln).
In our engine, we have lots of predefined components that you can use out of the box!
Component Name | Component Description |
---|---|
Nav2DAgent |
Agent that is moved on a Nav2DPlane. |
Component Name | Component Description |
---|---|
AudioSource |
... |
AudioListener |
... |
Component Name | Component Description |
---|---|
BoxCollider |
... |
CapsuleCollider |
... |
SphereCollider |
... |
CollisionHandler |
... |
Component Name | Component Description |
---|---|
AxisDrawer |
... |
FlyController |
... |
GridComponent |
... |
NetworkMonitor |
... |
Component Name | Component Description |
---|---|
AnimationComponent |
... |
CameraComponent |
... |
LightComponent |
... |
MeshComponent |
... |
ParticleSystemComponent |
... |
Component Name | Component Description |
---|---|
NetworkDiscovery |
... |
NetworkId |
... |
NetworkTransform |
... |
In your user.cfg
add the lines:
# Level Settings
start_level = LEVEL_NAME
LEVEL_NAME
can then be replaced with any of these options:
- When running IsettaEngine: Level Folder
Level Name | Level Description | Level Inputs |
---|---|---|
EmptyLevel |
Empty level to be used as a starting point for user created levels | N/a |
NoCameraLevel |
Level that may be used when the user doesn't have a camera in their own level | N/a |
- When running IsettaTestBed: Level Folder
Level Name | Level Description | Level Inputs |
---|---|---|
AILevel |
Level showing how navigation module works in the engine and how to use the particle system | WASD : Move the cube around J : Spawn one navigation agent K : Spawn one hundred navigation agent L : Turn off the fire O : Turn on the fire P : Remove the top left target |
AudioLevel |
Level with 2D and 3D audio looping and one shot | NUM2 : 2D audio play/pause loop NUM3 : 3D audio play/pause one shot |
BVHLevel |
Level testing our dynamic AABB tree | FlyController LEFT_CLICK : Raycast colliders KP_5 : Spawn 100 entities each with their sphere collider KP_6 : Spawn 1 entity with sphere collider KP_4 : Destroy an entity spawn KP_ENTER : Show/Hide AABB of spheres SPACE : Start/Stop spheres from moving KP_7 : Decrease spheres' movement range KP_9 : Increase spheres' movement range |
CollisionsLevel |
Level testing our collision intersections | FlyController LEFT_CLICK : Raycast colliders |
CollisionSolverLevel |
Level testing our collision solving system | FlyController KeyTransform 1 : Select the box collider to move 2 : Select the sphere collider to move 3 : Select the capsule collider to move 9 : Decrease the mass of the sphere collider by 10 (can go negative) 0 : Increase the mass of the sphere collider by 10 |
DebugLevel |
Level demoing our debug drawing capabilities | FlyController V : Draw ray in a circle while pressed B : Draw plane while pressed |
EditorLevel |
Level showing the editor components: inspector, heirarchy, and console and level loading menu | ESC : close window EditorComponent CTRL+SHIFT+ : H -hierarchy, I -inspector, F -frame reporter, C -console, M -menu |
EmptyLevel |
Empty level to be used as a starting point for user created levels | N/a |
EventLevel |
Level demoing our event messaging system with sender and listener components | A : Raise a queued event S : Raise an immediate event D Raise three queued events with different priorities and timeframes |
ExampleLevel |
Level with an animating model and example component | FlyController UP_ARROW : Move the wire box forward DOWN_ARROW : Move the wire box backward LEFT_ARROW : Make the wire box turn left RIGHT_ARROW : Make the wire box turn Right |
GUILevel |
Level demoing some of our GUI capabilities | N/a |
InputLevel |
Level demoing some of the input capabilities | A : press/release messages MOUSE_LEFT : message on 1st click GAMEPAD_{X,B,MOUSE_MIDDLE} : message while pressed/down |
LevelLoadingLevel |
Level showing a menu to browse levels and load specific level | ESC : close window |
MeshAnimLevel |
Level with a mesh that is being animated | FlyController |
NetworkLevel |
Level demoing some of our networking capabilities. The default_server_ip in config should be set to your LAN IP for this level to work. |
FlyController Y : Spawn a zombie across the network H : Despawn a zombie across the network (can only be done by the spawner!) U : Spawn a zombie and set its parent to the previously spawned zombie I : Parent the previously spawned zombie to the zombie spawned before it K : Unparent the previously spawned zombie from its parent P : Send a generic handle message with integer 0 O : Send a generic handle message with integer 1 Mouse Left : Send a generic handle message with integer 2 F1 : Start host F2 : Start pure server F3 : Start client NUM1 : Start broadcasting messages to all computers in LAN NUM2 : Start listening to broadcast messages Keypad9 : Switch to another level using NetworkLoadLevel Keypad7 : Switch back to NetworkLevel using NetworkLoadLevel |
PrimitiveLevel |
Level displaying all the types of primitive objects | FlyController |
SkeletonLevel |
Level displaying a mesh and entities used to follow the skeleton | N/a |
Halves |
First demo twin-stick shooter game we created! Only support gamepads | LFET_STICK : move around RIGHT_STICK : shoot |
KnightGame |
Game with a knight and a sword, can you take down the most training dummies? | LEFT_STICK : moves knight RIGHT_TRIGGER : raises/lowers sword RIGHT_STICK : spin it in a complete circle for flame protection |
Week10MiniGame |
First demo game with networking. Fool your enemy with your sword young man! | NUM1 : Start as a host NUM2 : Start as a client R : Ready for the fight AD : Move left or right Up/Down Arrow : Switch the sword position Space : Stab! |
Assuming you have checked out master, you are looking at our latest work. If you would like to view the engine from the start you can use the tags feature to see the code week to week. If you are interested in a specific feature, there are branches for each of the major systems of development for you to checkout
(the majority of development happened on those branches, we slipped up sometimes and made changes on staging).
Game engine development is a very wide field in the industry, but also a very inaccessible one. Budding engineers are advised to just jump into development to learn, and it's for this reason that the Isetta Engine project came to be.
Our team is building a game engine specialized for the twin-stick shooter genre. Every step of the way we will be documenting our process through a dedicated blog. Readers can hear from us personally and get an in-depth look at our journey to create the engine. In addition, we will supplement our content through regular interviews with industry professionals who have built their own engines before.
Between our own hands-on process and sage advice from veteran engineers, we hope to give newcomers a clearer representation of the engine-building process.
This project will span from August to December of 2018 and all of our progress and code will be accessible via the git repo.