├── .github └── FUNDING.yml ├── 2021_03 Basic Enemy └── BasicEnemy.gd ├── 2021_05 Dialogue ├── DialoguePlayer.gd ├── DialoguePlayer.tscn ├── NPC.gd ├── NPC.tscn └── jsons │ ├── npc.json │ └── npc2.json ├── 2021_07 Joystick ├── JetPackPlayer.gd └── MobileJoystick.gd ├── 2021_07 Mobile Tutorial Textures └── mobile │ ├── arrow.aseprite │ ├── arrow.png │ ├── arrow.png.import │ ├── hammer.aseprite │ ├── hammer.png │ └── hammer.png.import └── README.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: rafafiedo 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: ['https://rafafiedo.itch.io/dungeon-rescuer'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /2021_03 Basic Enemy/BasicEnemy.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | var is_moving_left = true 4 | 5 | var gravity = 10 # check https://www.youtube.com/watch?v=jQKxOEbbirA for more detail 6 | var velocity = Vector2(0, 0) 7 | 8 | var speed = 32 # pixels per second 9 | 10 | func _ready(): 11 | $AnimationPlayer.play("Walk") 12 | 13 | func _process(_delta): 14 | if $AnimationPlayer.current_animation == "Attack": 15 | return 16 | 17 | move_character() 18 | detect_turn_around() 19 | 20 | func move_character(): 21 | velocity.x = -speed if is_moving_left else speed 22 | velocity.y += gravity 23 | 24 | velocity = move_and_slide(velocity, Vector2.UP) 25 | 26 | func detect_turn_around(): 27 | if not $RayCast2D.is_colliding() and is_on_floor(): 28 | is_moving_left = !is_moving_left 29 | scale.x = -scale.x 30 | 31 | func hit(): 32 | $AttackDetector.monitoring = true 33 | 34 | func end_of_hit(): 35 | $AttackDetector.monitoring = false 36 | 37 | func start_walk(): 38 | $AnimationPlayer.play("Walk") 39 | 40 | func _on_PlayerDetector_body_entered(body): 41 | $AnimationPlayer.play("Attack") 42 | 43 | func _on_AttackDetector_body_entered(body): 44 | get_tree().reload_current_scene() 45 | -------------------------------------------------------------------------------- /2021_05 Dialogue/DialoguePlayer.gd: -------------------------------------------------------------------------------- 1 | extends CanvasLayer 2 | 3 | export(String, FILE, "*.json") var dialogue_file 4 | 5 | var dialogues = [] 6 | var current_dialogue_id = 0 7 | var is_dialogue_active = false 8 | 9 | func _ready(): 10 | $NinePatchRect.visible = false 11 | 12 | func play(): 13 | if is_dialogue_active: 14 | return 15 | 16 | dialogues = load_dialogue() 17 | 18 | turn_off_the_player() 19 | is_dialogue_active = true 20 | $NinePatchRect.visible = true 21 | current_dialogue_id = -1 22 | next_line() 23 | 24 | func _input(event): 25 | if not is_dialogue_active: 26 | return 27 | 28 | if event.is_action_pressed("game_usage"): 29 | next_line() 30 | 31 | func next_line(): 32 | current_dialogue_id += 1 33 | if current_dialogue_id >= len(dialogues): 34 | $Timer.start() 35 | $NinePatchRect.visible = false 36 | turn_on_the_player() 37 | return 38 | 39 | $NinePatchRect/Name.text = dialogues[current_dialogue_id]["name"] 40 | $NinePatchRect/Message.text = dialogues[current_dialogue_id]["text"] 41 | 42 | func load_dialogue(): 43 | var file = File.new() 44 | if file.file_exists(dialogue_file): 45 | file.open(dialogue_file, file.READ) 46 | return parse_json(file.get_as_text()) 47 | 48 | func _on_Timer_timeout(): 49 | is_dialogue_active = false 50 | 51 | func turn_on_the_player(): 52 | var player = get_tree().get_root().find_node("Player", true, false) 53 | if player: 54 | player.set_active(true) 55 | 56 | func turn_off_the_player(): 57 | var player = get_tree().get_root().find_node("Player", true, false) 58 | if player: 59 | player.set_active(false) 60 | -------------------------------------------------------------------------------- /2021_05 Dialogue/DialoguePlayer.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://resources/sprites/ui/dialogue/background_dialogue.png" type="Texture" id=1] 4 | [ext_resource path="res://dialogues/DialoguePlayer.gd" type="Script" id=2] 5 | 6 | [node name="DialoguePlayer" type="CanvasLayer"] 7 | script = ExtResource( 2 ) 8 | dialogue_file = "res://dialogues/jsons/npc.json" 9 | 10 | [node name="NinePatchRect" type="NinePatchRect" parent="."] 11 | visible = false 12 | margin_left = 24.0 13 | margin_top = 8.0 14 | margin_right = 456.0 15 | margin_bottom = 88.0 16 | texture = ExtResource( 1 ) 17 | patch_margin_left = 10 18 | patch_margin_top = 9 19 | patch_margin_right = 8 20 | patch_margin_bottom = 9 21 | __meta__ = { 22 | "_edit_use_anchors_": false 23 | } 24 | 25 | [node name="Message" type="RichTextLabel" parent="NinePatchRect"] 26 | margin_left = 24.0 27 | margin_top = 40.0 28 | margin_right = 424.0 29 | margin_bottom = 72.0 30 | text = "Message" 31 | __meta__ = { 32 | "_edit_use_anchors_": false 33 | } 34 | 35 | [node name="Name" type="RichTextLabel" parent="NinePatchRect"] 36 | margin_left = 8.0 37 | margin_top = 8.0 38 | margin_right = 136.0 39 | margin_bottom = 24.0 40 | text = "Name" 41 | __meta__ = { 42 | "_edit_use_anchors_": false 43 | } 44 | 45 | [node name="Timer" type="Timer" parent="."] 46 | wait_time = 0.4 47 | one_shot = true 48 | 49 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 50 | -------------------------------------------------------------------------------- /2021_05 Dialogue/NPC.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | 4 | func _input(event): 5 | if event.is_action_pressed("game_usage") and len(get_overlapping_bodies()) > 0: 6 | find_and_use_dialogue() 7 | 8 | func find_and_use_dialogue(): 9 | var dialogue_player = get_node_or_null("DialoguePlayer") 10 | 11 | if dialogue_player: 12 | dialogue_player.play() 13 | -------------------------------------------------------------------------------- /2021_05 Dialogue/NPC.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://resources/sprites/characters/mortician.png" type="Texture" id=1] 4 | [ext_resource path="res://scenes/characters/npc/NPC.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 18, 10 ) 8 | 9 | [node name="NPC" type="Area2D"] 10 | z_index = -1 11 | collision_layer = 8 12 | script = ExtResource( 2 ) 13 | 14 | [node name="Sprite" type="Sprite" parent="."] 15 | position = Vector2( 0, -13 ) 16 | texture = ExtResource( 1 ) 17 | 18 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 19 | position = Vector2( 0, -11 ) 20 | shape = SubResource( 1 ) 21 | -------------------------------------------------------------------------------- /2021_05 Dialogue/jsons/npc.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"name": "NPC", "text": "Hello stranger!"}, 3 | {"name": "Player", "text": "Hello bigger stranger!"}, 4 | {"name": "NPC", "text": "It's dangerous to go alone."}, 5 | {"name": "Player", "text": "Yea, I know, but I have my hammer with me."}, 6 | {"name": "NPC", "text": "Ah, ok. Have a nice trip!"} 7 | ] 8 | -------------------------------------------------------------------------------- /2021_05 Dialogue/jsons/npc2.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"name": "NPC", "text": "HI AGAIN!!!!!"}, 3 | {"name": "Player", "text": "It is diffrent dialogue!"} 4 | ] 5 | -------------------------------------------------------------------------------- /2021_07 Joystick/JetPackPlayer.gd: -------------------------------------------------------------------------------- 1 | extends KinematicBody2D 2 | 3 | var speed = 128 4 | 5 | func _on_MobileJoystick_use_move_vector(move_vector): 6 | move_and_slide(move_vector * speed) 7 | 8 | $Sprite.flip_h = move_vector.x < 0 9 | -------------------------------------------------------------------------------- /2021_07 Joystick/MobileJoystick.gd: -------------------------------------------------------------------------------- 1 | extends CanvasLayer 2 | 3 | signal use_move_vector 4 | 5 | var move_vector = Vector2(0, 0) 6 | var joystick_active = false 7 | 8 | func _input(event): 9 | if event is InputEventScreenTouch or event is InputEventScreenDrag: 10 | if $TouchScreenButton.is_pressed(): 11 | move_vector = calculate_move_vector(event.position) 12 | joystick_active = true 13 | $InnerCircle.position = event.position 14 | $InnerCircle.visible = true 15 | 16 | if event is InputEventScreenTouch: 17 | if event.pressed == false: 18 | joystick_active = false 19 | $InnerCircle.visible = false 20 | 21 | 22 | func _physics_process(_delta): 23 | if joystick_active: 24 | emit_signal("use_move_vector", move_vector) 25 | 26 | func calculate_move_vector(event_position): 27 | var texture_center = $TouchScreenButton.position + Vector2(64,64) 28 | return (event_position - texture_center).normalized() 29 | 30 | -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/arrow.aseprite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafa-fiedo/Godot3-Projects/3c94eeb85b9ca1097792a0b8ed913dfdfd1f3f91/2021_07 Mobile Tutorial Textures/mobile/arrow.aseprite -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafa-fiedo/Godot3-Projects/3c94eeb85b9ca1097792a0b8ed913dfdfd1f3f91/2021_07 Mobile Tutorial Textures/mobile/arrow.png -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/arrow.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/arrow.png-155fee86f40e495055498bdece2ca0a6.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://resources/sprites/ui/mobile/arrow.png" 13 | dest_files=[ "res://.import/arrow.png-155fee86f40e495055498bdece2ca0a6.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/hammer.aseprite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafa-fiedo/Godot3-Projects/3c94eeb85b9ca1097792a0b8ed913dfdfd1f3f91/2021_07 Mobile Tutorial Textures/mobile/hammer.aseprite -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/hammer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafa-fiedo/Godot3-Projects/3c94eeb85b9ca1097792a0b8ed913dfdfd1f3f91/2021_07 Mobile Tutorial Textures/mobile/hammer.png -------------------------------------------------------------------------------- /2021_07 Mobile Tutorial Textures/mobile/hammer.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/hammer.png-093a2d148db5e9c976558498904e26f6.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://resources/sprites/ui/mobile/hammer.png" 13 | dest_files=[ "res://.import/hammer.png-093a2d148db5e9c976558498904e26f6.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=false 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GodotProjects 2 | Place to hold small godot projects I presented in my YouTube channel 3 | https://www.youtube.com/channel/UCT09eC0fDd3a3Nx9X7QQ9Aw 4 | 5 | You can also support me by buying a coffe: 6 | https://ko-fi.com/rafafiedo 7 | 8 | # Project details 9 | 10 | - **How to Tilemap - AUTOTILE in Godot 3? Tutorial** 11 | [![IMAGE ALT](https://img.youtube.com/vi/idMYaUuO2OY/0.jpg)](https://www.youtube.com/watch?v=idMYaUuO2OY) 12 | YouTube - https://youtu.be/idMYaUuO2OY 13 | 14 | - **How to add Mobile JOYSTICK in Godot 3?** 15 | [![IMAGE ALT](https://img.youtube.com/vi/_VXtUTwTxP0/0.jpg)](https://www.youtube.com/watch?v=_VXtUTwTxP0) 16 | YouTube - https://youtu.be/_VXtUTwTxP0 17 | 18 | - **How to add MOBILE CONTROLS in Godot 3?** 19 | [![IMAGE ALT](https://img.youtube.com/vi/18gE_Ng84SY/0.jpg)](https://www.youtube.com/watch?v=18gE_Ng84SY) 20 | YouTube - https://youtu.be/18gE_Ng84SY 21 | 22 | - **What I added to the game prototype? ** 23 | [![IMAGE ALT](https://img.youtube.com/vi/SHKIo5wAaGE/0.jpg)](https://www.youtube.com/watch?v=SHKIo5wAaGE) 24 | YouTube - https://youtu.be/SHKIo5wAaGE 25 | 26 | - **How to add DIALOGUE System in Godot 3? ** 27 | [![IMAGE ALT](https://img.youtube.com/vi/EGteUAiR7P8/0.jpg)](https://www.youtube.com/watch?v=EGteUAiR7P8) 28 | YouTube - https://youtu.be/EGteUAiR7P8 29 | 30 | - **How to use SHADER 2D in Godot 3? Dissolve tutorial** 31 | [![IMAGE ALT](https://img.youtube.com/vi/vz5VkRyDH54/0.jpg)](https://www.youtube.com/watch?v=vz5VkRyDH54) 32 | YouTube - https://youtu.be/vz5VkRyDH54 33 | 34 | - **How to make CHECKPOINT in Godot 3?** 35 | [![IMAGE ALT](https://img.youtube.com/vi/cC6TynnRY7U/0.jpg)](https://www.youtube.com/watch?v=cC6TynnRY7U) 36 | YouTube - https://youtu.be/cC6TynnRY7U 37 | 38 | - **How to do Enemy AI 2D - melee attack, turn around in Godot 3?** 39 | [![IMAGE ALT](https://img.youtube.com/vi/4WywpSBncFI/0.jpg)](https://www.youtube.com/watch?v=4WywpSBncFI) 40 | YouTube - https://youtu.be/4WywpSBncFI 41 | 42 | - **How to PARALLAX background in infinite in Godot 3?** 43 | [![IMAGE ALT](https://img.youtube.com/vi/KrvQ02TEWZk/0.jpg)](https://www.youtube.com/watch?v=KrvQ02TEWZk) 44 | YouTube - https://youtu.be/KrvQ02TEWZk 45 | 46 | - **How to make MAIN MENU with keyboard focus in Godot 3?** https://github.com/rfiedorowicz/main_menu_tutorial 47 | [![IMAGE ALT](https://img.youtube.com/vi/M0NK6QqVpSU/0.jpg)](https://www.youtube.com/watch?v=M0NK6QqVpSU) 48 | YouTube - https://youtu.be/M0NK6QqVpSU 49 | 50 | - **How to teleport player with particles in Godot? | MOBA Hero (P7)** https://github.com/rfiedorowicz/basic_moba_character/tree/part7_blink_dagger 51 | [![IMAGE ALT](https://img.youtube.com/vi/A0KKbv7GOVE/0.jpg)](https://www.youtube.com/watch?v=A0KKbv7GOVE) 52 | YouTube - https://youtu.be/A0KKbv7GOVE 53 | 54 | - **How to make a HUD and Camera in Godot? | MOBA Hero (P6)** https://github.com/rfiedorowicz/basic_moba_character/tree/part6_hud 55 | Next part, next topic, next year 56 | [![IMAGE ALT](https://img.youtube.com/vi/7Ypc4_RvN5A/0.jpg)](https://www.youtube.com/watch?v=7Ypc4_RvN5A) 57 | YouTube - https://youtu.be/7Ypc4_RvN5A 58 | 59 | - **How to do health bar in Godot? | MOBA Hero series (P5)** https://github.com/rfiedorowicz/basic_moba_character/tree/part5_hpbars 60 | Next part, next topic, next year 61 | [![IMAGE ALT](https://img.youtube.com/vi/hfSKX94nnjY/0.jpg)](https://www.youtube.com/watch?v=hfSKX94nnjY) 62 | YouTube - https://youtu.be/hfSKX94nnjY 63 | 64 | - **Attack the enemy in Godot 3 | MOBA Hero series (P4)** https://github.com/rfiedorowicz/basic_moba_character/tree/part4_attack_the_enemy 65 | Basic connections to hit and kill the enemy in Godot. There will be also adding basic attack animations, enemy hitpoints, damage functions. 66 | [![IMAGE ALT](https://img.youtube.com/vi/TtPCHdr5WC0/0.jpg)](https://www.youtube.com/watch?v=TtPCHdr5WC0) 67 | YouTube - https://youtu.be/TtPCHdr5WC0 68 | 69 | - **Basic Collisions and YSort in Godot 3 | MOBA Hero series (P3)** https://github.com/rfiedorowicz/basic_moba_character/tree/part3_collisions_and_ysort 70 | Let's add collision between the player and the enemy. I also added YSort to have a nice character sorting on the scene. 71 | [![IMAGE ALT](https://img.youtube.com/vi/UAkDVS7GSDM/0.jpg)](https://www.youtube.com/watch?v=UAkDVS7GSDM) 72 | YouTube - https://youtu.be/UAkDVS7GSDM 73 | 74 | - **Mouse Enemy detection in Godot 3 | MOBA Hero series (P2)** https://github.com/rfiedorowicz/basic_moba_character/tree/part2_enemy_detection 75 | How to use a mouse entered and exited with the enemy? 76 | [![IMAGE ALT](https://img.youtube.com/vi/HbyY5cK40HU/0.jpg)](https://www.youtube.com/watch?v=HbyY5cK40HU) 77 | YouTube - https://youtu.be/HbyY5cK40HU 78 | 79 | - **Point and click movement in Godot 3 | Create MOBA-like character tutorial (P1)** https://github.com/rfiedorowicz/basic_moba_character/tree/part1_movement 80 | + basic animation + create a setup project + basic algebra 81 | [![IMAGE ALT](https://img.youtube.com/vi/5bxys-Zo_jk/0.jpg)](https://www.youtube.com/watch?v=5bxys-Zo_jk) 82 | YouTube - https://youtu.be/5bxys-Zo_jk 83 | 84 | - **How to back and forth between levels?** https://github.com/rfiedorowicz/godot_pass_values_between_levels 85 | Time for next Godot tutorial request :) 86 | [![IMAGE ALT](https://img.youtube.com/vi/X8QNUCmmf5c/0.jpg)](https://www.youtube.com/watch?v=X8QNUCmmf5c) 87 | YouTube - https://youtu.be/X8QNUCmmf5c 88 | 89 | - **How to pause game?** https://github.com/rfiedorowicz/godot_pause_tutorial 90 | bla bla bla pause, go 91 | [![IMAGE ALT](https://img.youtube.com/vi/WaotOuDNio8/0.jpg)](https://www.youtube.com/watch?v=WaotOuDNio8 ) 92 | YouTube - https://youtu.be/WaotOuDNio8 93 | 94 | - **How to keep music between scenes?** https://github.com/rfiedorowicz/godot_music_controller_tutorial 95 | Use Autoloads 96 | [![IMAGE ALT](https://img.youtube.com/vi/xT51BO8KrIg/0.jpg)](https://www.youtube.com/watch?v=xT51BO8KrIg ) 97 | YouTube - https://youtu.be/xT51BO8KrIg 98 | 99 | - **How to switch scene using door (portal)?** https://github.com/rfiedorowicz/godot_portal_tutorial 100 | Time for next Godot tutorial request :) How to change scenes using input in the Godot Engine 3.2 101 | [![IMAGE ALT](https://img.youtube.com/vi/AxymjihpUi4/0.jpg)](https://www.youtube.com/watch?v=AxymjihpUi4 ) 102 | YouTube - https://youtu.be/AxymjihpUi4 103 | 104 | 105 | - **Light2d Tutorial in 3min** https://github.com/rfiedorowicz/godot_light2d_tutorial 106 | Fast tutorial for basic light 2d in the Godot. 107 | [![IMAGE ALT](https://img.youtube.com/vi/mMFtS6GnLF4/0.jpg)](https://www.youtube.com/watch?v=mMFtS6GnLF4 ) 108 | YouTube - https://youtu.be/mMFtS6GnLF4 109 | 110 | - **Dungeon Rescuer** https://github.com/rfiedorowicz/DungeonRescuer 111 | Simple casual stealth 2d game where the light is taking the main role. 112 | [![IMAGE ALT](https://img.youtube.com/vi/XzIwSAHG1mw/0.jpg)](https://www.youtube.com/watch?v=XzIwSAHG1mw) 113 | YouTube - https://youtu.be/XzIwSAHG1mw 114 | Play on: https://sheetcode.itch.io/dungeon-rescuer 115 | 116 | - **Sheep it alive** https://github.com/rfiedorowicz/keep_it_alive_lunum_dare_46 117 | Game in 48h for Ludum dare 46 for theme "Keep it alive" 118 | [![IMAGE ALT](https://img.youtube.com/vi/dtn-ZPoQvbY/0.jpg)](https://www.youtube.com/watch?v=dtn-ZPoQvbY) 119 | YouTube - https://youtu.be/dtn-ZPoQvbY 120 | 121 | - **Spectrum Analyzer** https://github.com/sheetcode/godot_spectrum_analyze 122 | Cool new audio feature in Godot 3.2 123 | [![IMAGE ALT](https://img.youtube.com/vi/rNiWlOPxMhc/0.jpg)](https://www.youtube.com/watch?v=rNiWlOPxMhc) 124 | YouTube - https://youtu.be/rNiWlOPxMhc 125 | 126 | - **Gravity and Movement Tutorial** https://github.com/sheetcode/tutorial_movement 127 | How program gravity? 128 | [![IMAGE ALT](https://img.youtube.com/vi/jQKxOEbbirA/0.jpg)](https://www.youtube.com/watch?v=jQKxOEbbirA) 129 | YouTube - https://youtu.be/jQKxOEbbirA 130 | 131 | - **Colision Stomp Detector** https://github.com/sheetcode/collision_tutorial 132 | What would I like to know earlier about collisions in Godot? 133 | [![IMAGE ALT](https://img.youtube.com/vi/3rrPr90Oras/0.jpg)](https://www.youtube.com/watch?v=3rrPr90Oras) 134 | YouTube - https://youtu.be/3rrPr90Oras 135 | 136 | - **Hammer King** https://github.com/sheetcode/Hammer-King 137 | My first platform game 2D using free graphics assets 138 | [![IMAGE ALT](https://img.youtube.com/vi/sGHC5fTwpSU/0.jpg)](https://www.youtube.com/watch?v=sGHC5fTwpSU) 139 | You can play it on : https://sheetcode.itch.io/hammer-king 140 | YouTube GameDev Vlog about it: https://youtu.be/sGHC5fTwpSU 141 | 142 | - **Godot midi json animation tutorial** https://github.com/sheetcode/Godot_midi_json_animation_tutorial 143 | It's my first tutorial :D I pressents how animate piano keyboard using MIDI and json parser 144 | [![IMAGE ALT](https://img.youtube.com/vi/tMcAn1CK1-c/0.jpg)](https://www.youtube.com/watch?v=tMcAn1CK1-c) 145 | YouTube https://youtu.be/tMcAn1CK1-c 146 | 147 | 148 | --------------------------------------------------------------------------------