All Projects → markmandel → Brute

markmandel / Brute

Licence: epl-1.0
A simple and lightweight Entity Component System library for writing games with Clojure and ClojureScript.

Programming Languages

clojure
4091 projects
clojurescript
191 projects

Projects that are alternatives of or similar to Brute

Htframework
Unity HTFramework, a rapid development framework of client to the unity.
Stars: ✭ 179 (+5.29%)
Mutual labels:  entity, game
Entitas Csharp
Entitas is a super fast Entity Component System (ECS) Framework specifically made for C# and Unity
Stars: ✭ 5,393 (+3072.35%)
Mutual labels:  entity, game
Entitas Cpp
Entitas++ is a fast Entity Component System (ECS) C++11 port of Entitas C#
Stars: ✭ 229 (+34.71%)
Mutual labels:  entity, game
Slash Framework
Provides both a low-level implementation of component-based entity systems and Unity3D integration for them.
Stars: ✭ 71 (-58.24%)
Mutual labels:  entity, game
Kengine
Entity-Component-System (ECS) with a focus on ease-of-use, runtime extensibility and compile-time type safety and clarity.
Stars: ✭ 417 (+145.29%)
Mutual labels:  entity, game
Geotic
Entity Component System library for javascript
Stars: ✭ 97 (-42.94%)
Mutual labels:  entity, game
Gserver
通用的实时流golang框架,可以方便的创建游戏服务/聊天服务等
Stars: ✭ 164 (-3.53%)
Mutual labels:  game
Superstarfighter
A fast-paced local party game with starships that battle in a 2d top-down arena
Stars: ✭ 164 (-3.53%)
Mutual labels:  game
Aim Ik
A Unity-3D library, to procedural orientate character head (and chest) in a direction without using any animation data.
Stars: ✭ 164 (-3.53%)
Mutual labels:  game
Klooni1010
libGDX game based on the original 1010!
Stars: ✭ 163 (-4.12%)
Mutual labels:  game
Knead proj
游戏中捏脸的实现
Stars: ✭ 169 (-0.59%)
Mutual labels:  game
Umoria
Moria: a roguelike Dungeon Crawler game | Umoria Source Code
Stars: ✭ 167 (-1.76%)
Mutual labels:  game
Unitymathreference
Math reference for games and more. All visualized in Unity3D.
Stars: ✭ 166 (-2.35%)
Mutual labels:  game
Unity Fastpacedmultiplayer
Features a Networking Framework to be used on top of Unity Networking, in order to implement an Authoritative Server with Lag Compensation, Client-Side Prediction/Server Reconciliation and Entity Interpolation
Stars: ✭ 162 (-4.71%)
Mutual labels:  entity
Unity resources
A list of resources and tutorials for those doing programming in Unity.
Stars: ✭ 170 (+0%)
Mutual labels:  game
Yojimbo
A network library for client/server games written in C++
Stars: ✭ 2,041 (+1100.59%)
Mutual labels:  game
Humblebundle
API for managing Humble Bundle games library
Stars: ✭ 169 (-0.59%)
Mutual labels:  game
Open Ig
Free & open-source reimplementation of Imperium Galactica. Download the Installer below the file list!
Stars: ✭ 163 (-4.12%)
Mutual labels:  game
Nashpy
A library for the computation of Nash equilibria in two player games
Stars: ✭ 164 (-3.53%)
Mutual labels:  game
Expo Voxel
🎮🌳 Voxel Terrain made in React Native. ∛
Stars: ✭ 169 (-0.59%)
Mutual labels:  game

Brute

A simple and lightweight Entity Component System library for writing games with Clojure or ClojureScript.

Clojars Version

wercker status

The aim of this project was to use basic Clojure building blocks to form an Entity System architecture, and get out of the author's way when deciding exactly what approach would best fit their game when integrating with this library.

To that end:

  • Entities are UUIDs.
  • The Component type system can be easily extended through a multimethod get-component-type, but defaults to using the component's instance class as its type.
  • Components can therefore be defrecords or deftypes by default, but could easily be maps or just about anything else.
  • Systems are simply references to functions of the format (fn [delta]).

To learn more about Entity Component Systems, please read the Entity Systems Wiki. I personally, also found Adam Martin's Blog Post series very useful at giving a step by step explanation of Entity System architecture.

News

Blog posts and news can be found on the Compound Theory Blog

Usage

See the Library API for all the functionality of this library.

Quick Start

A quick example based overview of what functionality Brute provides.

I've used fully qualified namespace, brute.entity and brute.system to be explicit about what is part of Brute in the demo code below, and what denotes custom code.

Creating the Basic Entity Component System

