- Fast and modern development: Create boss fights without coding.
- No string attached: Free as in freedom, available even for commercial projects.
- Easy from start to deploy: Easy to get started and easy to publish your game on stores such as Steam and Epic.
| Feature | Supported |
|---|---|
| Playable characters | ✔ |
| Boss fights | ✔ |
| Customize attack patterns, animations, sfx, etc... via JSON | ✔ |
| Windows / Linux / MacOS | ✔ |
| PC, XInput, PS4 and Steam input supported | ✔ |
| Steamworks achievements, stats and leaderboard | ✔ |
| Store, replay and share your best runs | ✔ |
| Libre, MIT licensed | ✔ |
Download the boilerplate example game and run the binary corresponding to your system (./BulletHellGame on Linux and BulletHellGame.exe on Windows).
Playable and enemy characters are defined with the same attributes on a character.json file.
See full character.json attributes.
Example:
{
"velocity": "6",
"animation_velocity": "15",
"hp": "4",
"initial_position": {
"x": "100",
"y": "500"
},
"sounds": {
"hit": "sounds/hit.ogg"
},
"life_bar": {
"x": "0",
"y": "0",
"width": "1920",
"height": "8",
"color":
{
"red": "65",
"green": "255",
"blue": "65"
}
},
"states": [
{
"name": "start",
"sprites": [
{
"path": "ship01.png"
},
{
"path": "ship02.png"
}
]
},
{
"name": "destroyed",
"sprites": [
{
"path": "ship01.png"
}
]
}
],
"hitboxes": [
{
"x": "-10",
"y": "-5",
"width": "1",
"height": "10",
"angle": "0"
}
]
}Also define a collection of bullets with their sprites, sounds, etc...
See full bullets.json attributes.
Example:
{
"bullets":
[
{
"name": "My Bullet",
"damage": "7",
"sprites": [
{
"path": "bullet.png"
}
],
"on_hit_sprites": [
{
"path": "on_hit.png"
}
],
"hitboxes": [
{
"x": "-10",
"y": "-3",
"width": "20",
"height": "6",
"angle": "0"
}
]
}
]
}Attach bullets to patterns to create attacks. Name the character attacks as Primary and Secondary so they get automatically attached to the a and b buttons defined on the config.json. You can name enemy attack patterns as you want and then invoke them when you define the enemy behavior, see Enemy behavior.
See full attacks.json attributes.
Example:
{
"attacks":
[
{
"name": "primary",
"pattern": [
{
"bullet": "My Bullet",
"animation_velocity": "5",
"angle": "0",
"random_angle": "0",
"velocity": "20",
"max_velocity": "25",
"acceleration": "0",
"a_frequency": "0",
"cooldown": "15",
"offset_x": "60",
"offset_y": "0"
}
]
},
{
"name": "secondary",
"pattern": [
{
"bullet": "My Bullet",
"animation_velocity": "5",
"angle": "45",
"random_angle": "0",
"velocity": "20",
"max_velocity": "25",
"acceleration": "0",
"a_frequency": "0",
"cooldown": "15",
"offset_x": "60",
"offset_y": "0"
}
]
}
]
}Change enemy attributes or attacks in a given time or when health goes below certain amount.
See full modifiers.json attributes.
Example:
{
"modifiers":
[
{
"at": "0",
"velocity": "0",
"angle": "180"
},
{
"at": "125",
"velocity": "0",
"angle_change": "0"
},
{
"at": "200",
"pattern_type": "Pattern A"
},
{
"life_at": "4000",
"pattern_type": "Pattern B"
},
{
"life_at": "3000",
"pattern_type": "Pattern C"
},
{
"life_at": "2000",
"pattern_type": "Pattern D"
}
]
}Add animated layers on the front and on the background for pure cosmetic purposes.
See full stage.json attributes.
Example:
{
"bullets_domain": {
"x": "0",
"y": "0",
"width": "1920",
"height": "1080"
},
"back_layers": [
{
"velocity_x": "0",
"x": "0",
"y": "0",
"sprites": [
{
"type": "image",
"path": "background.png"
}
]
},
{
"velocity_x": "-0.5",
"x": "300",
"y": "500",
"separation_x": "1500",
"animation_velocity": "5",
"sprites": [
{
"type": "image",
"path": "planet.png"
}
]
}
]
}Organize the stages order and other stuff here.
See full config.json attributes.
Example:
{
"chars": {
"char": {
"name": "player"
}
},
"stages": {
"stage": [
{
"name": "FirstStage"
},
{
"name": "SecondStage"
}
]
},
"resolution": {
"x": "1920",
"y": "1080"
},
"screen_size": {
"x": "1920",
"y": "1080"
},
"fullscreen": {
"enabled": "no"
},
"font": {
"path": "assets/font.ttf",
"red": "255",
"green": "255",
"blue": "255",
"size": "30"
},
"notifications": {
"background_path": "assets/notification_background.png"
},
"inputs": {
"player": {
"number": "0",
"type": [
{
"name": "keyboard",
"button": [
{
"name": "8",
"key": "up"
},
{
"name": "2",
"key": "down"
},
{
"name": "4",
"key": "left"
},
{
"name": "6",
"key": "right"
},
{
"name": "a",
"key": "z"
},
{
"name": "b",
"key": "x"
},
{
"name": "back",
"key": "q"
}
]
},
{
"name": "gamepad",
"button": [
{
"name": "8",
"key": "up"
},
{
"name": "2",
"key": "down"
},
{
"name": "4",
"key": "left"
},
{
"name": "6",
"key": "right"
},
{
"name": "a",
"key": "1"
},
{
"name": "b",
"key": "2"
},
{
"name": "back",
"key": "4"
}
]
}
]
}
}
}Follow the directory structure so the Bullet Hell Maker detects your characters and stages.
Your game/
│ BulletHellGame
│
└───assets/
│ config.json
│ font.ttf
│
└───chars/
│ └───Your Playable Character/
│ │ bullets.json
│ │ character.json
│ │ attacks.json
└───stages/
└───Your Stage
│ stage.json
│
└───Enemy
│ bullets.json
│ character.json
│ modifiers.json
│ attacks.json
Notice this guide is for compiling the Bullet Hell Maker from source, if you wan't to create a game please refer to the Getting started. docs
# Dependencies
sudo apt-get install g++ cmake libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-net-dev libglew-dev
# Compile
mkdir build
cd build
cmake ..
make


