![]() |
|
| Playtime | Not Played |
| Last Activity | Never |
| Added | 28/11/2022 9:40:44 |
| Modified | 28/11/2022 11:08:53 |
| Completion Status | Not Played |
| Library | Itch.io |
| Source | itch.io |
| Platform | PC (Windows) |
| Release Date | 19/04/2019 |
| Community Score | |
| Critic Score | |
| User Score | |
| Genre | |
| Developer | |
| Publisher | |
| Feature | |
| Links | |
| Tag | |

DragonRuby Game Toolkit is a commercial-grade, yet beginner-friendly, 2D game engine. It's tiny (~3MB), fast as hell, and cross-platform. The Standard License (this page) is a one-time purchase and includes support for: PC, Mac, Linux, Raspberry Pi, and Web (wasm).
| Updated | Nov 12, 2022, Total releases (so far): 128 |
| Inception | Apr 19, 2019 |
| Status | Released |
| Category | Game engine |
| Platforms | Windows, macOS, Linux, Raspberry Pi |
| Rating | ★★★★★(153) |
| Author | DragonRuby |
| Tags | 2D, dragonruby, Game engine, Moddable, ruby |
Here is what's possible with just a Standard license.
Ryan put together a 5-minute intro to DragonRuby, to give you a whirlwind tour of the big ideas.
The Standard license is a one-time/lifetime purchase. Indie and Pro licenses are subscription-based but come with some incredibly powerful features.
| Standard | Indie | Pro + VR |
| MacOS | MacOS | MacOS |
| Windows | Windows | Windows |
| Linux | Linux | Linux |
| Raspberry Pi | Raspberry Pi | Raspberry Pi |
| Web Builds | Web Builds | Web Builds |
| Itch.io Automation | Itch.io Automation | Itch.io Automation |
| In-Game Web Server | In-Game Web Server | In-Game Web Server |
| - | C Extensions | C Extensions |
| - | Sound Synthesis | Sound Synthesis |
| - | Bytecode Compilation | Bytecode Compilation |
| Triangle Primitives | Triangle Primitives | |
| - | - | iOS |
| - | - | Android |
| - | - | Oculus Quest |
| - | - | MP4 Replay Export |
| - | - | HD Mode |
| - | - | All Screen Mode |
| - | - | Portrait Mode |
| Purchase | Purchase | Purchase |
You are eligible for a free license if any of the following items pertain to you:
Just contact Amir at [email protected] with a short explanation of your current situation and he'll set you up. No questions asked.
This is all you need to create a game. One file. One method called tick. Here we render the current step value as a label:
def tick args args.outputs.labels << [100, 100, args.state.tick_count] end
That's it. If you know how to use the array datatype in any language, you know everything needed to get started with DragonRuby Game Toolkit. Play around with the engine in your browser.
Here are the six draw primitives you need to know: solids, sprites, labels, lines, borders, and sounds. Here is how you use them:
def tick args # draw a blue square that's half way faded out args.outputs.solids << [100, 100, 50, 50, 0, 0, 255, 128] # draw a red label args.outputs.labels << [100, 100, "This is a label.", 255, 0, 0] # draw a sprite turned 45 degrees and half way faded out args.outputs.sprites << [200, 200, 50, 50, 'ninja.png', 45, 128] # draw a diagonal green line from bottom left to top right args.outputs.lines << [0, 0, 1280, 720, 0, 255, 0] # draw a black border (unfilled square) args.outputs.borders << [100, 100, 50, 50, 0, 0, 0, 255] # play a sound every second args.outputs.sounds << "ping.wav" if args.state.tick_count % 60 == 0 end
That's it. You now know the entire render API for DragonRuby.
Here's a more complicated example. This is how you create a nighttime scene, with a title, and a ninja:
solids: A black background, and two hundred stars made of tiny squares.labels: Display some smokey-white text.sounds: Play a sound when the game starts up.sprites: Render a sprite on the screen.lines: Draw a line representing the floorborders: Frame the entire scene with a white border.def tick args
# destructure args into local variables
state, outputs, grid = args.state, args.outputs, args.grid
# set some default values for the game
state.colors.background ||= [0, 0, 0]
state.colors.star ||= [128, 200, 255]
state.colors.text ||= [200, 200, 200]
state.colors.landmarks ||= [255, 255, 255]
state.night ||= [grid.rect, state.colors.background]
state.stars ||= 200.map do
[rand * grid.w,
rand * grid.h,
rand * 2 + 2,
rand * 2 + 2,
state.colors.star]
end
# start up some background music
outputs.sounds << "opening_fx.wav" if state.tick_count == 0
# render the background and stars
outputs.solids << state.night
outputs.solids << state.stars
# set a title for the game
outputs.labels << [grid.left + 50, grid.top - 50,
"Ninja Game", state.colors.text]
# set a sprite
outputs.sprites << [50, 50, 50, 50, 'ninja.png']
# create a line that represents the ground
outputs.lines << [grid.left,
grid.bottom + 50,
grid.right,
grid.bottom + 50,
state.colors.landmarks]
# create a border to frame the game
outputs.borders << [grid.left + 1,
grid.bottom + 1,
grid.right - 1,
grid.top - 1,
state.colors.landmarks]
end
This is how you move a sprite using your gamepad:
args.state.ninja.x ||= 100
args.outputs.sprites << [args.state.ninja.x, 300,
50, 50,
'ninja.png']
if args.inputs.controller_one.key_held.right
args.state.ninja.x += 10
elsif args.inputs.controller_one.key_held.left
args.state.ninja.x -= 10
end
This is how you move a sprite using your mouse:
args.state.ninja.x ||= 100
args.outputs.sprites << [
args.state.ninja.x,
300,
50,
50,
'ninja.png'
]
if args.inputs.mouse.click
args.state.ninja.x = args.inputs.mouse.click.point.x
end
This is how you move a sprite using your keyboard:
args.state.ninja.x ||= 100 args.outputs.sprites << [ args.state.ninja.x, 300, 50, 50, 'ninja.png' ] if args.inputs.keyboard.key_held.right args.state.ninja.x += 10 elsif args.inputs.keyboard.key_held.left args.state.ninja.x -= 10 end
Randomly create 500 ninjas on the screen. Create a lookup table that contains the alpha property of ninjas that have collided. Present all ninjas with their alpha properties set.
def tick args
# destructure args into local variables
grid, state, outputs = args.grid, args.state, args.outputs
# use Game Toolkit's built in helper methods to create
# adhoc entities
state.ninjas ||= 500.map do
state.new_entity(:ninja,
rect: [grid.w.-(50) * rand,
grid.h.-(50) * rand,
50,
50])
end
# use Ruby's powerful apis to determine collision
state.collisions ||= state.ninja
.product
.reject { |n, n2| n == n2 }
.find_all { |n, n2| n.rect.intersects_rect?(n2.rect) }
.map { |n, _| [n.entity_id, 128] }
.pairs_to_hash
#render everything to the screen
outputs.sprites << state.ninjas.map do |n|
[n.rect, 'dragonruby.png', 0,
state.collisions[n.entity_id] || 255]
end
end
This is Ryan C. Gordon (Wikipedia), he is one of the juggernauts behind Simple DirectMedia Layer (Wikipedia).
Ya know...
SDL.
That low-level library that powers thousands of games, Triple-A game engines, and Valve's Steam client?
He's also worked on porting a number of games to Linux and Mac OS: such as Braid, Super Meat Boy, Dear Esther, and LIMBO.

And this is Amir Rajan, he is an indie game dev with titles on iOS, Android, desktop, and Nintendo Switch... amassing 4 million downloads and counting (Nintendo, Kill Screen, The New Yorker). And yes, all these games are built with the DragonRuby Runtime.

Both of these guys hate the complexity of today's engines. And as luck would have it, their paths ended up crossing. After six months and 50,000 lines of DragonRuby Runtime enhancements, Ryan and Amir now have a live/hot loadable, cruft-free, productive game engine that can target... well... any gaming device you can think of.