Godot 4 Crash Course for Beginners - GameDev 2D Top Down Tutorial

Поділитися
Вставка
  • Опубліковано 30 чер 2024
  • This guide shows many changes to features like the tilemap tools, how to setup moving characters, and changes made to GDscript syntax in Godot 4 Alpha. The goal is to give a good overview of whats upcoming in Godot 4, since it's still currently in Alpha. Sprout lands assets and chapter timestamps below!
    Sprout Lands Download ~ cupnooble.itch.io/sprout-land...
    Character Script Downloads for Patreons ~ / scripts-godot-4-68719570
    ➣ Downloadable Assets, Video Courses, and Other Places to Follow Me
    chris-tutorials.itch.io/
    linktr.ee/ChrisTutorials
    ◢ Chris Recommends ◥
    Master Skills with Skillshare Video Courses ►► www.skillshare.com/r/user/chr...
    Save Money Shopping Online with Honey Extension ►► joinhoney.com/ref/qd04c25
    Timestamps
    0:00 What to Expect
    1:02 Creating a New Godot 4 Project
    1:38 Interface Overview
    2:40 Godot Project Structure
    5:03 Scene Hierarchy
    5:26 Creating a Player Character
    7:34 Character Spritesheet
    7:56 Pixel Art Rendering Settings
    8:26 Splitting Animation Frames
    9:38 Instancing Scenes in Levels
    10:21 Collision Shapes
    12:04 Player Movement Overview
    13:55 Physics Processing in Scripts
    14:59 Get Input Direction
    17:20 Input Actions Setup
    19:29 Moving Player with Move and Slide
    21:33 Testing Character Movement
    23:06 Animating Character
    27:14 Other Directions for Idle and Walk
    29:09 AnimationTree Controlling Animations
    33:47 Character Starting Direction
    39:07 Traveling Animation State Machine
    40:42 Map Building with tilemaps and Tilesets
    43:08 Random Tile Variations
    44:40 Tilemap Layers
    46:37 Manual Sorting Priorities
    47:23 Tilemap Physics & Collision Shapes
    53:52 Follow Camera
    55:19 Making Cows - Walk and Idle States
    59:42 Timers and Signal Callbacks
    1:02:59 Auto Y Sorting for Scene
    1:03:55 Creating Extra Objects
    1:05:57 Region Select for Spritesheets
    1:07:28 Nodes Disappearing from Transform Position
    1:08:48 Building a House with 3 Tilemap Layers
    1:12:53 Wrapup
    Beat Thee by Alexander Nakarada | www.serpentsoundstudios.com
    Music promoted by www.free-stock-music.com
    Attribution 4.0 International (CC BY 4.0)
    creativecommons.org/licenses/...
  • Навчання та стиль

