HomeVideos

Godot 4.5 Beginner Tutorial: Build a Survivors-Like Roguelite (Part 1)

Now Playing

Godot 4.5 Beginner Tutorial: Build a Survivors-Like Roguelite (Part 1)

Transcript

602 segments

0:01

Today we're going to start building the

0:03

foundation of one of the most addictive

0:04

genres in indie games, the survivor

0:06

rogue light. Now, welcome back to GDO

0:08

Dev Checkpoint. Today we're starting a

0:10

highly requested series, the survivor

0:12

style action rogike. It's addictive,

0:14

chaotic, and believe it or not, the

0:15

codebind is surprisingly approachable,

0:18

and by the end of this video, you'll

0:19

have a hero that moves smoothly in a

0:21

world that goes on forever. Let's get

0:23

building. First, let's get our scene set

0:26

up. Now, we're not going to use a

0:27

generic node 2D for our player. We're

0:29

going to need some physics. So, we're

0:31

going to use a character body 2D. This

0:33

node's going to handle some collisions

0:34

and movement logic for us automatically.

0:36

So, other node or search for a character

0:38

body 2D right in here. Going to create

0:42

that and rename this to player.

0:46

Now, in order to see our player, we're

0:48

going to need a sprite 2D. So, you right

0:49

click, add child node, sprite 2D. Now,

0:52

you can use whichever sprite you'd like,

0:55

but once again, I'm going to use some

0:56

Kenny's assets. Thousands, completely

0:58

free. Very generous site if you haven't

1:02

checked them out. I recommend it highly.

1:04

I'm going to use some pixel platformer

1:06

assets for tile maps. And I'm going to

1:08

use the creature mixer, which is on the

1:10

Hio. I'll link all these in the

1:12

description. If you use this tool, you

1:14

can get sprites automatically.

1:18

And here's our base guy. We're just

1:19

going to use him. In order to get this

1:21

sprite, you just click on this menu here

1:23

and then you save the sprite sheet

1:25

wherever you want to save it. And what

1:27

you end up with is a little sprite sheet

1:29

with four frames. And once you have

1:31

that, I'm going to right click on my

1:33

file system here and create a new folder

1:35

called sprites.

1:37

And with sprites highlighted, I'm going

1:39

to click and drag my new sprites into

1:42

the folder. Now that they're imported,

1:44

here they are. Here's our little guy.

1:47

Now I can click and drag. Let's see the

1:49

sprite 2D is selected. Click and drag my

1:51

creature sheet into my texture here.

1:55

And of course, we don't need all four

1:57

frames on here. And how do we change

1:59

that? Well, you go to animation in the

2:02

inspector with sprite 2D selected. And

2:05

we have horizontal frames and vertical

2:07

frames. One vertical frame, so one's

2:09

fine, but we have four horizontal

2:11

frames. So, I'm going to change this to

2:13

four. Now, we have our zero frame

2:16

animation right here. Let's fix this

2:19

blurry. Now you can do it individually

2:21

per sprite in the texture filter, but we

2:24

can do it projectwide too now with the

2:26

new GDO settings. So project

2:30

project settings. You want to search for

2:33

texture

2:35

filter.

2:37

There we are. Textures. So default

2:39

texture filter. We're going to change it

2:41

from linear to nearest. Now this is

2:43

going to keep your pixel art nice and

2:45

crisp. So once you close that, you see

2:46

how nice that looks. Now, now if you

2:49

don't want to do it projectwide, you can

2:50

still just do it on the sprite itself.

2:52

Just go to nearest, but we'll click

2:53

inherit because this inherits from the

2:55

project settings. And great. Now we want

2:57

our sprite to be standing on the yaxis

3:01

zero here. So we want to change our

3:04

offset to -12. There we go. And we get

3:08

him his feet sitting right there. Now we

3:12

also need a animation. So, we're going

3:14

to use our animation frames. So, you

3:16

right click the player. We're going to

3:17

add an animation player right there.

3:21

And with the animation player selected

3:23

down here, we're going to add a new

3:24

animation called idle.

3:27

And we only need one frame. So, we need

3:29

to worry about any of the settings for

3:30

now. We want to with our animation

3:33

player selected, select sprite 2D. And

3:36

then we're going to go down to our frame

3:37

here in our animation. We're just going

3:39

to use the zero frame. So we just do

3:41

that by selecting this key here. Create.

3:45

And now we have our zero frame

3:47

animation. And we can loop this. Even

3:49

though it's not really an animation yet,

3:50

but if you have a more difficult one,

3:52

then the loop will matter more as you'll

3:55

see in our run animation. So we play

3:58

that, it's just going to play the same

3:59

frame over and over. Now our idle setup.

4:02

Now with that, we need to set up our run

4:04

animation. New and call this run.

4:09

Then we want to add the frames per

4:12

second here. We're going to use eight

4:14

frames per second, so it's not too slow,

4:17

but we only have four frames to use. So

4:20

we in our by this little clock here,

4:22

animation length, we'll change that to

4:23

four. We can zoom in. If you hold

4:25

control and the mouse wheel or use this

4:28

little bar down here, you make sure we

4:30

have four frames. And once again, with

4:32

our sprite 2D selected, make sure we're

4:34

starting on frame zero. We're going to

4:36

add the zero frame. create. Add one,

4:41

two, and then three. Now we have all

4:43

four frames in there. Now here you want

4:46

to make sure this update mode is

4:47

discreet. It should be, but if it's not

4:49

for some reason, just make sure it is or

4:51

else it'll get all funky as just see. So

4:53

here's the discreet. If we play now, we

4:56

have a nice run animation. Oh, now we

4:58

need it to loop though. Loop. So play.

5:01

Nice run animation. If yours looks like

5:05

it's jittering at the end like this,

5:07

then you probably have continuous mode

5:09

on. See, continuous mode tries to keep

5:13

it continuous after this third frame. If

5:15

you look on our frame section here, it

5:18

tries to slowly go back to zero before

5:20

it gets to zero. And we don't want that.

5:23

So, we just want discreet so it uses our

5:25

frames appropriately.

5:27

Now, we have that set up. The last thing

5:29

we need is something that's going to

5:30

detect collisions. You'll see from this

5:33

node configuration warning, it says it

5:35

needs a collision shape 2D or a polygon

5:37

2D. We're going to use a collision shape

5:39

2D. Right click, add child, collision

5:42

shape 2D. And then this needs a shape.

5:45

We're just going to use a circle since

5:47

our enemies going to our player is going

5:49

to be dodging enemies. A circle feels

5:51

smoother than a box. So if we click in

5:53

this shape in the inspector here, circle

5:55

shape. Now, we want this circle shape

5:57

just to be on our feet. We don't want

5:58

our collision box too high. the player

6:01

will be super frustrated. So, we'll just

6:03

cover the feet there. I'll bring it up a

6:05

little bit. Now, that's where our

6:06

collision's going to be. Our main torso

6:08

and legs.

6:10

Going to pause that. And then with that

6:12

all set up, we have unsaved scene. So,

6:14

we need to save it. Neither do Ctrl S or

6:16

scene, save scene. Now, we're going to

6:19

not save it in the root folder. We're

6:21

going to create a new folder with a

6:22

right click, new folder, scenes. Oh,

6:26

lowercase GDO

6:28

preference. All right, player. Save.

6:32

Then we have our player saved in our

6:33

scenes folder. Now for the movement. In

6:36

platformers, we worry about gravity, but

6:38

in a top-own survivor game, we just need

6:40

X and Y movement. We're going to use a

6:42

specific function called input.get

6:44

vector. This is going to be crucial

6:46

because it prevents the player from

6:47

moving faster diagonally than they do in

6:49

a straight line, which is a common math

6:51

bug in beginner games. Now, the first

6:54

thing we want to do is actually set up

6:55

our own inputs. Now, in the project

6:58

project settings, in our input map here,

7:01

we're going to set up our own movement

7:03

actions. Now, GDO 4.5 does have built-in

7:06

actions here, which have the UI left,

7:10

right, up, and down, but you'll see it

7:13

does not actually include WD, which is

7:15

what most players prefer, at least

7:17

right-handed players. We're going to

7:19

keep the arrows and set those up in our

7:21

new ones, and the joyad and set those up

7:23

in our new ones as well. That'll make

7:25

ours more modular and customizable. So,

7:28

we'll hide these. We're going to move

7:30

our own here or use our own called move

7:33

left. And for this one, we want to add

7:35

an event. And for left, we're going to

7:38

use a. This is listens for your input.

7:40

Just push a. Okay. And then we also want

7:43

to use the arrow key left. So, add

7:45

another event left on the arrow key for

7:47

our left-handed people. And we can use

7:50

the joypad if you'd like, which is just

7:52

as easy. You click the event again and

7:54

click left on your joyad. Okay. And we

7:57

also want to have a move right. Move

8:00

right. And for this one, that event,

8:03

move right, which is D, and right on the

8:06

arrow key.

8:08

And then we want right on our joypad.

8:12

All right. We also need move up.

8:16

Not the underscore up. That's what we're

8:18

going to use. I'm use add event. Up is

8:22

W. Also up on the arrow key and also up

8:27

on the joyad.

8:29

Great. Last one. Move down. Move down.

8:34

There we go. Which is S and down on the

8:39

arrow and then down on the joyad.

8:43

Now we have a functional Whoops. Down on

8:46

the joypad. Now we have a functional

8:47

input map. customizable and one we could

8:50

use to our own without messing with the

8:52

built-in defaults. We'll close that. Now

8:55

that we have them, well, we need to use

8:57

them. So, we're gonna go to the player

8:59

here, attach a script, not in the scenes

9:01

folder, though. We want to put it in the

9:04

So, if you click on this path here, if

9:06

you don't know, you click there, go up

9:08

to our root, and we're going to create a

9:09

new folder. Right click, new folder

9:11

called scripts. Keep organized. You'll

9:14

thank yourself later. Player GD open

9:18

scripts. Keep the template for now.

9:21

There we go. I'll make this get rid of

9:23

this here. Make this bigger and zoom in

9:25

a little bit. Now you'll see the UI

9:27

accept UI left UI right uses by default

9:30

but we changed that because we have want

9:32

to use W. So actually we can get rid of

9:35

all this code in here. Just the boiler

9:38

plate code. We'll keep the physics

9:41

process. We are going to use that. And

9:43

we're also going to grow these constants

9:45

variables. We don't need these right

9:47

now. We are going to use an export

9:50

variable called speed. So the same just

9:53

an export same 300. Now why an export

9:57

instead of a constant? Well, we want

9:59

this adjustable in the inspector. So if

10:01

you controlclick export you can mark the

10:03

following property as exported editable

10:06

editable in the inspector doc just so we

10:08

can finagle with it if we want to

10:10

without having to come into the script.

10:12

All right. And you see it's it's

10:13

highlighted. It's cautioning. It's only

10:15

just saying that we're not using our

10:16

delta. If you click down here, we're not

10:19

using it. If we don't want to use it

10:21

right now, we can underscore here to get

10:22

rid of this caution, which I like. That

10:25

way, I know my cautions and my warnings

10:26

are valid. Now, inside our physics

10:30

process here, we're going to keep our

10:31

move and slide. We're going to enter

10:33

down and then tab over here, and we're

10:35

going to create a variable called

10:37

direction. This way we can track our

10:40

input get vector the function we're

10:43

talking about to get our direction. Now

10:47

you'll see once you come into this

10:48

parenthesis here after get vector should

10:50

come up with all of our actions we just

10:53

created. If it doesn't then you want to

10:54

check your input functions or check your

10:56

spelling here. So the first one we're

10:58

going to do move left. You can double

10:59

click here. That way we don't got to

11:01

worry about spelling it correctly. We're

11:02

just going to add all these in. Move

11:04

left, move right, move up, and then move

11:08

down.

11:11

There we go. Now, after we have our

11:13

direction, we're going to enter down

11:14

here. And then we're going to apply

11:17

velocity. Let's make some notes here so

11:20

we know what we're doing here later.

11:22

Apply velocity. And this top one here,

11:24

we're just going to get input direction.

11:27

So, left, right, up, down.

11:30

There we go. So, we're going to go into

11:33

this apply velocity. How do we do that?

11:35

Well, velocity is a keyword in GDAU

11:37

already. So, we can use that and use our

11:40

direction we just got. And then we're

11:42

going to multiply that by how fast we

11:44

want to go or speed. Now, after that, we

11:48

know how fast we're going. We just need

11:49

to know what animation to play while

11:52

we're moving. So, we're going to handle

11:54

animation

11:56

player here. So, we're going to check if

11:58

the velocity.x. So the left and right

12:01

does not equal to zero. So not equal to

12:05

zero means we're moving left and right.

12:08

But we also need to make sure we're not

12:09

moving up and down. So or the velocity.

12:12

So up and down, not velocity. Yeah,

12:15

wait. Velocity.

12:17

There you go. Doty does not equal zero.

12:21

So that means we're out standing still.

12:23

Up or down axis. So colon. Then we enter

12:27

down into there. And we're going to get

12:28

our animation player with this money

12:30

symbol. Now, once you do that, it should

12:32

pop up with these two here. If it

12:34

doesn't, then you perhaps change the

12:36

name on your animation player. So, you

12:38

want to make sure this actually I close

12:40

this down. We have our animation player.

12:43

It's named exactly like it is here. If

12:45

you changed it, you just have to make

12:47

sure this has matches. So, you can do is

12:50

actually click and drag this into your

12:53

code. If you drop it anywhere, it'll pop

12:55

up with the reference to it. Oops. So,

12:59

now that we know ours matches, we want

13:02

to play something. So, what do we want

13:03

to play when we're moving? We want to

13:05

play our run animation. So, play. And

13:07

once you come up with that, it should

13:08

pop up automatically with your

13:10

animations we set up earlier. We want to

13:13

run. So, the other thing we want to do

13:14

is if we're not running, not a comma, we

13:17

want to actually stop. So, we play our

13:20

idle animation. So once again, we'll

13:22

call our animation player play and idle.

13:26

Now we want to detect if we're going

13:28

left or right because we want our sprite

13:30

actually to face the direction we're

13:32

moving. So we want to handle the sprite

13:34

flipping. And we do that by checking if

13:37

our velocity x is greater than zero.

13:40

That means we're going to the right. So

13:43

positive x means we're going right. So

13:45

I'll show you where we're actually

13:46

accessing. I'll minimize this. In our

13:48

sprite 2D here in our offset, we're

13:51

accessing the flip H, so the horizontal.

13:54

If I go back to our 2D, you can see

13:56

we're actually facing right already. So,

13:59

if we want to go right, we want to keep

14:02

this false. Now, if we're going left, we

14:05

want to actually activate this to true.

14:07

Then, we turn to the left. So, we'll

14:09

keep it default. Fault to the right.

14:13

Now, back in our script, now we know

14:15

we're accessing. We want to go into this

14:19

function here and we want to access our

14:21

sprite 2D. And once again, money symbol

14:25

S should pop these up unless you changed

14:27

your sprite uh 2D name. They just want

14:31

to match this node here. So we are

14:33

sprite 2D default. So sprite 2D.flip

14:38

h. Now we're going right. So we want to

14:40

keep it false. Now l if the velocity x

14:45

is less than zero that means we're going

14:47

left. So once again our sprite 2D money

14:51

symbol there flip h is going to be true.

14:57

Now once you go back and forth left and

14:58

right should flip accordingly. Now last

15:01

thing and most important in these

15:02

physics processes in GDO is the move and

15:04

slide. Now this handles character

15:07

movement. So we're going to move the

15:09

character with the move and slide. you

15:11

don't have this, it's not going to work.

15:13

The movement slide actually has when it

15:16

handles the velocity, it handles the

15:17

delta inside the movement slide, which

15:19

is why we don't use it specifically. You

15:21

only use this if you want to access

15:24

frame specific stuff after the movement

15:26

slide. Then we go and save this script.

15:30

Now, if we go back into our 2D section

15:32

here, we're going to scroll out a little

15:34

bit and we see our viewport window here.

15:38

We want to access our player. Click a

15:41

player node and let's click this move

15:43

mode here. Move your player down into

15:46

the middle of the viewport area. And

15:49

while we're here, we are going to access

15:52

access the transform. Let's make our guy

15:54

a little bigger at five. That way we can

15:56

see what's happening. Now you've reached

15:58

a checkpoint. Go ahead and run the scene

16:00

by pressing F6 or use the current run

16:03

current scene button in the top right.

16:05

Looks like a film reel. Now move your

16:07

player to the right. Keep going. What

16:09

happens? Well, you walk off the screen

16:11

into the void. We need the game to

16:13

follow us. Now, I want you to try to

16:15

figure out which node we need to add to

16:17

fix this before I show you. Go ahead and

16:19

give that a try.

16:24

