# DragonRuby Game Toolkit Cheatsheet A detailed documentation listing is located at `mygame/documentation`. For real world sample usages of GTK's APIs, take a look at the `samples` directory. The sample apps are ordered by beginner to advanced. So look at them in order to get the most out of them. # Minimum Code for Game The minimum amount of code required for a game is a file named `mygame/main.rb` with the following: ```ruby def tick args args.outputs.labels << [640, 360, "Hello World"] end ``` # Args: `args` All of GTK's functionality hangs off of `args`. ## Args' Outputs: `args.outputs` All render `primitive`s are accessible under `args.outputs`. ### Labels: `args.outputs.labels` `args.outputs.labels` is used to render labels. Labels are how you display text. This code will go directly inside of the `def tick args` method. - **Minimum Code** ```ruby # X Y TEXT args.outputs.labels << [640, 360, "I am a black label."] ``` - **A Colored Label** ```ruby # A colored label # X Y TEXT, RED GREEN BLUE ALPHA args.outputs.labels << [640, 360, "I am a redish label.", 255, 128, 128, 255] ``` - **Extended Capabilities** ```ruby # A colored label # X Y TEXT SIZE ALIGNMENT RED GREEN BLUE ALPHA FONT FILE args.outputs.labels << [640, 360, "Hello world", 0, 1, 0, 0, 0, 255, "fonts/coolfont.ttf"] ``` A `SIZE` of `0` represents "default size". A negative value will decrease the label size. A positive value will increase the label's size. An `ALIGNMENT` of `0` represents "left aligned". `1` represents "center aligned". `2` represents "right aligned". - **Named Parameters/Additional Metadata** You can add additional metadata about your game within a label, which requires you to use a `Hash` instead. ```ruby args.outputs.labels << { x: 200, y: 550, text: "dragonruby", size_enum: 2, alignment_enum: 1, r: 155, g: 50, b: 50, a: 255, font: "fonts/manaspc.ttf", # You can add any properties you like (this will be ignored/won't cause errors) game_data_one: "Something", game_data_two: { value_1: "value", value_2: "value two", a_number: 15 } } ``` - **Getting The Size of a Piece of Text: `args.gtk.calcstringbox`** ```ruby def tick args # local variable # TEXT SIZE_ENUM FONT text_size = args.gtk.args.calcstringbox("some string", 0, "font.ttf") # print size of a label to screen using Ruby's string formatting capabilities: #{} args.outputs.labels << [640, 360, "the label's size is: #{text_size.x}, #{text_size.y}, #{text_size.w}, #{text_size.h}"] end ``` ### Sprites: `args.outputs.sprites` `args.outputs.sprites` is used to render sprites. All primitives in GTK have the same considerations as detailed in the Labels section. - **Minimum Code** ```ruby # X Y WIDTH HEIGHT PATH args.outputs.sprites << [100, 100, 32, 64, "sprites/player.png"] ``` - **Extended Capabilities** ```ruby args.outputs.sprites << [ 100, # X 100, # Y 32, # W 64, # H "player.png", # PATH 0, # ANGLE 255, # ALPHA 0, # RED_SATURATION 255, # GREEN_SATURATION 0, # BLUE_SATURATION 0, # TILE_X 0, # TILE_Y 32, # TILE_W 32 # TILE_H ] ``` - **Named Parameters/Additional Metadata** Here are all the properties for `sprites`: ```ruby args.outputs.sprites << { x: 100, y: 100, w: 100, h: 100, path: "sprites/player.png", angle: 0, a, 255 r: 255, g: 255, b: 255, tile_x: 0, tile_y: 0, tile_w: -1, tile_h: -1, flip_vertically: false, flip_horizontally: false, angle_anchor_x: 0.5, angle_anchor_y: 1.0 } ``` ### Sounds `args.outputs.sounds` Sounds that end `.wav` will play once: `args.outputs.sounds << 'something.wav'`. Sounds that end `.ogg` is considered background music and will loop: `args.outputs.sounds << 'background_music.ogg'`. If you want to play a `.ogg` once as if it were a sound effect, you can do: `args.gtk.queue_sound 'some-ogg.ogg'` ## Args' State `args.state` `args.state` is where you can put all of your game state. - **Tick Count `args.state.tick_count`** GTK has a fixed time step of 60 frames per second. You can access the current `tick_count` using `args.state.tick_count`: ```ruby def tick args # Render a label showing the current tick_count. args.outputs.labels << [360, 640, args.state.tick_count] end ``` - **Working With "Open" Game State** `args.state` is a "open" data structure that allows you to define properties of any structure. You don't need to define any kind of `class`. To initialize your game state, use the `||=` operator. Any value on the right side of `||=` will only be assigned `once`. To assign a value every frame, just use the `=` operator, but _make sure_ you've initalized a default value. ```ruby def tick args # initialize your game state ONCE args.player.x ||= 0 args.player.y ||= 0 args.player.hp ||= 100 # increment the x position of the character by one every frame args.player.x += 1 # Render a sprite with a label above the sprite # X Y W H PATH args.outputs.sprites << [args.player.x, args.player.y, 32, 32 "player.png"] # X Y TEXT args.outputs.labels << [args.player.x, args.player.y - 50, args.player.hp] end ``` ## Args' Inputs: `args.inputs` # Numeric ## Numeric#elapsed? Returns true if a numeric value plus an offset represents a point in time that has elapsed. This is related to args.state.tick_count. ``` args.state.attacked_at ||= args.state.tick_count puts args.state.attacked_at.elapsed? 60 # will print false after one second. ```