КОМЕНТАРІ • 605

  • @willisplummer
    @willisplummer 11 місяців тому +513

    In Godot 4.1, they've changed the way the state machine transition arrows work in the AnimationTree flow chart (where you draw the lines to show which states transition to which). They now default to automatic, which causes it to cycle through all of the animations really fast and basically look like nothing is happening. To fix, select the arrows between idle and walk and in the Inspector, under Advance, change mode to Disabled

    • @papapixxel7860
      @papapixxel7860 10 місяців тому +25

      You're the man! Just stumbled upon this bug and found this comment!

    • @aryantzh2028
      @aryantzh2028 10 місяців тому +7

      thanks!

    • @liamallan12345
      @liamallan12345 10 місяців тому +11

      Absolute legend

    • @TheSearchForAwesome
      @TheSearchForAwesome 9 місяців тому +7

      You sir are a gentleman and a scholar

    • @vasarolnik
      @vasarolnik 8 місяців тому +3

      Thank you!! I was about to ask this, cause it was erradically switching between the two states.. You're the man!!

  • @bungofungus
    @bungofungus Рік тому +289

    37:37 for people using the full release of godot 4, the ≠ used in the code can be typed out using !=. They do the same thing, but the engine can read !=

  • @grandtheftaudio2912
    @grandtheftaudio2912 Рік тому +130

    Great tutorial, thanks for sharing.
    There is a minor problem with walking diagonally (walking in two directions at the same time, e.g. up and left). The input direction vector will be a bit longer than the vector when only walking in one direction. The effect will be a slightly higher walking speed when walking diagonally. This is because the diagonal d in a square is d = a * sqrt(2) when a is the length of the squares sides.
    To fix this problem, when calculating the velocity of the character, instead of "input_direction * move_speed" use "input_direction.normalized() * move_speed".

    • @jeeves4490
      @jeeves4490 9 місяців тому +7

      Thank you so much, this needs more likes

    • @591mlstudiosgames
      @591mlstudiosgames 5 місяців тому +1

      Absolute legend. 👍

    • @JLLockwood
      @JLLockwood 3 місяці тому +1

      thank you soooo much

  • @quintinwood4397
    @quintinwood4397 4 місяці тому +24

    A quick reminder with movement vectors is to use the normalized() function. So when we made the input_direction for the player, just add a .normalized() at the end of the closing parenthesis :
    var input_direction = Vector2(
    Input.get_action_strength("right") - Input.get_action_strength("left"),
    Input.get_action_strength("down") - Input.get_action_strength("up")
    ).normalized()
    if you don't do this you'll notice your player moving a lot faster if you walk diagonally. Normalizing makes it where your speed is always 1 rather than the 1.4 you get otherwise.

    • @dk-sky3820
      @dk-sky3820 4 місяці тому

      Came here to say exactly that but I was sure someone mentioned it in the comments! Cheers)

    • @antodarell-brown6516
      @antodarell-brown6516 4 місяці тому +1

      im having an issue with that exact part but instead it says "Expected closing ")" after call arguments."
      any advice?

    • @quintinwood4397
      @quintinwood4397 4 місяці тому +3

      @@antodarell-brown6516 double check your parenthesis. You might have a missing one or an extra one. Sometimes it's easy to overlook.

    • @queehosu3643
      @queehosu3643 2 місяці тому

      @@antodarell-brown6516 i overlooked a the comma a comma and got the same error.

  • @FeralFreyaForreal
    @FeralFreyaForreal 2 роки тому +178

    Hey! Godot 4 actually has a bunch of new Input methods that I think you should check out in the docs! I haven't watched the whole video yet (work) so forgive me if you mention this in the video. Anyways, two new ones that are very useful are Input.get_axis and Input.get_vector. These are basically shorthand for Input.get_action_strength("positive action") - Input.get_action_strength("negative action") but in one function. Input.get_axis is for platformer-type movement (left and right) while Input.get_vector is for top-down type movement (up, down, left, and right). You just pass the positive ("right") and negative ("left") actions and it returns the proper input. Great video so far! I can't wait to finish it!

    • @EvgeniyBerlin
      @EvgeniyBerlin Рік тому +1

      Nice catch!

    • @tadeuszr359
      @tadeuszr359 Рік тому +23

      velocity = Input.get_vector("left", "right", "up", "down") * SPEED
      sweet

    • @ThundfinTTV
      @ThundfinTTV Рік тому +3

      Game changer for movement

    • @haddock8087
      @haddock8087 Рік тому +4

      @@tadeuszr359 Actually Input.get_vector("left", "right", "up", "down") doesn't have the exact same behavior, as diagonal vector is equal to (0,707, 0.707), whereas with the original implementation, it's (1,1)

    • @PretendCoding
      @PretendCoding Рік тому +5

      @@haddock8087 So wouldn't you just instead normalize it before you multiply it by the speed? That would take care of the issue.

  • @GraniteFaun
    @GraniteFaun 10 місяців тому +96

    I like the tut so far, it's nice to get into 4.X from 3.X but, just leaving this here if people might into problems:
    33:34 They changed up the autoadvance a bit with 4.1.1 I think, it's active by default it seems (under Advance -> Auto). And you have to set it to "enable" on the links between walk and idle animation for the Dude to idle and not just spazz between the two states indefinitely.
    36:27 also I've noticed that I had to set the blend values to the full ends ( 1.1 , -1.1) or it creates some funky results of animation blending. The Default behaviours are probabyl set differently in 4.1.1 Okay nevermind the blend mode has to be changed... xD
    43:38 You can also do that with the rektangle tool, when you draw a rectangle you just get a few of the special tiles.

    • @emrld.
      @emrld. 7 місяців тому +3

      first tip saved me, thank you

    • @GraniteFaun
      @GraniteFaun 7 місяців тому +1

      @@emrld. You're welcome, glad it helped!

    • @TheManifestoJourney
      @TheManifestoJourney 7 місяців тому +2

      Thank you!! I was so confused as to why my little guy was spazzing out lol

    • @kuypersmartijn
      @kuypersmartijn 5 місяців тому

      This should be pinned, thx!

    • @Woo-py5el
      @Woo-py5el 5 місяців тому +1

      Thank you so much!!!!

  • @veldtwalker
    @veldtwalker Рік тому +132

    Might have been me, but a couple notes since some stuff have changed since this was recorded. So hopefully this helps some people.
    I am using - v4.0.beta13
    - Some of the inspectors have changed slightly, so just open up some the other caret/caron menus ">, v" (not sure the term, haha) and you might find the option you are looking for.
    - Animation Tree for each connection "->-" between idle and walk, click on them, Inspector>Advance>Mode, Set to "Enable", keep the "Start"->-"Idle" as "Auto" || Looking at the tutorial I noticed the interface for AnimationTree was different, so poking around and that is how I fixed it.
    - As pointed out in the comments if you can't easily type ≠ you can type != instead (plus some dummies ruined ≠ )
    I may have missed it being mentioned but for the cow animations you add "Animation>[animation]" and not "BlendSpace2D" like you did with the playercat animation

    • @MOAMMAN20
      @MOAMMAN20 Рік тому +1

      Thank you for tips man

    • @guedizz
      @guedizz Рік тому +1

      Very useful tips! It now worked for me!

    • @Vaznis
      @Vaznis Рік тому +2

      good shout on the animation tree tweaks

    • @MagicalAlpaca
      @MagicalAlpaca Рік тому

      I wish I could express how thankful I am for U telling us. Those were the 2 things I was confused about.

    • @taskinen1j
      @taskinen1j Рік тому

      Thanks for this. I had trouble with animation tree.

  • @crack64
    @crack64 Рік тому +42

    This tutorial is fantastic, you get into exactly the right amount of detail for everything, love it!

  • @Zantom07
    @Zantom07 Рік тому +6

    Thanks for the video, very informative! I'm new to Godot but not new to game dev, so this was a great way to get up to speed with how Godot works differently from other engines.

  • @daniridao
    @daniridao Рік тому +13

    I've been testing godot 4 for a bit, so I new all this stuff, but I have to say I could have used this video when I started with Godot, or something similar back then. It comprises a lot of different things that are very useful for beginners, so this is a 5/5. Very much appreciated the effort, it's great seeing people making Godot tutorials!

  • @codyclarke24
    @codyclarke24 7 місяців тому +13

    39:54 If you are having trouble getting your animations to travel between states in 4.1.3, adjust the call by added an additional parameter of false: state_machine.travel("Walk",false) state_machine.travel("Idle",false)

  • @Moohasha1
    @Moohasha1 9 місяців тому +2

    I followed a tutorial series for Godot 3.2 that included how to use a TileMap and TileSet. When I tried to use one in Godot 4.1, it was completely different and I had no idea what to do. Thanks for explaining it!

  • @andrewg2998
    @andrewg2998 Рік тому +1

    Just simply a great tutorial. Please make more godot game dev content in the future!

  • @adrianpinto1011
    @adrianpinto1011 7 місяців тому +1

    Excellent tutorial, just what I was looking for!
    Thank you.

  • @PlatedGuy
    @PlatedGuy Рік тому +1

    Last time I tried game dev Godot was in some early 3.0 alpha I think. I saw Godot 4 release and some spark inside me lightend up and made me try gamedev again. Thank you for your tutorial man ❤❤

  • @LucasThomasLuc_Tho
    @LucasThomasLuc_Tho Рік тому

    Fantastic intro video, I'm a first timer and followed along no problem. Thanks! :D

  • @IscariotSolia
    @IscariotSolia Рік тому

    Thank you for doing godot tutorials, I really hope you do more in the future.

  • @ssupersloth6679
    @ssupersloth6679 Рік тому +1

    Great tutorial! It helped a lot and was so much fun!

  • @Hurtwolf
    @Hurtwolf Рік тому +1

    Great video Chris!

  • @olmrgreen1904
    @olmrgreen1904 Рік тому

    OMG! So glad I found your video! Thanks for the tutorial!

  • @honeycoffeeandmilk996
    @honeycoffeeandmilk996 Рік тому +133

    The animation tree is different now 🥲
    Edit:
    if the animation is not working try this: delete the connections between start, walk and idle. Next to Transition select "immediate" and the arrow-box (?) should be blue. For the transitions between idle and walk the arrow-box (?) should NOT be blue

    • @kylelapraim6630
      @kylelapraim6630 Рік тому +9

      thank you I was having issues figuring out why my animation was so freaking fast lol

    • @LunaReviewMats
      @LunaReviewMats Рік тому +3

      Thanks. This had me stumped for an hour.

    • @Rizma44
      @Rizma44 Рік тому

      tyty!💜

    • @nickzema4200
      @nickzema4200 Рік тому +1

      Hi, I am a dummy and don't understand. Mine is flashing super fast too, but I don't know how to fix transitions and the debug still has my Cat static.

    • @Rizma44
      @Rizma44 Рік тому +21

      @@nickzema4200 Click "Connect Nodes" button. Next to the "Transition:" label select "Immediate" from the drop down menu. Next to the drop down menu there is a new button with the letter A with an arrow highlighted in blue. Honey was saying unhighlight that new button for the walk transitions. I am assuming so it doesn't Auto Advance? Hope this helps! ♥

  • @TiaChii
    @TiaChii Рік тому +27

    it seems that this is now a bit outdated in some points, but it was still amazing to see my creations come to life! I do not think i understand anything of the coding yet, but there is much to learn~

  • @doremifasolitado
    @doremifasolitado 10 місяців тому

    this tutorial helped me a tremendous amount with getting me started, thank you!!

  • @user-hs1fv9tp6x
    @user-hs1fv9tp6x Рік тому

    Thanks for the tutorial, I'm a total newbie to Godot and your tutorial explains a lot to me.

  • @niorad
    @niorad Рік тому +6

    Thanks! Perfect for a first look at Godot without xp with 3, but not wanting to start with 3 since 4 is right around the corner.

    • @laptoprelaks
      @laptoprelaks Рік тому

      this is exactly where I'm at lol...

  • @Drachenbauer
    @Drachenbauer 5 місяців тому +4

    33:10
    in godot 4.2 the advance mode of animation tree transitions is a bit different.
    Now it is set to "auto" by default and has also the options "enabled" and "disabled" to choose instead.
    So let the first transition like it is and set the other two, between the two blend_state_2d elements (idle and walk), to enabled.

  • @stevemomcilovic
    @stevemomcilovic Рік тому

    Some changes in GA since alpha, but still a really helpful tutorial! Keep making them so I can learn more!

  • @leocosta-io
    @leocosta-io 5 місяців тому

    Great tutorial, helped me a lot. Thank you!

  • @nickzema4200
    @nickzema4200 Рік тому +57

    If at 19:09 you are not getting the debugger to see your key commands... Double check that you put a comma at the end of line 6, after the left command and before the down command. I missed his comma in the video myself. This was the solution. Hope that helps for someone else.

    • @jamesreed361
      @jamesreed361 Рік тому +2

      Thank you so much, totally missed that lol.

    • @moni1726
      @moni1726 Рік тому +2

      thank you so much!! you’re literally a lifesaver

    • @Pilot_V
      @Pilot_V Рік тому

      Thank you so much

    • @Ryeniken
      @Ryeniken Рік тому +1

      Exactly my issue :)
      This was quickly followed by another error on the "print line". Turns out, indentation is important! My "print(input_direction)" needed an additional indent to fall under the func _physics_process(_delta):
      I'm used to c#, so this is a bit different, but I'm liking the logic behind it so far

    • @bestenderslayer9302
      @bestenderslayer9302 8 місяців тому

      u should tell me the full code tottaly

  • @zflxw
    @zflxw 8 місяців тому +6

    Also, another thing: If you want a smooth camera follow without jitters, you simply have to do following:
    1. Enable the "Position Smoothing" and enter a value (5px/s is good for me)
    2. Change the Process Callback in the Camera2D Settings to "Physics". This will remove the jitter!

  • @SFoX-On-Air
    @SFoX-On-Air Рік тому

    Thank you for that Video. I learned a lot and I am waiting for eagerly for more!

  • @eduardofernandez6626
    @eduardofernandez6626 Рік тому +20

    Could you do a tutorial like this but in 3D? It would be very useful for the community, since there are no updated courses, good content! I hope you continue helping the godot community!

  • @Drachenbauer
    @Drachenbauer 5 місяців тому +3

    About the cows: with the fixed values for the timers they'll idle all the same time and walk all the same time.
    It looks more natural, when you generate theese values with a randomized range, maybe 1-3 secconds walk and 4-8 seconds idle.
    so they´ll act compleetely individual and not more all stand and than all walk.

  • @bobonthenet
    @bobonthenet Рік тому

    Great video! I learned a ton.

  • @nikitareich7617
    @nikitareich7617 Рік тому +2

    you worked 7 hours straight! Respect

  • @MikhaelHld
    @MikhaelHld Рік тому

    Really appreciate this, super duper helpful, i love you 🥺

  • @mardo7510
    @mardo7510 Рік тому

    Had some problems with the AnimationTree on Beta 12. But now it works as intended. Thanks for the video :-)

  • @malcowicz
    @malcowicz Рік тому

    You are great! Brilliant explaining!

  • @Onox4
    @Onox4 Рік тому +41

    A small problem with the script for the cow as shown in the video is that in select_new_direction, it’s possible to get (0, 0) and when that happens, the cow will appear as not moving but will still have its walk animation shown (this can be seen for example at 1:02:52 with the top right cow)

    • @skateryuri2
      @skateryuri2 Рік тому +1

      me too :(

    • @goblinslayer5404
      @goblinslayer5404 Рік тому +3

      a simple fix would be to call the select_new_direction function if the x and y of move_direction are 0. just do that right after it creates the random vector. It's almost like ur creating a loop out of a method, similar to recursion.

  • @widrolo
    @widrolo 9 місяців тому +14

    Unity refugee here

  • @quintinwood4397
    @quintinwood4397 4 місяці тому +3

    try enabling delta in the cow physics process and using move_and_collide(velocity * delta) for cows. This will make it where they don't cling to your player's collision box and they'll also stop if they run into you.

  • @widearchshark3981
    @widearchshark3981 Рік тому +2

    Great video, but boy did you just hit overdrive with the cow piece !
    Really good effort though mate. Followed through slowly and learned a lot.

  • @Darkrender
    @Darkrender Рік тому +5

    You can solve the camera stuttering a few different ways, but as of the most current beta release of Godot 4 (v4.0.beta9), you can pretty much solve the visible stuttering on the player by setting the Process Callback property on the camera to Physics instead of Idle. Another solution would be to lock the framerate of the game to 60 (or even 30) fps, since one reason for the stuttering is because of monitor refresh rate being slower than the games fps. Since most people use 59 or 60hz monitors, limited the fps to that or lower should help with the stuttering.

  • @snippets.of.science
    @snippets.of.science 3 місяці тому

    insanely useful thank you so much!

  • @haileo_4c
    @haileo_4c 8 місяців тому

    really nice tutorial. thanks!!

  • @JayTailor45
    @JayTailor45 6 місяців тому

    Thanks so much. I learned a lot about Godot today.

  • @overbyte
    @overbyte Рік тому

    Great tutorial. Thanks very much

  • @sprite9849
    @sprite9849 Рік тому +7

    around 22:00 if velocity is not working for you, as it didn't for me, try this code. Hope it helps :)
    extends CharacterBody2D
    const SPEED = 100.0
    func _physics_process(_delta):
    var xInput = Input.get_axis("left", "right")
    if xInput:
    velocity.x = xInput * SPEED
    else:
    velocity.x = move_toward(velocity.x, 0, SPEED)

    var yInput = Input.get_axis("up", "down")
    if yInput:
    velocity.y = yInput * SPEED
    else:
    velocity.y = move_toward(velocity.y, 0, SPEED)

    move_and_slide()

    • @Inf3rnoBadger
      @Inf3rnoBadger Рік тому +1

      Thanx the code helped around 38:28 how did you get this code to work with the update_animation_parameters for movement. he uses the input_direction like update_animation_parameters(input_direction) I tried to use yInput and xInput but i got an error Cannot convert argument 1 from float to vector2 idk most of this goes over my head right now lol

    • @sprite9849
      @sprite9849 Рік тому

      @@Inf3rnoBadger yeah, that were I stopped the tutorial today, my brain can't handle that today :D I'll continue in the following days and hope that I'll find a solution

    • @sprite9849
      @sprite9849 Рік тому +5

      @@Inf3rnoBadger Hey Sean, not sure what happened but today the code from the tutorial worked fine for me. Maybe it has something to do with the Steam Version of Godot. To save you some typing, this is the code that worked :)
      extends CharacterBody2D
      @export var move_speed : float = 300
      @export var starting_direction : Vector2 = Vector2(0, 1)
      @onready var animation_tree = $AnimationTree
      @onready var state_machine = animation_tree.get("parameters/playback")
      func _ready():
      update_animation_parameters(starting_direction)
      func _physics_process(_delta):
      var input_direction = Vector2(
      Input.get_action_strength ("right") - Input.get_action_strength ("left"),
      Input.get_action_strength ("down") - Input.get_action_strength ("up")
      )

      update_animation_parameters(input_direction)

      velocity = input_direction * move_speed

      move_and_slide()
      pick_new_state()


      func update_animation_parameters (move_input : Vector2):

      if(move_input != Vector2.ZERO):
      animation_tree.set("parameters/Walk/blend_position", move_input)
      animation_tree.set("parameters/Idle/blend_position", move_input)

      func pick_new_state():
      if(velocity != Vector2.ZERO):
      state_machine.travel("Walk")
      else:
      state_machine.travel("Idle")

  • @seanrendall5495
    @seanrendall5495 6 місяців тому

    Oh, cool, I can't wait to follow this tutorial! It's awesome I can spend my free time learning a skill I've always wanted!
    ... Aaaaand I need a new video card.

  • @DonLeeelbow667
    @DonLeeelbow667 Рік тому

    Thank you, this really helps

  • @taunhawk9888
    @taunhawk9888 11 місяців тому +6

    Thanks for the tutorial! However, that animation tree is a clunky mess. Was able to handle all of that much easier with just code inside of the PlayerCat script:
    var idle_direction: String = "idle_down" # Same names as animation
    # [ PLAYER ANIMATE ]
    func player_animate():
    # Walking and setting idle direction
    if input_direction.y < 0:
    $AnimationPlayer.play("walk_up")
    idle_direction = "idle_up"
    elif input_direction.y > 0:
    $AnimationPlayer.play("walk_down")
    idle_direction = "idle_down"
    elif input_direction.x < 0:
    $AnimationPlayer.play("walk_left")
    idle_direction = "idle_left"
    elif input_direction.x > 0:
    $AnimationPlayer.play("walk_right")
    idle_direction = "idle_right"
    # Idle
    else:
    $AnimationPlayer.play(idle_direction)

  • @GraveyardghouI
    @GraveyardghouI Рік тому

    Good tutorial, appreciate it.

  • @Xershade
    @Xershade Рік тому +3

    Not sure if this was in it at the time but for the animations instead of using the frame number just use the frame co-ordinates instead. Then when duplicating you just leave the X value alone and just change the Y value for each direction.
    Example the way my frames are setup it's a 3 frame sprite that does 4 frame animations, so the X values are 1,0,1,2 so instead of having to math all of that for the other 3 directions I just set it to frame_coords in the animator instead and just changed the Y value.

  • @fabienlamarque5572
    @fabienlamarque5572 Рік тому

    in case people, like me, weren't able to collide with hills with their character.in GODOT 4. In the PlayerCat settings, its CollisionObject2D mode was set to disabled.
    @chrisTutorials, thanks for the tutorial, very helpful first mini project in GODOT

  • @user-pz9ju6ss7r
    @user-pz9ju6ss7r Рік тому

    good tutorial! you deserve more likes and comments!

  • @GergelyGati
    @GergelyGati Рік тому +56

    Great tutorial!
    One suggestion: if you use a larger font and/or smaller resolution, it's much easier to follow on smaller screens.

    • @GraveUypo
      @GraveUypo Рік тому

      this. i tried to follow on a small 1280x720 window on my 4k screen and it was impossible. i changed to a second monitor (well, a drawing tablet's screen), but it's 13" and it was still super hard to see.

    • @bonsaipropaganda
      @bonsaipropaganda Рік тому

      yeah im bad at reading small text

    • @darktail936
      @darktail936 8 місяців тому

      You can press the ctrl and - or + keys to make the screen smaller/bigger if it helps!

    • @GustavoFernandesKing
      @GustavoFernandesKing 4 місяці тому

      @@darktail936 it doesn't zoom the video, only the browser.

  • @ulgrimthemad
    @ulgrimthemad 7 місяців тому +2

    A bit has changed for 4.1.3, but clicking on everything roughly where Chris has indicated lets you find most things.
    willisplummer in the comments here hit the nail on the head for the biggest issue which is the transition between animations being enabled and flipping out, as long as you follow their direction (select arrows and in inspects under advanced change mode to disabled) you'll be fine.
    Painting collisions has an additional feature as well, in that there's a paint dropper now to get existing collision paintings from tiles which you can then modify. Helped a lot.
    The rest is just slight changes as to where you find things in the inspector.

    • @ulgrimthemad
      @ulgrimthemad 7 місяців тому

      Thanks for this great tutorial Chris!

  • @Domingosjk
    @Domingosjk Місяць тому

    very cool, thanks bro

  • @Telorath
    @Telorath Рік тому +4

    I don't know if godot handles this properly(pretty new to godot), but in most engines one of the most important things NOT to put in the physics step is taking player input. It shouldn't matter much in a "hold to move" scenario, but if for example you're trying to jump from platform to platform, it's possible to press and release the jump button BETWEEN physics updates, causing your input to be occasionally ignored while performing actions that require precise timing.

    • @snowy893__
      @snowy893__ 7 місяців тому

      what would you recommend as an alternative? im new to godot and game development in general

  • @zinnmannstudio
    @zinnmannstudio 15 днів тому +1

    I am pretty late, but I think this video is exactly what I am looking for, I just started Game Dev and wanted to make a game with a similar mechanic to this.

  • @Van_Ghalta
    @Van_Ghalta 9 місяців тому

    Godly tutorial, sir. Take my subscription.

  • @l.halawani
    @l.halawani Рік тому +1

    Great crash course! Exactly what I was looking for coming from Unity. Actually I'm surprised Godot is that good for 2d, it's way better than Unity. And everything is a Node and Node can be a scene. AWESOME thanks man!

  • @Peace-he5lx
    @Peace-he5lx 6 місяців тому

    you made a great day 1 tutorial. fatastic

  • @jakoblauridsen4347
    @jakoblauridsen4347 Рік тому +1

    Great tutorial. Do we plan on a follow up adding some more functionality to this example?

  • @dmshtrash
    @dmshtrash Рік тому

    Thx for video!

  • @TuPapaHL10
    @TuPapaHL10 Рік тому

    Justo lo que buscaba :3

  • @chip6304
    @chip6304 9 місяців тому +1

    I know it's a bit late but for mouse smoothing, you can change the process call back to physics so that you don't get that motion blur effect on your sprite
    ey idk how it works or what it does buttt, it works so :P

  • @maciulex9460
    @maciulex9460 Рік тому +1

    Great i love this tutorial
    im in programing but never do any games in game engine
    tutorial that have 30ep every 30min just too long and boring
    best way to learn is to pratice and see what everything do
    that was great tutorial that give me what i wanted

    • @maciulex9460
      @maciulex9460 Рік тому

      update it's great i love this engine
      i made for my cows a turrets on back and now they are very dangerous!

  • @chefaku
    @chefaku 3 місяці тому +2

    50:42 is better to use the snap grid tool, that is at the right of the rotate right, flip horizontally, etc

  • @dreamrider7128
    @dreamrider7128 5 місяців тому +1

    Honestly I'm still a bit reluctant to learn godot but somehow I ended up here and before I realized I'm halfway through it following every single step and has been waaaaay easier than I even imagined (for the record I have some experience in Unity and a lot of experience in unreal).
    Other godot tutorials failed to grab my attention and I was really struggling way too much to understand the node system of godot... so I really have to thank you for this video (and I'm still reluctant to continue with godot... like I want to choose a 2D engine to make classic arcade game clones, like the timeless beat em ups such as TNMT, Xmen, Golden axe, etc... and I am still 3 doritos away from doing those in Unreal... still following this tutorial to the end)

    • @Dunkable
      @Dunkable 2 місяці тому

      Are you still rocking with godot?

  • @BlueCultist666
    @BlueCultist666 6 місяців тому

    Thanks 💙

  • @scottyawesomesauce467
    @scottyawesomesauce467 Рік тому +1

    WOW, that tile system is so much faster then 3.x Of course I haven't played around with tiles in a while so its possible that 3.5 has improved it.

  • @joepkippensnuiver2969
    @joepkippensnuiver2969 Рік тому +1

    There should be some reddit post or something on these longer tutorials for a problem solving QandA. In general though nice very first introduction.

  • @Neestrid
    @Neestrid Рік тому

    Thanks!

  • @galacticgon925
    @galacticgon925 7 місяців тому

    Great tutorial.
    Once it got to the cow, and the code for changing states didn't seem to change the state on the cow.
    Followed exactly, using Godot 4.1.2 stable version.
    The cow always stays in idle animation. So I just skipped over that.
    Also a few of the comments below help out with some of the changes to the more current versions of Godot now.
    Overall though great explanation of things.
    I made a lot of comments in my scripts as you were talking, to more easily remember and understand what each part/thing/node/so on is doing.

  • @productionsinparadise2880
    @productionsinparadise2880 3 місяці тому +1

    I think the only thing missing from the tutorial was the ability to enter the houses (change scenes by entering through the door on the inside and outside of the house). Haven't seen too many scene change tutorials that revolve around walking through things.

  • @Syeno
    @Syeno Рік тому

    Best teacher on youtube.

  • @TheRhalf
    @TheRhalf 6 місяців тому

    in tilemap 47:25 I think it's best to use a grid to avoid weird collisions and make the process faster

  • @Maksimmy
    @Maksimmy 4 місяці тому +3

    Trying to follow in 2024. Having trouble with the first script, trying to get directions implemented. Seem to be having some trouble with indentation? Despite following the code pictured exactly at 19:19

    • @spade2945
      @spade2945 4 місяці тому

      Im also having trouble with that, dont know how to fix it

  • @thomasgebetsberger4620
    @thomasgebetsberger4620 Рік тому +2

    Hey, i tried to implement the new get_vector() Function but my character will only use the down_walk animation and switch to the respective idle animation after releasing the key.
    Press D for right -> down_walk animation -> after key is released idle_right.
    Any ideas? Thanks a lot!!

  • @maxtronaute1933
    @maxtronaute1933 Рік тому +2

    Hello, first, thank you for your tutorial, Learned a lot! I'm so happy :3
    I'm juste having a few troubles, made the same thing than characters for the cow, and added all the lines of code you showed, but my cows don't move at all.
    Could you clarify this part? Am I the only one having this problem?
    Second one is when I add the Y Sort, and touch a cow when in front of it, she become stick to my character and follow me (and I can't move up anymore). If anyone can help, would be awesome!

  • @user-darkodbd
    @user-darkodbd 4 місяці тому

    The move_direction Vector2 can sometimes return 0,0 so the Cow is not moving but it still plays the walking animation.
    To fix it add a if statement in the select_new_direction() function that checks if the move_direction Vector2 is 0,0 something like this:
    if(move_direction.x == 0 and move_direction.y == 0):
    select_new_direction()
    This way the Vector recalculates new numbers if the numbers are 0,0. Important use this AFTER the initial calculation.

    • @Tom4z1
      @Tom4z1 2 місяці тому

      To make it easy for the people here is my code that works :
      func select_new_direction():

      move_direction = Vector2(
      randi_range(-1,1),
      randi_range(-1,1)
      )

      if(move_direction.x == 0 and move_direction.y == 0):
      select_new_direction()

      if(move_direction.x < 0):
      sprite.flip_h = true
      elif(move_direction.x > 0):
      sprite.flip_h = false

  • @mikeonthebox
    @mikeonthebox Рік тому +1

    There are some things that look like they could use some polishing still. The whole animation stuff, while kinda straight forward, it was also a bit confusing. I guess doing it more and more one will get more used to the workflow in general, but sometimes it feels like things are way too hidden from the user.

  • @Korn1holio
    @Korn1holio Рік тому +3

    At 15:26 - pardon for possibly beginner question, but is it wise to initialize a variable (var input_direction) inside a "_physics_process" that gets refreshed 60 times/sec ?

    • @Forcoy
      @Forcoy Рік тому +3

      no, creating a new variable 60 times a second is not a very good idea

  • @maxamillion3437
    @maxamillion3437 Рік тому +1

    Hey, when you run it and have it enter full screen how do you keep the aspect ratio the same?

  • @outkastagc
    @outkastagc Рік тому +1

    Oh man, I made it all the way to 48:24. I can't find the physics layer options and after scrolling through endless comments and reading the GD info, I am at a loss. I somewhat remember how to setup the collisions from 3, but I am totally lost here. Thanks for the video, I really appreciate the time and effort!

    • @ChrisTutorialsYT
      @ChrisTutorialsYT  Рік тому +3

      For the tilemap I assume? You'll have to open the Tileset in the tilemap (inspector), physics layer will be the first drop down with tileset expanded. There's an add element button to add a new physics layer - first one will show up as PhysicsLayer0 when editing tiles. Then in tileset mode (button of the screen with the tilemap node selected), choose select from the tool options and then select the tile you want to give physics collisions to. Physics should be a drop down available under BaseTile now. Expand down to PhysicsLayer0 and you should see the tools for editing the collision shapes for each individual tile.
      Hope that helps a bit

    • @Smithington_
      @Smithington_ Рік тому +1

      @@ChrisTutorialsYT I am not the OP, but ran into the same problem.
      Thanks for being awesome.

    • @jo.awesome
      @jo.awesome 6 місяців тому

      You have to click on the word "TileSet" not the arrow next to it. It then expands for more options. I had the same problem too and accidentally clicked there and it worked.

  • @indiegamechris4759
    @indiegamechris4759 Рік тому +1

    I can't cycle through the frames on Sprite2D (24:17). This happened after I finished setting up the animations; it's permanently stuck on frame 2. Is there a locking button somewhere? I restarted Godot and it didn't solve the problem.

  • @BellyLachlan
    @BellyLachlan 3 місяці тому +1

    if you also have a sticky cow try this in the cow script for physics_process
    func _physics_process(delta):
    if(current_state == COW_STATE.WALK):
    velocity = move_direction * move_speed
    else:
    velocity = Vector2.ZERO

    move_and_collide(velocity * delta)

  • @Dotdot0
    @Dotdot0 5 місяців тому

    Amazing video it helped me a lot! Just a question, the Cow could randomly generate Vector2(0,0) with walk animation. How to avoid this?

  • @user-hr8gn2vf7d
    @user-hr8gn2vf7d 8 днів тому

    29:56 if you don’t see the list in “add animation”, then just in the animation tree select "anim player" and select "animation player"

  • @user-fy2vo5oc5v
    @user-fy2vo5oc5v 7 місяців тому

    cool video)

  • @ShamelessFNGRL
    @ShamelessFNGRL 9 місяців тому +1

    Sorry for this really basic question... but can I have multiple sprite sheets per character? Or should I have all the movements on the same sheet? Or is there a way to add the other sprites to the existing sheet without having to do the first walking directions? I found a post w a 'workaround' but I can't seem to find out where it's supposed to lead me... Another solve was to add the other spritesheets as children and mess w hide/show, but I think that's a bit too high for me for now.

    • @h-angrygirl
      @h-angrygirl Місяць тому

      Hola, tenía la misma duda, me parece que solo puedes utilizar una hoja de sprite por nodo "characterBody2D" es decir que por personaje podrás utilizar una sola hoja de sprite, así mismo con cada objeto u enemigo que crees que tenga animación de movimiento, te recomiendo crear una única hoja utilizado Pixelorama o cualquier otro programa de PixelArt y luego exportar todos los movimientos en un solo archivo .png . Saludos

  • @vankleiss299
    @vankleiss299 6 місяців тому +2

    For anyone around the 39 minute mark whose animations are now broken with the code update; I had the same problem, and the solution lies in this more recent video tutorial from the same creator as this one: ua-cam.com/video/WrMORzl3g1U/v-deo.html ("Animation Tree State Machine Setup w/ Conditions & BlendSpace2D - Godot 4 Resource Gatherer Tutorial" if you're wary of random links).
    Follow this tutorial in regards to setting up the code and by the end of that tutorial you should have everything working, beyond the code update I only had to fiddle with the animationtree points a bit. I'll post my final code below for an example/point of reference. Happy learning.
    extends CharacterBody2D
    @export var move_speed : float = 100
    @export var starting_direction : Vector2 = Vector2(0, 1)
    @onready var animation_tree : AnimationTree = $AnimationTree
    var input_direction : Vector2 = Vector2.ZERO
    func _ready():
    animation_tree.active = true
    func _process(delta):
    update_animation_parameters()
    func _physics_process(_delta):
    input_direction = Input.get_vector("left", "right", "up", "down").normalized()
    if input_direction:
    velocity = input_direction * move_speed
    else:
    velocity = Vector2.ZERO
    move_and_slide()

    func update_animation_parameters():
    if(velocity == Vector2.ZERO):
    animation_tree["parameters/conditions/idle"] = true
    animation_tree["parameters/conditions/is_moving"] = false
    else:
    animation_tree["parameters/conditions/idle"] = false
    animation_tree["parameters/conditions/is_moving"] = true
    if(input_direction != Vector2.ZERO):
    animation_tree["parameters/idle/blend_position"] = input_direction
    animation_tree["parameters/walk/blend_position"] = input_direction

  • @reidschott5517
    @reidschott5517 7 місяців тому

    would it be a good idea to follow this using the provided asset pack and then after the code is working replace it with my own assets? i am trying to make my own dungeon crawler but am having a hard time making assets that dont look completely terrible (im mostly a 3d artist so pixel art is very new and hard to me). i am thinking i can use this tutorial to hopefully get a working game with animations and all that and then when i make my own assets i can just swap em in there and use this code as a jumping off point.

  • @Drachenbauer
    @Drachenbauer 5 місяців тому +1

    in the first frame of idle right the character is misplaced by one pixel to the left on the spritesheet-graphic, so tile right and left look a bit different on this video.
    I fixed this in my copy of the sprite-shheet-graphic-file

  • @Pecola1FromScratch
    @Pecola1FromScratch Рік тому +8

    For some reason the Transition connect arrows disappear when I try to connect, they snap in as if they'll connect, then I let go and it disappears. The output log does say "Transition added" as if it was actually added, but there's visually nothing showing. It also isn't actually working when I play it. (I did add the Auto advance on the Start to idle, but it of course doesn't seem to actually be connecting there.
    May be a weird glitch, unless I missed a setup step?
    EDIT: Ah, found someone else in the comments who had the same issue, and just restarted and it fixed. I had given up yesterday, hoping it might be a glitch that fixed itself today after restarting my computer completely, but that hadn't worked. But after restarting *again* today, just restarting Gadot, it fixed itself. 🤷🏻‍♂

    • @manadecide
      @manadecide Рік тому +1

      I had that same problem. Thanks for the update on your comment.

  • @user-qj9pc6iv8z
    @user-qj9pc6iv8z 6 місяців тому

    Some improvements to the cow movement, if you use randi_range(-1,1) a lot of the time you will walk but not move due to getting a ZERO Vector2, I wrote a function to covert randi_range(0,1) to return -1 if it's 0 and 1 if its 1. This means they never stand still. Set the time in another function based on state and then you can randomly choose to move in the pick state function using another if(randi_range(0,10) < 3 and IDLE or WALKING) else wait for next timer, so sometimes the cows can idle multiple times. I am new to Godot but I wonder if an AnimatedSprite2d is a better option if you don't have complex sprite animations that require transitions from different states like here.

  • @Tenraiden
    @Tenraiden Рік тому +1

    Thank you! My first Godot project! Can you update this for the final Godot 4 release please? ^^

  • @mantavisions2362
    @mantavisions2362 Рік тому

    Thanks for the tutorial. How would you remove diagonal movement? So that its only Up/Down/Left/Right?

    • @Not_TVs_Frank
      @Not_TVs_Frank 5 місяців тому

      To eliminate diagonals, you could change the logic that reads the keyboard input. You would have to decide on the specifics of how you wanted it to work, but your goal would need to be ignoring more than one simultaneous direction key. For instance, if the user presses both the up and right input, you would ignore up and act on the right input. You could start simple by deciding that left and right override up and down. Once you get that to work, you could try to make it more sophisticated so that the first key you press takes precedence. For instance, if the user is holding up, and starts also pressing right, you could build logic to ignore the new right keypress and continue up. Or make it take the latest keypress as the direction to go - that's your decision.
      If you're interested in making the character walk exactly one tile at a time, there's a code sample in the Godot's Github repo. I pulled that off with Pygame, but I would guess Godot has useful tools to make that possible - and easy.

  • @Drachenbauer
    @Drachenbauer 5 місяців тому

    I saw cows like yours sometimes play their walk-animation without movement.
    That´s because the direction chooser sometimes outputs a zero-vector as direction, wich means no movement.
    To fix this, i added a while loop there, that checks for the zero vector and so let's only actual directions pass through.
    I also noticed, if a cow collides with a wall, but it´s walking-time is not over, it pusches against the wall until it´s state switches
    So i now made their AI a bit smarter:
    1. I made my them (and also chickens, wich are also in the graphics-set) always walk exact cell-sized steps (gridbased movement)
    2. at choosing a new direction to start a walk-state and after each cell-sized walking-step i let them check for collisions to turn into a new free direction, if they collide.
    So when start a walking-state they always choose random from all free (no obstacles) directions and when reaching an opstacle in their way while not finished the actual wank-state, they also choose a new direction the same way.