Now, the answer is the camera 2D node in

16:26

GDAU. If a camera is a child of a moving

16:29

object, it automatically is going to

16:31

track that object. So, let's lock the

16:33

view to the hero. Now, first off, let's

16:35

go ahead and reset our transform back to

16:37

zero. We want to keep our player at zero

16:40

and save that. And then we also probably

16:43

want to scale down our guy a little bit.

16:45

So we can go back to one. If we want to

16:46

scale our character up, we can do it

16:48

when we get into the main game scene. So

16:51

with our player selected, we right

16:52

click, add child node, camera 2D. So

16:56

right here, I'm going to create.

17:00

It really is that simple. So now we have

17:01

this purple box surrounding our

17:03

character. If we hide it, it goes away.

17:05

Then we see it again once we unhide it.

17:07

Now, you can do things like position

17:09

smoothing and add drag to make it a

17:11

little more fancy, especially with being

17:13

able to see. If we run this now, run

17:15

current scene. Now, we notice our

17:17

character starts right in the middle, no

17:19

matter which way we go, up, down, left,

17:21

or right. It's hard to tell because

17:22

we're in a gray void. So, actually, if

17:24

we close this, enable position

17:27

smoothing. We're going to turn this off

17:29

later, but for now, enable it. We're

17:31

current scene. And now we have this

17:35

where I can see the camera catching up

17:38

with us as we move. We also see that

17:40

jury movement. We don't want that

17:42

either. So in a top down survivor game,

17:45

we're just going to keep that position

17:46

smoothing off. We'll be able to see that

17:49

we're moving once we add a ground in our

17:50

main game. So with all that back set,

17:53

position smoothing off, no drag, camera

17:56

2D setup, our player is

17:59

ready. Go and save that. So right now

18:02

we're just walking on a gray void. We

18:04

need a ground. So in previous versions

18:06

of GDO, this required a complex setup

18:08

with background and layer nodes. But in

18:10

GDAU 4.5, we can use the new streamlined

18:13

parallax 2D node.

18:16

Back in our project here, we want to

18:17

actually scene new scene. This going to

18:21

be a 2D scene. Then we're have a node 2D

18:24

popup. We're going to rename that to

18:26

main game. Now, with this main game

18:29

selected, we're going to rightclick, add

18:31

child node. We're going to add something

18:33

called a parallax

18:36

2D right here. That'll create that.

18:40

Now, we want to set the repeat with

18:43

parallax 2D repeat. We're going to

18:45

select this to repeat about three or

18:47

four times. So, that's going to ensure

18:50

that it draws extra copies so it

18:51

prevents the flickering edges. And we

18:54

also want to scroll down to our ordering

18:55

here. Make sure it's always in the

18:57

background. So, we're just going to do

18:58

negative 100. That way, we know our

19:00

ground is always on the bottom. So, I

19:03

want now we need to add the ground. So,

19:06

our sprite I'm going to add from the

19:08

pixel platformer. I'm going to add some

19:10

ground that we have in here like this

19:12

one here. And you get that from the

19:14

Kenny assets. They're free to download

19:16

and you can use them in anything you'd

19:17

like. Creative common CCO. And with our

19:20

after you get that downloaded and pick

19:23

which one you want, sprites and make

19:26

sure that's selected. And what I'm going

19:27

to do in the pixel platform tile

19:29

section, I'm use tile 01 04. If you want

19:33

to use the same ones I'm using.

19:36

All right. Now, we just need to right

19:37

click on our parallax 2D, add a child

19:40

node, sprite 2D.

19:43

And our sprite 2D, I'm going to select

19:44

this ground I'm going to use. Click and

19:47

drag. Drop that in there. Now we have to

19:50

change this texture here and we need to

19:52

make sure repeat is enabled. If it's not

19:56

enabled, it will not work. So once

19:59

again, it's texture with the sprite 2D

20:02

enabled. Repeat. Okay. And to enable the

20:06

infinite loop here, click our parallax

20:09

2D. Find the repeat size here in the

20:12

inspector and find your tile size. If

20:15

you double click on it or you can hover

20:17

over it, the dimensions are 18 by 18 on

20:20

mine. Or you can double click and it

20:21

should say in the bottom right hand

20:23

section. So with our parallax 2D

20:25

selected, repeat size, we're going to

20:28

