Skip to content

Instantly share code, notes, and snippets.

@max-bertinetti
Created November 29, 2022 08:29
Show Gist options
  • Select an option

  • Save max-bertinetti/0e242b0b28af198cc363164147e576a3 to your computer and use it in GitHub Desktop.

Select an option

Save max-bertinetti/0e242b0b28af198cc363164147e576a3 to your computer and use it in GitHub Desktop.
DragonRuby Topdown 8 direction movement: second version
# This code shows a maze and uses input from the keyboard to move the user around the screen.
# The objective is to reach the goal.
# Sets values of tile size and player's movement speed
# Also creates tile or box for player and generates map
def tick args
args.state.tile_size = 80
args.state.player_speed = 4
args.state.player ||= [200, 200, 100, 100, 'dragonruby.png']
generate_map args
# Adds walls, goal, and player to args.outputs.solids so they appear on screen
args.outputs.solids << args.state.walls
args.outputs.solids << args.state.goal
args.outputs.sprites << args.state.player
# If player's box intersects with goal, a label is output onto the screen
if args.state.player.intersect_rect? args.state.goal
args.outputs.labels << [30, 720 - 30, "You're a wizard Harry!!"] # 30 pixels lower than top of screen
end
x = 0
y = 0
if args.inputs.keyboard.left
x = -1
end
if args.inputs.keyboard.right
x = 1
end
if args.inputs.keyboard.up
y = 1
end
if args.inputs.keyboard.down
y = -1
end
move_player args, x, y
end
# Sets position, size, and color of the tile
def tile args, x, y, *color
[x * args.state.tile_size, # sets definition for array using method parameters
y * args.state.tile_size, # multiplying by tile_size sets x and y to correct position using pixel values
args.state.tile_size,
args.state.tile_size,
*color]
end
# Creates map by adding tiles to the wall, as well as a goal (that the player needs to reach)
def generate_map args
return if args.state.area
# Creates the area of the map. There are 9 rows running horizontally across the screen
# and 16 columns running vertically on the screen. Any spot with a "1" is not
# open for the player to move into (and is green), and any spot with a "0" is available
# for the player to move in.
args.state.area = [
[1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
[1, 1, 1, 2, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,], # the "2" represents the goal
[1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1,],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
].reverse # reverses the order of the area collection
# By reversing the order, the way that the area appears above is how it appears
# on the screen in the game. If we did not reverse, the map would appear inverted.
#The wall starts off with no tiles.
args.state.walls = []
# If v is 1, a green tile is added to args.state.walls.
# If v is 2, a black tile is created as the goal.
args.state.area.map_2d do |y, x, v|
if v == 1
args.state.walls << tile(args, x, y, 0, 255, 0) # green tile
elsif v == 2 # notice there is only one "2" above because there is only one single goal
args.state.goal = tile(args, x, y, 0, 0, 0) # black tile
end
end
end
# Allows the player to move their box around the screen
def move_player args, *vector
box = args.state.player.shift_rect(vector) # box is able to move at an angle
# If the player's box hits a wall, it is not able to move further in that direction
return if args.state.walls
.any_intersect_rect?(box)
if(vector.x != 0 && vector.y != 0)
speed = (args.state.player_speed * ((Math.sqrt(2))/2))
else
speed = args.state.player_speed
end
# Player's box is able to move at angles (not just the four general directions) fast
args.state.player =
args.state.player
.shift_rect(vector.x * speed, # if we don't multiply by speed, then
vector.y * speed) # the box will move extremely slow
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment