API
Ark's public API.
World
The World is the central data storage for Entities, Components and Resources.
Ark.World — TypeWorld{CS<:Tuple,CT<:Tuple,N}The World is the central ECS storage.
Ark.World — MethodWorld(comp_types::Type...; allow_mutable::Bool=false)Creates a new, empty World for the given component types.
Arguments
comp_types: The component types used by the world.allow_mutable: Allows mutable components. Use with care, as all mutable objects are heap-allocated in Julia.
Example
world = World(Position, Velocity)
;Ark.is_locked — Functionis_locked(world::World)::BoolReturns whether the world is currently locked for modifications.
Entities
Entities are the "game objects" or "model entities". An entity if just an ID with a generation, but Components can be attached to an entity.
Ark.Entity — TypeEntityEntity identifier.
Ark.zero_entity — Constantconst zero_entity::EntityThe reserved zero Entity value.
Ark.new_entity! — Functionnew_entity!(world::World, values::Tuple)::EntityCreates a new Entity with the given component values. Types are inferred from the values.
Ark.new_entities! — Functionnew_entities!(world::World, n::Int, defaults::Tuple; iterate::Bool=false)::Union{Batch,Nothing}Creates the given number of Entity, initialized with default values. Component types are inferred from the provided default values.
If iterate is true, a Batch iterator over the newly created entities is returned that can be used for initialization.
Arguments
world::World: TheWorldinstance to use.n::Int: The number of entities to create.defaults::Tuple: A tuple of default values for initialization, like(Position(0, 0), Velocity(1, 1)).iterate::Bool: Whether to return a batch for individual entity initialization.
new_entities!(world::World, n::Int, comp_types::Tuple{Vararg{Val}})::BatchCreates the given number of Entity.
Returns a Batch iterator over the newly created entities that should be used to initialize components. Note that components are not initialized/undef unless set in the iterator!
For a more convenient tuple syntax, the macro @new_entities! is provided.
Arguments
world::World: TheWorldinstance to use.n::Int: The number of entities to create.comp_types::Tuple: Component types for the new entities, likeVal.((Position, Velocity)).
Ark.@new_entities! — Macro@new_entities!(world::World, n::Int, comp_types::Tuple{Vararg{Val}})::BatchCreates the given number of Entity.
Returns a Batch iterator over the newly created entities that should be used to initialize components. Note that components are not initialized/undef unless set in the iterator.
Macro version of new_entities! for ergonomic construction of component mappers.
Arguments
world::World: TheWorldinstance to use.n::Int: The number of entities to create.comp_types::Tuple: Component types for the new entities, like(Position, Velocity).
Ark.remove_entity! — FunctionArk.is_alive — Functionis_alive(world::World, entity::Entity)::BoolReturns whether an Entity is alive.
Ark.is_zero — Functionis_zero(entity::Entity)::BoolReturns whether an Entity is the zero entity.
Components
Components contain the data associated with Entities
Ark.get_components — Functionget_components(world::World, entity::Entity, comp_types::Tuple)Get the given components for an Entity. Components are returned in a tuple.
For a more convenient tuple syntax, the macro @get_components is provided.
Example
pos, vel = get_components(world, entity, Val.((Position, Velocity)))Ark.@get_components — Macro@get_components(world::World, entity::Entity, comp_types::Tuple)Get the given components for an Entity. Components are returned in a tuple.
Macro version of get_components for more ergonomic component type tuples.
Example
pos, vel = @get_components(world, entity, (Position, Velocity))Ark.has_components — Functionhas_components(world::World, entity::Entity, comp_types::Tuple)::BoolReturns whether an Entity has all given components.
For a more convenient tuple syntax, the macro @has_components is provided.
Example
has = has_components(world, entity, Val.((Position, Velocity)))Ark.@has_components — Macro@has_components(world::World, entity::Entity, comp_types::Tuple)::BoolReturns whether an Entity has all given components.
Macro version of has_components for more ergonomic component type tuples.
Example
has = @has_components(world, entity, (Position, Velocity))Ark.set_components! — Functionset_components!(world::World, entity::Entity, values::Tuple)Sets the given component values for an Entity. Types are inferred from the values. The entity must already have all these components.
Ark.add_components! — Functionadd_components!(world::World, entity::Entity, values::Tuple)Adds the given component values to an Entity. Types are inferred from the values.
Ark.remove_components! — Functionremove_components!(world::World, entity::Entity, comp_types::Tuple)Removes the given components from an Entity.
For a more convenient tuple syntax, the macro @remove_components! is provided.
Example
remove_components!(world, entity, Val.((Position, Velocity)))Ark.@remove_components! — Macro@remove_components!(world::World, entity::Entity, comp_types::Tuple)Removes the given components from an Entity.
Macro version of remove_components! for ergonomic construction of component mappers.
Example
@remove_components!(world, entity, (Position, Velocity))Ark.exchange_components! — Functionexchange_components!(world::World{CS,CT,N}, entity::Entity; add::Tuple, remove::Tuple)Adds and removes components on an Entity. Types are inferred from the add values.
For a more convenient tuple syntax, the macro @exchange_components! is provided.
Example
exchange_components!(world, entity;
add=(Health(100),),
remove=Val.((Position, Velocity)),
)Ark.@exchange_components! — Macro@exchange_components!(world::World, entity::Entity, add::Tuple, remove::Tuple)Removes the given components from an Entity.
Macro version of exchange_components! for more ergonomic component type tuples.
Example
@exchange_components!(world, entity,
add = (Health(100),),
remove = Val.((Position, Velocity)),
)Queries
Queries are used to filter and process Entities with a certain set of Components.
Ark.Query — TypeQueryA query for components.
Ark.@Query — Macro@Query(
world::World,
comp_types::Tuple,
with::Tuple=(),
without::Tuple=(),
optional::Tuple=(),
exclusive::Bool=false
)Creates a query.
Macro version of Query that allows ergonomic construction of queries using simulated keyword arguments.
Queries can be stored and re-used. However, query creation is fast (<20ns), so this is not mandatory.
Arguments
world: TheWorldinstance to query.comp_types::Tuple: Components the query filters for and provides access to. Must be a literal tuple like(Position, Velocity).with::Tuple: Additional components the entities must have. Passed aswith=(Health,).without::Tuple: Components the entities must not have. Passed aswithout=(Altitude,).optional::Tuple: Components that are optional in the query. Passed asoptional=(Velocity,).exclusive::Bool: Makes the query exclusive in base andwithcomponents, can't be combined withwithout.
Example
for (entities, positions, velocities) in @Query(world, (Position, Velocity))
for i in eachindex(entities)
pos = positions[i]
vel = velocities[i]
positions[i] = Position(pos.x + vel.dx, pos.y + vel.dy)
end
endArk.close! — Methodclose!(q::Query)Closes the query and unlocks the world.
Must be called if a query is not fully iterated.
Ark.Entities — TypeEntitiesArchetype column for entities. Can be iterated and indexed like a Vector.
Used in query iteration.
Resources
Resources are singleton-like data structures that appear only once in a World and are not associated to an Entity.
Ark.get_resource — Functionget_resource(world::World, res_type::Type{T})::TGet the resource of type T from the world.
Ark.has_resource — Functionhas_resource(world::World, res_type::Type{T})::BoolCheck if a resource of type T is in the world.
Ark.add_resource! — Functionadd_resource!(world::World, res::T)::TAdd the given resource to the world. Returns the newly added resource.
Ark.set_resource! — Functionset_resource!(world::World, res::T)::TOverwrites an existing resource in the world. Returns the newly overwritten resource.
Ark.remove_resource! — Functionremove_resource!(world::World, res_type::Type{T})::TRemove the resource of type T from the world. Returns the removed resource.
Batch
An iterator over entities that were created or modified using batch operations. Behaves like a Query and can be used for component initialization.
Ark.Batch — TypeBatchA batch iterator. This is returned from batch operations and serves for initializing newly added components.
Ark.close! — Methodclose!(b::Batch)Closes the batch iterator and unlocks the world.
Must be called if a batch is not fully iterated.
Index
Ark.zero_entityArk.BatchArk.EntitiesArk.EntityArk.QueryArk.WorldArk.WorldArk.add_components!Ark.add_resource!Ark.close!Ark.close!Ark.exchange_components!Ark.get_componentsArk.get_resourceArk.has_componentsArk.has_resourceArk.is_aliveArk.is_lockedArk.is_zeroArk.new_entities!Ark.new_entity!Ark.remove_components!Ark.remove_entity!Ark.remove_resource!Ark.set_components!Ark.set_resource!Ark.@QueryArk.@exchange_components!Ark.@get_componentsArk.@has_componentsArk.@new_entities!Ark.@remove_components!