Package selection guidance compiled from public package information, community data, and project usage.
Dartemis is a lightweight Entity-Component-System (ECS) framework for game development in Dart, inspired by the Artemis framework. It provides a structured approach to managing game entities, components, and systems, promoting performance and scalability. Designed for use with Flutter, it supports multiple platforms including Android, iOS, Web, macOS, Windows, and Linux. The framework enables efficient data-driven game logic through separation of concerns, making it ideal for complex game architectures. Developers can easily extend functionality using custom systems and components.
Use cases
Building 2D/3D games
Managing large numbers of game entities
Implementing data-driven game logic
Creating modular game systems
Optimizing performance in game loops
Key features
Entity-Component-System architecture
High performance and low memory overhead
Cross-platform support
Extensible system and component model
Built-in event and query system
Suitable for
Game developers using Flutter
Projects requiring scalable entity management
Teams building complex game mechanics
Developers seeking ECS best practices
Performance-critical applications
Considerations
Requires understanding of ECS patterns
Steeper learning curve for beginners
Limited built-in graphics or audio support
Not a full game engine
Best used with additional tooling for debugging
Original README
Original README snapshot from the linked source repository. Visit the repository for the latest content.
dartemis is a Dart port of the Entity System Framework Artemis.
The original has been written in Java by Arni Arent and Tiago Costa and can be found here:
https://gamadu.com/artemis/ (archived) with the source available here:
https://code.google.com/p/artemis-framework/
A Component is a pretty simple structure and should not contain any logic:
classPositionextendsComponent{
num x, y;
Position(this.x, this.y);
}
Or if you want to use a PooledComponent:
classPositionextendsPooledComponent{
latenum x, y;
Position._();
factoryPosition(num x, num y) {
final position = Pooled.of<Position>(() => Position._())
..x = x
..y = y;
return position;
}
}
By using a factory constructor and calling the static function Pooled.of, dartemis is able to reuse destroyed components and they will not be garbage collected.
Define a systems that should process your entities. The Aspect defines which components an entity needs to have in order to be processed by the system:
classMovementSystemextendsEntityProcessingSystem{
lateMapper<Position> positionMapper;
lateMapper<Velocity> velocityMapper;
MovementSystem() : super(Aspect.forAllOf([Position, Velocity]));
voidinitialize() {
// initialize your system// Mappers, Systems and Managers have to be assigned here// see dartemis_builder if you don't want to write this code
positionMapper = Mapper<Position>(world);
velocityMapper = Mapper<Velocity>(world);
}
voidprocessEntity(Entity entity) {
Position position = positionMapper[entity];
Velocity vel = velocityMapper[entity];
position
..x += vel.x * world.delta
..y += vel.y * world.delta;
}
}
darteroids - Very simple example included in the example folder of dartemis, (Source)
Shapeocalypse - A fast paced reaction game using
Angular, WebAudio and WebGL
damacreat - An iogame similar to agar.io about creatures
made of dark matter (circles) consuming dark energy (circles) and other dark matter creatures (circles), which can shoot black holes (circles)