Brute doesn't store any data in a ref/atom, but instead provides you with the functions and capabilities for manipulating an immutable data structure that represents this ES system. This is particularly useful because:

  • How the entity data structure is persisted is up to you and the library you are using (although 9/10 times I expect it will end up stored in a single atom, and reset! on each game loop), which gives you complete control over when state mutation occurs – if it occurs at all. This makes concurrent processes much simpler to develop.
  • You get direct access to the ES data structure, in case you want to do something with it that isn’t exposed in the current API.
  • You can easily have multiple ES systems within a single game, e.g. for sub-games.
  • Saving a game becomes simple: Just serialise the ES data structure and store. Deserialise to load.
  • Basically all the good stuff having immutable data structures and pure functions should give you.

To create the initial system data structure:

(brute.entity/create-system)

This is actually a map, that lets you access Entities and their Components from a variety of ways, so you can always do it in a performant way.

    {;; Nested Map of Component Types -> Entity -> Component Instance
        :entity-components      {}
     ;; Map of Entities -> Set of Component Types
        :entity-component-types {}}

Do note, that this data structure may be subject to change between releases.

Creating a Ball Entity, with corresponding Component instances.

  • A Ball component instance to know it is a Ball.
  • A Rectangle component instance to draw a rectangle in its' place
  • A Velocity component instance to know what direction it is travelling in, and how fast.
(defn create-ball
    "Creates a ball entity"
    [system]
    (let [ball (brute.entity/create-entity) ;; Returns a UUID for the Entity
          center-x (-> (graphics! :get-width) (/ 2) (m/round))
          center-y (-> (graphics! :get-height) (/ 2) (m/round))
          ball-size 20
          ball-center-x (- center-x (/ ball-size 2))
          ball-center-y (- center-y (/ ball-size 2))
          angle (create-random-angle)]
        (-> system
            (brute.entity/add-entity ball) ;; Adds the entity to the ES data structure and returns it
            (brute.entity/add-component ball (c/->Ball)) ;; Adds the Ball instance to the ES data structure and returns it
            (brute.entity/add-component ball (c/->Rectangle (rectangle ball-center-x ball-center-y ball-size ball-size) (color :white))) ;; Adds the Rectangle instance to the ES data structure and returns it
            (brute.entity/add-component ball (c/->Velocity (vector-2 0 300 :set-angle angle)))))) ;; Adds the Velocity instance to the ES data structure and returns it

Render each of the Entities that have a Rectangle Component

(defn- render-rectangles
    "Render all the rectangles"
    [system]
    (let [shape-renderer (:shape-renderer (:renderer system))]
        (.begin shape-renderer ShapeRenderer$ShapeType/Filled)
        (doseq [entity (brute.entity/get-all-entities-with-component system Rectangle)] ;; loop around all the entities that have a Rectangle Component instance
            (let [rect (brute.entity/get-component system entity Rectangle) ;; get the Rectangle Component Instance for this entity
                  geom (:rect rect)] ;; Rectangle component contains a Rectangle geometry shape.
                (doto shape-renderer ;; Draw the actual rectangle on the screen
                    (.setColor (:colour rect)) ;; Rectangle component contains the colour
                    (.rect (rectangle! geom :get-x)
                           (rectangle! geom :get-y)
                           (rectangle! geom :get-width)
                           (rectangle! geom :get-height)))))
        (.end shape-renderer)))

Systems Management

System management is an optional feature for you to use with Brute.

The following adds each system function to a list contains on the Entity System data structure, maintaining the order in which they were added.

(defn- create-systems
    "register all the system functions"
    [system]
    (-> system
    	(brute.system/add-system-fn input/process-one-game-tick)
    	(brute.system/add-system-fn scoring/process-one-game-tick)
    	(brute.system/add-system-fn ai/process-one-game-tick)
    	(brute.system/add-system-fn physics/process-one-game-tick)
    	(brute.system/add-system-fn rendering/process-one-game-tick)))

Finally call each function in the order added, simply write:

(brute.system/process-one-game-tick system (graphics! :get-delta-time))

Game Examples

Contributing

Pull requests are always welcome!

Active development happens on the develop branch. The master branch is the source for the current release.

Reader Conditionals

This project uses Reader Conditionals to support both Clojure and ClojureScript. It should be a seamless experience.

Testing

To test under Clojure: lein test

To test under ClojureScript: lein cljstest

To run all tests: lein alltest

Run all tests in the a Docker Container

You should be able to run all the tests without having to install anything, except to pull the Docker container.

make test will run all the tests in the development Docker container, which should make development easier.

License

Copyright © 2016 Mark Mandel, Google Inc.

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].