Baku
Baku provides a simple Entity Component System framework for use with Ruby game engines. It has been tested with Gosu, but should be flexible enough to work with any Ruby project that has a game loop.
Baku is still very much a work in progress. There are undoubtedly bugs. I will be continually iterating and improving on it as I use it for my personal game development projects. Enjoy!
Installation
Add this line to your application's Gemfile:
gem 'baku'
And then execute:
$ bundle
Or install it yourself as:
$ gem install baku
Usage
Create components by overriding Baku::Component
and calling super()
. The
example component below simple stores the x and y coordinates of an entity in
a 2D space.
class TransformComponent < Baku::Component
attr_accessor :x, :y
def initialize(x, y)
super()
@x = x
@y = y
end
end
Create systems by overriding Baku::System
and calling super()
to specify the
components that an entity must possess in order for it to be processed by the
system. The example system below will only operate on entities that possess both
a TransformComponent
and a VelocityComponent
. You will also need to specify
whether the system will be run during the :update
or :draw
loop.
class MovementSystem < Baku::System
def initialize
super([TransformComponent, VelocityComponent], :update)
end
def process_entity(entity, transform, velocity)
transform.x += velocity.x
transform.y += velocity.y
end
end
In your game initialization logic, create a Baku::World
instance and register
any systems you want to use. In the below example, we register our example
system from above and create an entity that will be processed by the system:
def game_initialization
@world = Baku::World.new
@world.add_system(MovementSystem.new)
entity = @world.create_entity
entity.add_component(TransformComponent)
entity.add_component(VelocityComponent)
end
In your game update
and draw
loops, call the Baku::World
instance's
update
and draw
methods. You'll want to keep track of the millseconds
between frames and pass that to the update
method if you're planning to
use the entity component system for anything that needs it.
def game_update_loop
@world.update(delta_ms)
end
def game_draw_loop
@world.draw
end
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run
rake spec
to run the tests. You can also run bin/console
for an interactive
prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To
release a new version, update the version number in version.rb
, and then run
bundle exec rake release
, which will create a git tag for the version, push git
commits and tags, and push the .gem
file to
rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/jtuttle/baku.
License
The gem is available as open source under the terms of the MIT License.