Ship 2D games fast.

An open-source 2D game engine with Lua scripting, a visual editor, and an Entity Component System.

Still in early development. No public download yet.

Sowa scene editor with a sprite scene, hierarchy, project files, viewport tools, and console

Features

  • ECS & Lua
  • Raycasting & physics queries
  • 2D physics
  • Sprites & tilemaps
  • Animation & particles
  • Game UI
  • Lua debugging
  • Built-in profiler
  • Game exports
  • Audio
  • Open source

Editor

Current Sowa tilemap editor showing a layered level and tile palette

Tilemap editor

Paint tiles and scene instances across layers.

Current Sowa editor showing the UI demo with text fields, sliders, tabs, and lists

Game UI

Build interfaces with UI components.

Raycasting & physics queries.

Sowa physics query demo with a ray crossing a sensor, a box, a circle, and a rotated box

Lua components

health.lua
local Health = world:component("Health", {
  current = 100,
  maximum = 100,
  regen = 5,
})

function Health:damage(amount)
  self.current = math.max(
    0, self.current - amount
  )
end

function Health:_update(dt)
  if self.current > 0 then
    self.current = math.min(
      self.maximum,
      self.current + self.regen * dt
    )
  end
end

return Health
sight.lua
local Sight = world:component("Sight", {
  distance = 600,
})

function Sight:_update(dt)
  local transform = self.entity:get("Transform2D")
  local origin = transform.position
  local target = origin + Vector2(self.distance, 0)

  local hit = physics.raycast(origin, target, {
    collisionMask = physics.layers(1, 2),
    includeSensors = false,
    excludeBodies = { self.entity },
  })

  if hit ~= nil then
    log.info("Hit {} at {} px",
      hit.collider.name, hit.distance)
  end
end

return Sight

Showcase

A third-person action RPG shooter prototype built with Sowa Engine.

Follow the development

Sowa Engine is in early development. You can follow the development or join the chat here.