Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
wwfranczyk committed Jul 29, 2021
1 parent af4b648 commit a8588a9
Showing 1 changed file with 86 additions and 0 deletions.
86 changes: 86 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,92 @@
# About
Ento is an Entity Component System written in Go.

# Getting Started

See [examples](./examples) folder.

From [hello.go](./examples/hello/hello.go):

```go
package main

type Component1 struct{ value int }
type Component2 struct{ value int }
type Component3 struct{ value int }

type System struct {
// Always use pointer to base component type (!)
// Add `ento:"bind"` tag to automatically bind components
Component1 *Component1 `ento:"bind"`

// Components are bound by type, not name
Renamed *Component2 `ento:"bind"`

// Systems can have non-component-bound fields
calls int
}

// Update implements ento.System
// It will be called only for entities that have both tagged components
func (s *System) Update(entity *ento.Entity) {
// Access automatically bound components from currently passed entity
s.Component1.value += s.Renamed.value

// Get components from entity manually (somewhat slower than automatic binding)
// Can be used for "optional" components
var c3 *Component3
entity.Get(&c3)

// If entity does not have the component, the pointer value will be set to nil
if c3 != nil {
s.Component1.value += c3.value
}

s.calls++
}

func (s *System) reportCalls() {
println(s.calls)
s.calls = 0
}

func main() {
// Create the world and register components
world := ento.NewWorldBuilder().
// Use "zero-values" as values are ignored when registering
WithSparseComponents(Component1{}, Component2{}, Component3{}).
// Pre-allocate space for 256 entities (world can grow beyond that automatically)
Build(256)

// Add systems
system := &System{}
world.AddSystems(system)

// Create entities (they are added to the world immediately)
world.NewEntity(Component1{1}, Component2{2}, Component3{3})

// Use Set to add or update their components
entity := world.NewEntity()
entity.Set(Component1{0}) // Will not be handled by System

// Update the world
world.Update()
system.reportCalls() // Prints: 1

// Update the entity (add Component2)
entity.Set(Component2{5})

world.Update()
system.reportCalls() // Prints: 2

// Update the entity (remove Component2)
entity.Rem(Component2{})

world.Update()
system.reportCalls() // Prints: 1
}
```

# License

Ento is distributed under MIT license.
Expand Down

0 comments on commit a8588a9

Please sign in to comment.