Skip to content

Rosalila/BulletHellMaker

Repository files navigation

Rosalila Bullet Hell Maker

License Discord GitHub Action

  1. Fast and modern development: Create boss fights without coding.
  2. No string attached: Free as in freedom, available even for commercial projects.
  3. 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

Getting started

Download the boilerplate example game and run the binary corresponding to your system (./BulletHellGame on Linux and BulletHellGame.exe on Windows).

Usage

Characters

Playable and enemy characters are defined with the same attributes on a character.json file.

character.json

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"
    }
  ]
}

Bullets

Also define a collection of bullets with their sprites, sounds, etc...

bullets.json

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"
      }
    ]
  }
]
}

Attack patterns

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.

attacks.json

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"
      }
    ]
  }
]
}

Enemy behavior

Change enemy attributes or attacks in a given time or when health goes below certain amount.

modifiers.json

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"
  }
]
}

Stages

Add animated layers on the front and on the background for pure cosmetic purposes.

stage.json

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"
        }
      ]
    }
  ]
}

General configuration

Organize the stages order and other stuff here.

config.json

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"
            }
          ]
        }
      ]
    }
  }
}

Directory structure

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

Build

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

About

Create shoot 'em ups even if you’re not a programmer.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages