![Tundra Feed and Supply Co](/img/default-banner.jpg)
- 20
- 25 993
Tundra Feed and Supply Co
Registrace 28. 12. 2023
Alaska based software and game development
How to Use and Create Signals - Godot4
In this video, we discuss how to connect signals through the UI and through code (GDScript). We then also look at how to create and connect custom signals.
Thank you for watching!
Check out Moonwalk: Resurgence: tundrafeedandsupplyco.itch.io/moonwalk-resurgence
Tundra Feed and Supply Company: tundrafeedandsupply.com/
0:00 - Setting up our scene
1:51 - Connecting a signal through the UI
4:37 - Connecting a signal in GDScript
6:13 - Creating a custom signal
#gamedev #godot #godot4 #gdscript
Thank you for watching!
Check out Moonwalk: Resurgence: tundrafeedandsupplyco.itch.io/moonwalk-resurgence
Tundra Feed and Supply Company: tundrafeedandsupply.com/
0:00 - Setting up our scene
1:51 - Connecting a signal through the UI
4:37 - Connecting a signal in GDScript
6:13 - Creating a custom signal
#gamedev #godot #godot4 #gdscript
zhlédnutí: 693
Video
How to Create and Use Input Maps - Godot 4
zhlédnutí 239Před 2 měsíci
In this video, we discuss how to create and use Input Maps in Godot 4 with GDScript. Thanks for watching! Check out Moonwalk: Resurgence: tundrafeedandsupplyco.itch.io/moonwalk-resurgence Tundra Feed and Supply Company: tundrafeedandsupply.com/ #gamedev #godot #godot4 #gdscript
How to Create a Game Manager - Godot 4
zhlédnutí 9KPřed 2 měsíci
In this video, we create a simple game manager which randomizes the stats of our player and enemies, while also randomizing the position of spawned enemies. Thank you for watching! Check out Moonwalk: Resurgence: tundrafeedandsupplyco.itch.io/moonwalk-resurgence Tundra Feed and Supply Company: tundrafeedandsupply.com/ 0:00 - What is a Game Manager? 0:26 - Setting up our scene 0:35 - Programming...
How to Change the In-Game Cursor - Godot 4
zhlédnutí 1,3KPřed 2 měsíci
In this video, we discuss how to change the player's in-game cursor in Godot 4. We cover how to do this both through the project settings and programmatically in GDScript. Thanks for watching! Check out Moonwalk: Resurgence: tundrafeedandsupplyco.itch.io/moonwalk-resurgence Tundra Feed and Supply Company: tundrafeedandsupply.com/ #gamedev #godot #godot4 #gdscript
How To Create Nodes In GDScript - Godot 4
zhlédnutí 372Před 3 měsíci
In this tutorial, we look at how to create a node, e.g. programmatically instantiate, from code in GDScript. Thank you for watching! Moonwalk: Resurgence tundrafeedandsupplyco.itch.io/moonwalk-resurgence #gamedev #godot #godot4 #gdscript
How To Create Projectiles and Hitboxes - Godot 4
zhlédnutí 732Před 3 měsíci
In this tutorial, we build a complete projectile system. We create a projectile object. program attack functionality for a player, and integrate the projectile with a composable hitbox system to damage enemies. Thank you for watching! Moonwalk: Resurgence tundrafeedandsupplyco.itch.io/moonwalk-resurgence Chapters: 0:00 Introduction 0:30 Creating Projectile object 2:00 Programming Projectile 3:3...
How To Make 2D Firework Particles - Godot 4
zhlédnutí 229Před 3 měsíci
In this tutorial, we create simple 2D firework particles in Godot 4. These are the same firework particles that I made for player high scores in my game, Moonwalk: Resurgence tundrafeedandsupplyco.itch.io/moonwalk-resurgence #gamedev #godot #godot4 #gdscript
Let's Build a Menu - Godot Fundamentals
zhlédnutí 667Před 3 měsíci
In this tutorial, we build a complete main menu utilizing the Godot node system and GDScript. We discuss how to ensure your UI stays consistent across screen sizes and aspect rations, creating and customizing themes, and using containers to quickly build a scalable UI. We also implement particles effects, background audio, and even use an animation player to create a fade-in animation for the m...
I Made a Sequel to My Mobile Game - Moonwalk: Resurgence 1.0 Devlog
zhlédnutí 52Před 4 měsíci
In this video I discuss the development of Moonwalk: Resurgence, the remake/sequel to a mobile game I developed in 2019, Moonwalk. Moonwalk: Resurgence is available for free to play in browser on itch.io: tundrafeedandsupplyco.itch.io/moonwalk-resurgence If you run into any bugs, or even just have feature requests, let me know in the comments! Thanks for watching! Website: tundrafeedandsupply.c...
Moonwalk: Resurgence - 1.0 Trailer
zhlédnutí 44Před 4 měsíci
Moonwalk: Resurgence is a free infinite runner that gets progressively harder the farther you go. Move your dot across the screen using your mouse, and "jump" past obstacles to survive. Compete against yourself for high score and unlock various customization for yourself and the obstacles. Moonwalk: Resurgence is a casual/party game designed to be played in short sessions. It is a sequel/remake...
A Brief Introduction to Efficiency in Programming - Big O Notation
zhlédnutí 115Před 5 měsíci
In this video, we discuss efficiency in programming through Big O notation. We discuss why efficiency is important, and look at both scientific and practical applications of Big O and Big Omega. Thank you for watching! 0:00 - Introduction 0:38 - Why is efficiency important? 2:00 - What is Big O notation 4:19 - Equation examples 5:36 - Programmatic examples 9:02 - Common array sorting algorithms...
Projectiles, Hitboxes, and Composition - Godot Fundamentals
zhlédnutí 6KPřed 6 měsíci
In this tutorial, we discuss the fundamentals of developing 2D projectiles for top down or side scrolling games in Godot 4. We utilize composition to create an extensible hit detection system. We also discuss CollisionShape2D and Area2D nodes in greater details, looking into the differences between physics layers and masks. We then use Signals to build our hit detection system. We utilize the K...
Fundamentals of Top Down Character Movement - Godot 4
zhlédnutí 2,5KPřed 6 měsíci
Fundamentals of Top Down Character Movement - Godot 4
Making a Light-Based Side-Scroller in Godot 4 - Mini Jam 150 Devlog
zhlédnutí 132Před 6 měsíci
Making a Light-Based Side-Scroller in Godot 4 - Mini Jam 150 Devlog
Godot 4 Basic Top Down Character Movement - GDScript
zhlédnutí 275Před 7 měsíci
Godot 4 Basic Top Down Character Movement - GDScript
Godot 4 Basic AI Pathfinding - GDScript
zhlédnutí 335Před 7 měsíci
Godot 4 Basic AI Pathfinding - GDScript
Thank you so much this helped a lot!
simple to the point and quick thanks managers make more sense to me now
There is a useful plugin called SignalVisualizer, it shows node graph of signals.
Great video! Thank you for this!
This could have been a Loop toggle on the inspector, but ok I guess... Thanks you so much!!
great!
This is great, but I'm also trying to make a custom cursor when you hover a button
nvm that wasn't hard to figure out!
Nice! Great job!
Is there a reason you switched from using C# to using GDScript?
Hi @markushe73! Not particularly, and I still have quite a large backlog of C# videos for me to get through. I have recently been using GDScript a bit more as I have been prototyping features. Its definitely a great language for getting functionality fast. C# though is a critical part of development in Godot! I have shifted the video list around due to how videos perform or from requests I get from people, but I've never taken videos off my list. So more C# content is coming! Thank you!
Thanks. Very in depth and well explained. Looking forward to more content from you.
The easiest way to manage your player through different scenes, is having a good node trees structure. I think the best video that achieves the better result about it, is from Hot Worlds Gamedev titled as How to "Change Scenes" (without losing your player) | Godot 3.x Tutorial I'm sorry for talking about another youtuber content, but this is important because there is a lot of people struggling with it, I was one of its and now I'm able to manage my player through different scenes without problems
ty
Really appreciate this video!
Helol Tundra, do you use a plugin or some secret editor setting to remove 3D from your godot?
You go to Editor -> Manage Editor Features. Then you create a profile and you can uncheck all the stuff you don't want to use!
@@DeadIndGames That sounds like a cool feature, I'll be trying it out later. Thank you
good stuff, thanks
Nice tutorial! Keep up the good work.
This was really helpful, thanks for the quick video!
Yes it was very helpful... Thanks man
Having some sort of game manager is a good pattern, but it should only manage things which must be global (settings, save files, etc). All of the things covered here should be moved to thier own classes/scenes to avoid having a megaclass. It will make it easier to maintain in the long run and easier to write in the short term, its a win-win.
Yeah, I was thinking that the moment he put in the variables for player and enemy. Like, the moment you want a different enemy you're going to have some kind of handling that negates even having that variable in the first place.
Question - what's the purpose of making that rng variable (as opposed to just using randi_range by itself)?
It creates an instance in a variable, which means it can be seeded (calling the functions directly cant), and probablky more.
@tryoxiss is completely correct! While you don't have to declare the rng variable above, it does give you greater control of the randomization, should you wish to utilize those extended features.
But what if i had multiple enemies as multiple scenes, how would i spawn them randomly?
Hi @Sudoweeb, I would declare multiple enemy packed scene variables and assign my different enemy scenes to them. You could then have another randomly generated number which evaluates over either a if/elif/else or match statement to then generate one of the enemy types in a randomized manner. Thanks for the question!
@@TundraFeedandSupplyCo Thanks, could you do a video on resources by any chance? i couldn't get my head to wrap around it.
I'll add that to the list! Thank you!
it's more a "level manager" than a "game manager"
Would you be so kind as to tell the differences between the two? 😊
@@agriasoaks6721 level manager scope is to manage a level, and it can be re-used to manage different levels in different ways, like spawning enemies or items of that level here and there. Game manager is to manage elements globally, like the player's health, save/load game, load and move to a different level.
@@agriasoaks6721 a level manager handles things for each level, like this video shows. a game manager would have more global features, like handling save data and switching to different levels.
@@jayman1462 you mean level manager handles level swtiching. why would the game manager handle that.
@@opa8012 no, because a level manager is local to the level. it *could* switch scenes, but for transferring data, you would need something that stays when you change levels, hence a global game manager
How would you differentiate between a GameManager and a Game?
Hi DasLenny! Thanks for the question! I think this depends on your game and how you want to design it. Generally speaking, I would create a "Manager" for each distinct group of behaviors I would find in a game. For instance, an UpgradeManager, an InventoryManager, an EnemyManager, etc. These would ultimately be orchestrated by the GameManager which exists as the background entity enforcing rules upon the game. While the game manager isn't the enemy AI, for example, it may monitor when the enemy's health drops below 0, and then deletes the enemy from the game (or tells the EnemyManager to remove the enemy from the game). In this way, the game manager is like a referee in a sport. A GameManager could be specific to a level, or abstracted out further. For instance if I were designing a game like the modern XCOM games, I would have a distinct GameManager for the battles, and one for the overworld/base. For something like Skyrim, you may just have a single large GameManager that controls smaller game managers, like a dungeon manager, when the player interacts with them. Does that answer your question?
Need more videos like this pls pls pls... I always struggle a little with GDS. Pls make more bit-size concept explaining videos like this one... ✨♥️ Love from India 💐
Thank you! :3
Short and crisp!
I must say I'm several months into my Godot education and I can create any type of character in my sleep now, but this is actually a really useful and well explained reminder of the fundamentals.
Do you have a GameManger Tutorial ? Something to handle procedural random object & player placement and simple random stat/integer variable assignments for each object and player spawned onto the game level. Stats would be integer. Stats would be like Strength,Dexterity,Body,Max Movement Speed, Default Movement Speed. The GameManger would work with the "Scripts" like you did in this tutorial. Or is this not the way you would implement this use-case ?
Hi @alexxander7289 - I don't have a video up for that yet, but I'll get right on that and try to post a tutorial for it this coming Monday (06/03/24)!
Nice video! Would you know how to find "particle direction" on 4.2?
If you click on the FireworksParticle node, there should be a set of Direction properties under CPUParticle2D in the Inspector tab. You may also need to reduce/remove the gravity and set an initial velocity in order to see the direction changes.
@@TundraFeedandSupplyCo Oh, nice! I was using GPUParticles2D, but I guess it lost the Direction properties, but they can still be found on CPUParticles2D as you said. Then I was finally able to replicate the effect I had before. Thank you!
Thanks heaps.
Man that was so good. Thank you heaps. Looking forward to more. 👍
Thanks a ton, @Petergams!
Thanks for the tutorial! I've run into issues with instantiating objects before and this helped me wrap my head around it more. I was wondering, would it be better to put the bullets movement inside _physics_process() , to avoid projectiles phasing through targets at lower frame rates and/or faster bullet speeds?
Thank you for watching! Yes, you absolutely could use _physics_process in place of _process. Good idea!
Isn’t the point of the collision shape 2d to act as a hit box? Did you need to act again
The CollisionShape2D node allows us to define the boundaries of a node, however it does not give us access to the same signals that are available on the Area2D node. Giving the Area2D a collision shape allows us to build on the functionality of the Area2D node with whatever boundaries we define with the CollisionShape2D node. The initial CollisionShape2D node assigned to the enemy and the player are used in this instance to stop the player and enemy from moving through each other. While those same collisions shapes could be used as a hitbox of sorts (though a CharacterBody2D needs a CollisionsShape2D and an Area2D needs also needs ones and I don't believe they can share child CollisionsShape2D nodes), there are instances where you may not want the sprite of an object to exactly match the hitbox. This also separates our behaviors into distinct, reusable components, following the "S" of SOLID principals (the Single-Responsibility principal). The hitbox node could be placed on any node, and immediately give hitbox related functionality.
TYVM !!! I liked all of this tutorial. I really liked it when you manually hooked up the hitbox signal. Was wondering how one could add a ammo clip of x projectile(s) capacity ? I could make an export variable of a several packed scenes for each projectile. And then remove the packed scenes. But Then I would have to manually add the packed scenes again, so the player could reload. Is this the path one would take to create the "ammo clip" capacity ?
Hi @alexxander7289! There are a bunch of different ways to do this. Pseudo coding an idea for how to implement this, I would likely: Create a "capacity" variable: @export var capacity = 5 I would then create a variable to track how many shots the player has taken: var shotsRemaining = capacity Then a reloading variable: var reloading = false Inside our if(Input.is_action_just_pressed("attack") condition, we would need to decrement the shotsRemaining every time the player shot, potentially as the last step of the if statement as its placement will change the behavior: shotsRemaining -= 1 I would wrap all the logic for creating a projectile in an if statement checking if shotsRemaining >= 0 I would also add an if statement checking for shotsRemaining and starting a "reload" timer if applicable: if((shotsRemaining < 1) && (reloading == false): reloading = true $ReloadTimer.start() ReloadTimer would just be a Timer node attached to the player. In our ReloadTimer.timeout function in the player script, I would then reset shotsRemaining and reloading: reloading = false shotRemaining = capacity Let me know if that helps!
nice tutorial, I really like it. Also could you please it louder next time?
Thank you! Apologies for the audio being quiet! I used to be too loud and it looks like I over corrected, haha.
Thanks man :D
Hi @TundraFeedandSupplyCo , I want to change the shape of each point from square to circle, what would I do? Thanks!
Hi @pukagol, one way you can do this is, on the CPUParticles2D node, in the Inspector, under Drawing, there should be a Texture property. There are a lot of different options if you click the dropdown, though one simple way you can draw a circle for the particles is to drag and drop a sprite of a circle onto the Texture property dropdown. Depending on the color of the sprite, the hue and color variations might look different to the particles created in the video, though you should still get a range of colors. Let me know if that doesn't work!
@@TundraFeedandSupplyCo Thanks a lot !
Thank you so much!!!
volume seems really low.
Sorry about that! I over corrected when setting up a new mic. I'll make sure to fix it going forward. Thank you for the feedback and for watching!
Thats some nice Qualitiy content man. i like your explanation on things. Not u do that and that u explain it how thats what im interessted and you do it realy good
Thank you, @kevinrabbe5066!
This tutorial is the best I've seen to get into Godot game programming. Kudos to the author for the excellent presentation and teaching!
Thank you very much!
Lerp is short for linear interpolation. What you've done here is effectively recreate the exact same behavior that you enabled with the checkbox in the inspector. Adjusting the follow speed is also possible by changing the value directly under that check box. If you truly want a different feel for the interpolation you will have to use a different easing function. Lerp uses linear easing, but you could try cubic, quadratic, etc. Alternatively, you could use a custom curve and adjust it until you are pleased with how it feels. When scripting player movement, my approach is to use linear easing, but code in acceleration and deceleration speeds so that I can precisely tune the curve on either side. If you don't account for this the player goes from a dead stop to a full sprint instantly which is usually not desirable.
Great points! In this video, I was mainly looking to highlight different implementations for camera smoothing, that it could easily be done both through the built-in functionality or through code.
Thank you for covering UI content! There are so many versions of "make your first platformer" tutorials out there but this is the first I've seen of how to get the ui and menu's going! Very helpful for a beginner :)
Thank you! I'm looking to discuss more UI styles / features in the future. I'd like to try and make command-line style menus for a future project, so we'll see how that goes!
Please do I'll be waiting for it.@@TundraFeedandSupplyCo
Hey everyone! Thanks so much for watching! Apologies about the audio issues for the main menu audio segments. Timestamps with their respective comments summarized are below: 40:30 to 40:37: During this section I relate the manual starting of the audio to the manual starting of the particles. 44:48 to 44:52: I talk about how with the button text highlighting, the players can now get feedback for what button they are going to click. I also talk about why I change the aspect ration for the project back to keep. As we know the exact viewport size that our game will be played in, we can work with a single aspect ratio in mind. 45:09 to 45:13: I talk about how the keep aspect ratio setting fits better with our game, however highlight that the edge bars are still on the sides of the screen. 46:33 to 46:38: I show the new button text color difference on hover, though note that we may want to make it slightly darker so its more noticeable. 46:50 to 46:58: I talk about the buttons likely now being too dark, and then also begin talking about what to do if the changes aren't taking immediate effect in your project. 58:59 to 59:03: I mention that, while our animation isn't playing, we can see it affecting our title as its alpha is 0, e.g. its not visible. 1:03:42 to 1:03:50: We watch the animation play, then comment that 2 seconds felt a bit quick. 1:04:17 to 1:04:24: I comment on the animation feeling better, however it still feels quick and why that's happening. 1:06:02 to 1:06:12: I talk about how the animation still takes the same amount of time for the alpha to reach 1, however it visually appears much slower. 1:07:16 to 1:07:41: I talk about how our particles and background music are starting, our animation is fading our menu in, the buttons are stylized and reacting to user mouse hover and lead into hooking up button functionality. 1:11:10 to 1:11:20: I highlight how hitting our start button now fades our menu out
Great video, thank you! I'd like my 2D character to... (1) rotate/face using the mouse (2) W/S moves the player forward/backwards, based on the facing direction (3) A/D strafes the player left/right, perpendicular (90 degrees) to the facing direction I've solved 1 & 2, but cant figure out how to do #3, any help would be appreciated my code... look_at(get_global_mouse_position()) # mouse controls facing (rotation) direction velocity = transform.x * Input.get_axis("down", "up") * speed # W/S moves the player forward/back based on the facing direction
Hey @Mr.TummyOfClanTummy! This should work for you: extends CharacterBody2D var speed = 400 func _physics_process(delta): look_at(get_global_mouse_position()) var move_forward = Input.get_axis("down", "up") var move_sideways = Input.get_axis("left", "right") velocity = ((transform.x * move_forward) + (transform.y * move_sideways)) * speed move_and_slide() The parentheses are important due to PEMDAS, haha. If you remove the outer parentheses, only move_sideways would be multiplied by speed, so that can cause some unexpected behavior. Let me know if this is not the behavior you were looking for. Hope this helps!
@@TundraFeedandSupplyCo Huge thank you!!!
thank u! now in import is an option thats named loop
Thank you very much. Is it possible to do a tutorial for something like Papers Please or Hacknet? There are no tutorials for those type of games anywhere. Not only for Godot.
Hi @smellfungus2801, thank you! That's a great idea. I will add those to my list to see if I can make a tutorial for those style of games.
Warning: you need to hit "bake navigationPolygon" (i am using 4.2.1)
Really good tutorial. This is great for beginners to get their head around Godot. Definitely subscribing and checking out more of your videos.
Thank you very much, cradledani!