Ark Tools

March 17, 2025 ยท View on GitHub

Test status Coverage Status Go Report Card Go Reference GitHub MIT license

Ark Tools provides systems, a scheduler, and other useful stuff for the Ark Entity Component System (ECS). It's purpose is to get started with prototyping and developing simulation models immediately, focussing on the model logic.

Ark (logo)

Features

  • Scheduler for running logic and UI systems with independent update rates.
  • Interfaces for ECS systems and observers.
  • Ready-to-use systems for common tasks like writing CSV files or terminating a simulation.
  • Common ECS resources, like central PRNG source or the current update tick.

Installation

go get github.com/mlange-42/ark-tools

Usage

See the API docs for more details and examples.
Go Reference

package main

import (
	"github.com/mlange-42/ark-tools/app"
	"github.com/mlange-42/ark-tools/system"
	"github.com/mlange-42/ark/ecs"
)

// Position component.
type Position struct {
	X float64
	Y float64
}

// Velocity component.
type Velocity struct {
	X float64
	Y float64
}

func main() {
	// Create a new, seeded app.
	app := app.New(1024).Seed(123)
	// Limit simulation speed.
	app.TPS = 30

	// Add systems to the app.
	app.AddSystem(&VelocitySystem{EntityCount: 1000})
	// Add a termination system that ends the simulation.
	app.AddSystem(&system.FixedTermination{Steps: 100})

	// Run the app.
	app.Run()
}

// VelocitySystem is an example system adding velocity to position.
// For simplicity, it also creates entities during initialization.
type VelocitySystem struct {
	EntityCount int
	filter      *ecs.Filter2[Position, Velocity]
}

// Initialize the system.
func (s *VelocitySystem) Initialize(w *ecs.World) {
	s.filter = s.filter.New(w)

	mapper := ecs.NewMap2[Position, Velocity](w)
	mapper.NewBatch(s.EntityCount, &Position{}, &Velocity{})
}

// Update the system.
func (s *VelocitySystem) Update(w *ecs.World) {
	query := s.filter.Query()

	for query.Next() {
		pos, vel := query.Get()
		pos.X += vel.X
		pos.Y += vel.Y
	}
}

// Finalize the system.
func (s *VelocitySystem) Finalize(w *ecs.World) {}

License

This project is distributed under the MIT licence.