레쭈고 godot

godot 5차시

정땅미 2024. 9. 13. 21:17

만약 이렇게 캐릭터를 뷰포트의 가장 하단 중앙에 두고 싶다면 Position x 를 260px, y 를 960 px 로 해주어야 합니닷.

왜냐하면 저번에 Viewport 의 가로 길이는 520 px 이었기 때문에 그 절반을 해 주고,

세로 길이는 그대로 960 px 을 설정하시면 됩니당.

 

그럼 이렇게 캐릭터가 안정적으로 하단 중앙에 오게 됩니당.ㅎ3ㅎ

 

하지만 이대로 실행을 하면 코드를 손대지 않았기 때문에 캐릭터가 방향키를 따라 화면 밖으로 빠져 나가게 됩니다.

이것을 방지해야겠죠?!

그래서 저희는 540px (오른쪽) 을 넘어가면 그냥 540 이라는 값으로 일정하게 쭉 맞춰주고,

만약 0 (왼쪽) 을 넘어가면 그냥 0 으로 처리해줄 것입니다.

if position.x >= 540:
	position.x = 540
if position.x <= 0:
	position.x = 0

 

그러기 위해서는 이러한 코드를 작성해야 하는데요?!

코드를 이렇게 작성하게 되면 캐릭터의 절반 정도는 탈출을 하게 됩니다.

왜냐하면 이 캐릭터의 기존 크기가 자동으로 지정되어 있기 때문입니다.

이를 방지해주기 위한 코드는 이렇게 구성하였습니다~!

const CHARACTER_WIDTH_HALF = 40
if position.x >= (540 - CHARACTER_WIDTH_HALF):
	position.x = (540 - CHARACTER_WIDTH_HALF)
if position.x <= (0 + CHARACTER_WIDTH_HALF):
	position.x = (0 + CHARACTER_WIDTH_HALF)

 

상수의 이름을 마음대로 지정 후 캐릭터 절반의 크기인 40 px 를 지정해 줍니다. 그리고 이를 빼주거나 더 해주면 캐릭터의 절반도 탈출하지 않는 모습을 볼 수 있습니당. ^3^

0은 생략 가능하지만 헷갈리지 말자는 의미에서 한 번 더 작성해 보았습니당.

func _ready():
	pass # Replace with function body.

 

그리고 이러한 _ 가 붙어있는 함수는 특이한 함수입니당.

내가 씬에 등장을 해서 본격적으로 활동하기 전에 _ready 함수가 호출된다는 것을 의미합니다!

pass 의 의미는 파이썬에서의 의미와 똑같은데 그냥 클래스를 생성만 해 두겠다. 라는 의미입니다.

즉 지금 사용하지는 않지만, 나중에 필요하니 만들어만 두겠다!~ 라는 의미로 해석하시면 됩니다!

 

씬을 잘 선택해서 코드를 수정 해 줘야 하는 이유는

player 를 헐떡거리게 하고 싶은 경우 자기 자신에게 책임이 있기 때문에 player 에서 고쳐야 합니다.
물론 game 에서 수정해도 나쁘진 않지만 책임은 자신(game)이 지지 않는다를 확실하게 말해줄 수 있습니다.

func _ready():
	$AnimatedSprite2D.play("idle")

 

그렇게 되면 root 노드는 Player 가 됩니닷.

$ 를 작성한 후 다음에 노드를 입력하면 됩니당.

play 는 애니메이션 재생하는 것이며 idle 로 하면 헐떡이는 모션 나옵니다.
run 으로 변경해주면 시작하자 마자 달리는 모션이 나오게 됩니다.

extends Node2D

const SPEED = 400
const CHARACTER_WIDTH_HALF = 40

# Called when the node enters the scene tree for the first time.
func _ready():
	$AnimatedSprite2D.play("idle")

# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	var no_input = true
	
	if Input.is_action_pressed("left"):
		no_input = false
		position.x -= SPEED * delta
	if Input.is_action_pressed("right"):
		no_input = false
		position.x += SPEED * delta
		
	if no_input:
		$AnimatedSprite2D.play("idle")
	else:
		$AnimatedSprite2D.play("run")
		
		
	if position.x >= (540 - CHARACTER_WIDTH_HALF):
		position.x = (540 - CHARACTER_WIDTH_HALF)
	if position.x <= (0 + CHARACTER_WIDTH_HALF):
		position.x = (0 + CHARACTER_WIDTH_HALF)

 

처음 no_input 값을 true 라고 주고 만약 true 면 idle 을 실행하고, false 면 run 을 실행합니다.

반대로 달리고 있는 캐릭터의 방향을 바꿔주려면 scale 의 값을 음수로 해주면 됩니다.
scale.x = -1 left 로 달릴 때는 왼쪽 방향을 보고 달릴 수 있도록 뒤집어줍니다.
scale.x = 1 이건 그냥 그대로(원래 방향으로) 달리지만 x 를 처음에 2.5 로 지정했어도 1로 바뀌어도 찌부되지 않는 이유는
이 파일을 실행하자 마자 2 = 1.5 로 바뀌기 때문입니당.

 

그 다음으로는 맨날 씬을 만드는 것과 비슷하게 돌 씬을 만들었습니다!

 

처음 돌의 사이즈가 캐릭터가 맞기에는 매우매우 작아서 scale 로 크기를 키워줬습니다.

 

그리고 Area2D 라는 노드를 하나 가져와줍니당. Area 는 말 그대로 지역을 나타내주는 노드입니다.Area2D 를 넣으면 옆에 경고 표시가 뜨는데 그 이유는!! 충돌하는 역할을 하는 기능은 가지고 있지만 모양은 가지고 있지 않기 때문입니다.
우선 Area2D 는 돌을 맞는 영역이기 때문에 HitArea 로 이름을 변경합니다.
여기에서 자식 노드 생성하여서 그 모양을 지정해 주시면 됩니닷!!!

 

바로 그 자식 노드는 CollisionShape2D 를 넣어주시면 됩니당. (~ ̄▽ ̄)~

 

여기서는 모양을 지정해준다고 했으니 shape 에서 circle 로 지정해 주시면 됩니다!

그러면 이렇게 동그라미 충돌 영역이 생기게 됩니다! (돌 안의 파란색 동그라미)

저걸 조절하셔서 크기를 자신이 원하는 만큼 설정하시면 됩니닷.

 

그리고는 그룹을 만들어 주었습니다!

그 이유는 HitArea 가 위에서 떨어졌을 때 그게 돌이 아닌, 회복, 피 이런 템일 수도 있으니 구별해 주기 위해 Groups 를 만들어서 rock 이냐고 물었을 때 rock 이면 피를 깎는 등의 행위를 할 수 있습니다.

회복 아이템이나 다른 아이템도 이러한 그룹을 생성해서 원하는 행위를 실행 시킬 수 있습니다.

 

고도엔진 다음 차시가 너무 늦게 나왔네여 죄송합니다앙... 다들 공부 파이팅입니다. ^_^

아!!!!!!!!!!!!!!! 즐겁고 행복한 추석 보내세유우 ~

'레쭈고 godot' 카테고리의 다른 글

godot 7차시  (1) 2024.09.27
godot 6차시  (3) 2024.09.26
godot 4차시  (5) 2024.09.05
godot 3차시  (3) 2024.09.04
godot 2차시  (0) 2024.08.29