DragonRuby Game Toolkit is a 2D game engine for making games using the Ruby programming language. I happened to get a license for it as part of the Bundle for Racial Justice and Equality on itch.io back in June but never got around to trying it out. Last week I received an email from one of the creators and it mentioned that there is a beginner friendly Game Jam so I figured now would be a good time to dive in!
The docs are pretty extensive but here I'll attempt to sum up some of the very basics.
Game Loop
The main function in DragonRuby is called tick and it runs 60 times per second (about every 16ms). There is no delta time to worry about; the loop just works at 60fps.
The code below will create a new instance of Dog every 16ms and store it in args.state (I'll come back to this in a bit).
def tick args
  args.state.dog = Dog.new
end
class Dog
  def initialize
    puts "I am a new dog"
  end
end
 
Being that you only want to create a new Dog instance once and set it to args.state.dog, this isn't ideal. Luckily, there is an easy way to fix this.
def tick args
  args.state.dog = Dog.new if !args.state.dog
end
Here I am using a conditional to set args.state.dog if it does not already exist. By doing this, it will only set args.state.dog the first time and will only create the Dog instance once. 
This is repetitive and long-winded, however. Below, you see an example that accomplishes the same thing by using ||= (or equals), which means to only set the value if its value is false or nil.
def tick args
  args.state.dog ||= Dog.new
end
args
args contains all the functionality for making your game, such as a way handle input and output, and store your variables. 
args.state
args.state is a data structure where you can store your game data, such as an instance of Dog, or your player's position. What's stored in state is carried over from tick to tick.
def tick args 
    args.state.player.x ||= 120
    args.state.player.y ||= 200
end
args.outputs
args.outputs is used for rendering to the screen.
This creates a red 100x100 square at (100, 250). You can change the color by adjusting the RGB values.
#                               [x, y, width, height, red, green, blue]
args.outputs.solids << [100, 250, 100, 100, 255, 0, 0]
Quick Note on the coordinate sytem: (0, 0) is at the bottom left corner. Positive numbers go up and to the right and negative numbers go down and to the left.
args.labels is used to write text to the screen.
This adds the black text 'This is a red square' slightly below the red square.
#                               [x, y, text, red, green, blue]
args.outputs.labels << [100, 240, "This is a red square", 0, 0, 0]
 
args.inputs
args.inputs is used for keyboard, mouse, and gamepad input.
Mouse Input
This code initializes a click_count to 0 and displays the total clicks to the 
screen. Every time the user clicks and releases their mouse button, the click_count is increased by 1.
 args.state.click_count ||= 0
 args.outputs.labels << [100, 240, "Click count: #{args.state.click_count}", 0, 0, 0]
 args.state.click_count += 1 if args.inputs.mouse.up
Keyboard Input
This code initializes a player's (x,y) position to (100, 100) and creates a red square (just like above) at those coordinates. Then, it increases or decreases the (x,y) values by 1, depending on which directional key was pressed.
def tick args
  args.state.player.x ||= 100
  args.state.player.y ||= 100
  args.outputs.solids << [args.state.player.x, args.state.player.y, 100, 100, 255, 0, 0]
  args.state.player.x += 1 if args.inputs.keyboard.d
  args.state.player.x -= 1 if args.inputs.keyboard.a
  args.state.player.y += 1 if args.inputs.keyboard.w
  args.state.player.y -= 1 if args.inputs.keyboard.s
end
There is a lot more to DragonRuby that I haven't even touched on. If you're interested in trying it out I highly recommend you check out the docs here, and here, which also link to some tutorial videos. There is also a free course you can check out to get started.
Here is a link to the Game Jam if you'd like to join. You can also claim a free Game Jam license.
 

 
    
Top comments (0)