# Cruise v0.1.0: A Julia Game Engine

**URL:** <https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708>\
**Category:** Package Announcements\
**Created:** [July 14, 2025, 4:21pm UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708 "2025-07-14T16:21:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Gesee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gesee/32/217235_2.png) [@Gesee](https://discourse.julialang.org/u/Gesee)\
**Post date:** [July 14, 2025, 4:21pm UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/1 "2025-07-14T16:21:26Z")

</div>

Hello guys…  
It’s been more than a year that I have been working on this and after the last version of [ReactiveECS](https://github.com/Gesee-y/ReactiveECS.jl), I think I finally have every necessary piece for this to work.

- [Outdoors.jl](https://github.com/Gesee-y/Outdoors.jl): An API-agnostic windows and inputs manager.
- [Arceus.jl](https://github.com/Gesee-y/Arceus.jl): A super fast behavior resolution system.
- [ReactiveECS.jl](https://github.com/Gesee-y/ReactiveECS.jl): A fast, flexible and powerful ECS.
- [Horizons.jl](https://github.com/Gesee-y/Horizons.jl): This rendering engine is a work in progress but the SDL backend is usable.
- [Interactions](https://github.com/Gesee-y/Cruise.jl/tree/main/src/Interactions): A 2D/3D physic engine I’m finalizing.

Having Outdoors and Horizons relying on a microkernel architecture to ensure extensibility. I think I’m ready.

Happy to present you.

# [CRUISE V0.1.0](https://github.com/Gesee-y/Cruise.jl)

A game engine 100% julia. Offering you the basic tools you need to make a games.  
After a long year of work, I’m finally releasing this.  
Sorry guys I have to drop a tear 🥲 .  
Here is a pong made with Cruise: [Pong.jl](https://github.com/Gesee-y/Cruise.jl/blob/main/demo/Pong/Pong.jl)

This package should be usable, i think, even if not ready to make the next GTA. Just gotta add the dependency but if you want to use it, you just need: SimpleDirectMediaLayer, ModernGL, Random, StructArrays, Reexport and it should be okay.  
After that more docs, more example and most importantly more updates about this engine.

I’m so excited to share this project with all of you. Every feedback is welcomed.  
(Sorry for the way this post is written, just that I’m so excited, I can’t stay in place 😅)

---

<div class="post-metadata">

**Author:** ![Nathan\_Boyer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nathan_boyer/32/14825_2.png) [@Nathan\_Boyer](https://discourse.julialang.org/u/Nathan_Boyer)\
**Post date:** [July 14, 2025, 5:48pm UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/2 "2025-07-14T17:48:09Z")

</div>

I got an error trying to run the `Pong.jl` script:

```julia
ERROR: LoadError: Global ReactiveECS.ON_LOG does not exist and cannot be assigned. Declare it using `global` before attempting assignment.
Stacktrace:
  [1] setproperty!
    @ .\Base.jl:63 [inlined]
  [2] setproperty!(x::Module, f::Symbol, v::Main.Cruise.ReactiveECS.Notifyers.Notifyer)
    @ Base .\Base.jl:61
  [3] top-level scope
    @ none:1
  [4] eval
    @ .\boot.jl:430 [inlined]
  [5] eval
    @ C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Notifyers.jl\src\Notifyers.jl:3 [inlined]
  [6] _create_notifyer(m::Module, data::Tuple{Symbol, Vector{Any}})
    @ Main.Cruise.ReactiveECS.Notifyers C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Notifyers.jl\src\Notifyers.jl:491
  [7] var"@Notifyer"( __source__ ::LineNumberNode, __module__ ::Module, f::Any)
    @ Main.Cruise.ReactiveECS.Notifyers C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Notifyers.jl\src\Notifyers.jl:413
  [8] include(mod::Module, _path::String)
    @ Base .\Base.jl:562
  [9] include(x::String)
    @ Main.Cruise.ReactiveECS C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\ReactiveECS\src\ReactiveECS.jl:1
 [10] top-level scope
    @ C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\ReactiveECS\src\ReactiveECS.jl:17
 [11] include(mod::Module, _path::String)
    @ Base .\Base.jl:562
 [12] include(x::String)
    @ Main.Cruise C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Cruise.jl:11
 [13] top-level scope
    @ C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Cruise.jl:17
 [14] include(fname::String)
    @ Main .\sysimg.jl:38
 [15] top-level scope
    @ C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\demo\Pong\Pong.jl:1
 [16] include(fname::String)
    @ Main .\sysimg.jl:38
 [17] top-level scope
    @ REPL[2]:1
in expression starting at C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\ReactiveECS\src\LogTrace.jl\src\LogTrace.jl:50
in expression starting at C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\ReactiveECS\src\LogTrace.jl\src\LogTrace.jl:50
in expression starting at C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\ReactiveECS\src\ReactiveECS.jl:1
in expression starting at C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\src\Cruise.jl:5
in expression starting at C:\Users\nboyer.AIP\Documents\Julia\Forks\Cruise\demo\Pong\Pong.jl:1

```

---

<div class="post-metadata">

**Author:** ![Gesee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gesee/32/217235_2.png) [@Gesee](https://discourse.julialang.org/u/Gesee)\
**Post date:** [July 14, 2025, 8:56pm UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/3 "2025-07-14T20:56:19Z")

</div>

You should try again, I think the problem is from the Julia version. I use 1.10.5 on my pc, yours is either lower or higher.  
But I fixed it, it should work fine no matter the version

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [July 15, 2025, 8:21am UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/4 "2025-07-15T08:21:20Z")

</div>

I am little bit lost.How should one add the package if a `Project.toml` is missing? I checked the docs and found some installation instructions here [Cruise.jl/docs at main · Gesee-y/Cruise.jl · GitHub](https://github.com/Gesee-y/Cruise.jl/tree/main/docs) but those do not work.

```julia
(Cruise.jl) pkg> add https://github.com/Gesee-y/Cruise.jl
     Cloning git-repo `https://github.com/Gesee-y/Cruise.jl`
    Updating git-repo `https://github.com/Gesee-y/Cruise.jl`
ERROR: could not find project file (Project.toml or JuliaProject.toml) in package at `https://github.com/Gesee-y/Cruise.jl` maybe `subdir` needs to be specified

```

I think in general it would be very beneficial if you would spend a little bit of time on the documentation and add some README, otherwise people will quickly give up way too early.

I also tried to install e.g. Outdoors.jl but the `Project.toml` does not even contains dependencies and you added `Manifest.toml` which basically means that one needs to replicate a very specific environment to be able to use the package. This might not work if people use another CPU or OS.

```julia
pkg> add https://github.com/Gesee-y/Outdoors.jl.git
     Cloning git-repo `https://github.com/Gesee-y/Outdoors.jl.git`
    Updating git-repo `https://github.com/Gesee-y/Outdoors.jl.git`
   Resolving package versions...
    Updating `~/tmp/Cruise.jl/Project.toml`
  [d3598698] + Outdoors v0.5.0 `https://github.com/Gesee-y/Outdoors.jl.git#main`
    Updating `~/tmp/Cruise.jl/Manifest.toml`
  [d3598698] + Outdoors v0.5.0 `https://github.com/Gesee-y/Outdoors.jl.git#main`
Precompiling project...
  ✗ Outdoors
  0 dependencies successfully precompiled in 1 seconds
  1 dependency errored.
  For a report of the errors see `julia> err`. To retry use `pkg> precompile`

(Cruise.jl) pkg> precompile
Precompiling project...
  ✗ Outdoors
  0 dependencies successfully precompiled in 1 seconds

ERROR: The following 1 direct dependency failed to precompile:

Outdoors

Failed to precompile Outdoors [d3598698-a7e3-42d2-87cb-a7a1f294c746] to "/Users/tamasgal/.julia/compiled/v1.11/Outdoors/jl_FHwvMs".
ERROR: LoadError: ArgumentError: Package Outdoors does not have OrderedDict in its dependencies:

```

I think you should spend a little bit of time and read the excellent manual on [Creating Packages](https://pkgdocs.julialang.org/v1/creating-packages/), which will make it much easier and less painful for people to get started with your software, which on the first look seems to be a very nice addition to the Julia ecosystem!

---

<div class="post-metadata">

**Author:** ![AntonReinhard](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antonreinhard/32/211306_2.png) [@AntonReinhard](https://discourse.julialang.org/u/AntonReinhard)\
**Post date:** [July 15, 2025, 11:26am UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/5 "2025-07-15T11:26:22Z")

</div>

I got the Pong example to work, but encountered two problems (other than manually having to install all the dependencies, see what Tamas wrote above):  
1: You use `joinpath` in some places already, but in some cases you use `\\` as path separators, which doesn’t work on linux.  
2: I got an Error initially:

```julia
ERROR: LoadError: MethodError: no method matching sleep_ns(::Float64; sec::Bool)
The function `sleep_ns` exists, but no method is defined for this combination of argument types.

Closest candidates are:
  sleep_ns(::Integer; sec)
   @ Main.Cruise ~/repos/Cruise.jl/src/ReactiveECS/src/utils.jl:48

Stacktrace:
 [1] (::var"#3#4")(app::Base.RefValue{CruiseApp})
   @ Main ~/repos/Cruise.jl/src/game_loop.jl:140
 [2] top-level scope
   @ ~/repos/Cruise.jl/demo/Pong/Pong.jl:99
 [3] include(fname::String)
   @ Main ./sysimg.jl:38
 [4] top-level scope
   @ REPL[3]:1
in expression starting at ~/repos/Cruise.jl/demo/Pong/Pong.jl:99

```

I’m not sure why this (presumably) worked for you, but I fixed it for me by simply inserting a `round(Int, x)` at the call site.  
It’s also worth noting that currently this doesn’t play nice with my tiling window manager, but then again, few windowed games do.

---

<div class="post-metadata">

**Author:** ![Gesee](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gesee/32/217235_2.png) [@Gesee](https://discourse.julialang.org/u/Gesee)\
**Post date:** [July 15, 2025, 4:18pm UTC](https://discourse.julialang.org/t/cruise-v0-1-0-a-julia-game-engine/130708/6 "2025-07-15T16:18:03Z")

</div>

Yeah, I just saw all these problem. Just that some packages were made a long time ago. But I corrected the problem.  
I will soon (no more than an hour.) upload some sort of stable version.  
I corrected most of the problem In the code and added some feature e.g: a basic asset importer