use

20:29

18 by 18. Now we know our repeat size

20:33

will match our sprite size. We also need

20:36

to make it a little bigger. As we run it

20:37

now, we'll be able to see the edges

20:39

here. So we go back to our sprite 2D.

20:42

What we want to do is change this region

20:44

here. So, select that to on. Now, it'll

20:47

disappear. But now, we change our width

20:49

and our height. This will give us our

20:51

ground that will fill our entire

20:53

viewport. So, we can't see when it's

20:55

being replicated. So, we're just going

20:57

to do something large like 4,000.

21:00

4,000 on both the width and the height.

21:03

There we go. If you zoom out, this block

21:06

here is all that will ever be rendered

21:09

for the ground, but infinitely. And

21:12

since we have the camera that

21:13

automatically tracks us, we don't need

21:14

to write any code. It just works.

21:17

So now we just need to get our player in

21:18

here. So with our main game selected so

21:23

it doesn't become a child of the

21:24

parallax. So select the main game,

21:27

select this chain link here, instantiate

21:30

child scene. We're instantiate our

21:32

player. So click on that. Now we have

21:34

our player in the scene. You also want

21:37

to make sure your player is below your

21:40

parallax 2D. Since we changed the Zorder

21:43

index, it should still draw on the

21:44

bottom. But as practice in 2D games,

21:48

GDAU draws from the bottom up. So the

21:51

higher it is in the hierarchy, the lower

21:53

it is in the Z order. Great. Now we have

21:55

our player in here. We can actually test

21:57

this. Now we're on the current scene.

22:00

Oh, we need to save our scene first. So,

22:02

in our scenes folder, main game, save it

22:05

as that. Click save. Our game should

22:07

start. And there we are. Now, we can run

22:10

left, right. So, our code is working for

22:13

our flipping sprite. And we can go as

22:15

far as we like. If you want to see this

22:18

in action, you can click this parallax

22:20

2D or no, we can click this remote

22:22

first. Sorry. Click this remote, expand

22:25

out the main game, then click the

22:27

parallax 2D. Now, if you go back into

22:30

our game here, now if you move around,

22:33

scroll down a little bit in the parallax

22:36

2D section, the screen offset. If we

22:38

move around, you can see the ground

22:41

parallax actually moving. So, we move to

22:44

the right, move to the left, move

22:46

diagonally. This ground is following us.

22:50

Now, the world is infinite. You can go

22:52

as far as you want. Fantastic start.

22:54

Now, we have a physics-based character,

22:56

normalized diagonal movement, a tracking

22:59

camera, and a world that never ends. You

23:01

built the engine that's going to drive

23:02

the game. Now, in the next video, things

23:05

are going to get dangerous. We're going

23:06

to build the horde. We'll script enemies

23:08

that spawn endless around the edges of

23:10

the screen and relentlessly chase the

23:12

player. Make sure your code is saved,

23:14

and I'll see you there. Now, if you

23:15

found this helpful at all or fun, leave

23:17

a comment what your GDO game dev goals

23:19

are. I love seeing your stuff. Now,

23:21

please like, subscribe, and hit that

23:23

notification bell. It really helps out

23:25

the channel. And thank you to all our

23:26

current and past Patreon and coffee

23:28

members. Your generous support keeps the

23:30

channel moving. Now, if you want early

23:32

access to tutorials, source code, or

23:34

suggesting future tutorials, please

23:36

consider becoming a member yourself. The

23:38

links are in the description. I'm

23:40

Spaghetti Syntax, and remember, finished

23:42

not perfect, fail fast, fail often.

23:45

Always stay curious, and I'll see you at

23:48

the next checkpoint.

Interactive Summary

This video explains how to build the foundation for a survivor roguelike game in GDevelop. It covers setting up the player character with a CharacterBody2D node, adding a sprite, configuring animations (idle and run), and implementing collision shapes. The tutorial also details how to set up custom input actions for movement (WASD and arrow keys), script the player's movement using `input.get_vector` for normalized diagonal movement, and handle sprite flipping to face the direction of movement. Additionally, it demonstrates how to add a Camera2D to make the game world follow the player and how to create an infinite scrolling ground using the Parallax2D node. The video concludes with a functional player character in an endless world, setting the stage for adding enemies in the next tutorial.

Suggested questions

7 ready-made prompts