Created
November 29, 2022 08:29
-
-
Save max-bertinetti/0e242b0b28af198cc363164147e576a3 to your computer and use it in GitHub Desktop.
DragonRuby Topdown 8 direction movement: second version
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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