레쭈고 godot

godot 7차시

정땅미 2024. 9. 27. 01:50

 

우선 저희가 만든 RockSpanwner 는 script 코드만 있는 특별한 노드입니다!

여기서 자식 노드로 Timer 를 추가해 주면 되는데요!

 

여기서 wait time 몇 초 동안? 할 것인지 여부를 결정하는 것이고, one shot 한 번만 할 것인지 여러 번 할 것인지, autostart 자동 실행 할 것인지 아니게 할 것인지를 결정하는 것입니다!

extends Node

var window_size
# 난수 발생기 객체 생성
var rng = RandomNumberGenerator.new()

func _ready():
	# 뷰포트 사이즈 얻어오기
	window_size = get_viewport().get_visible_rect().size
	print(window_size)

func _process(delta):
	pass

func _on_timer_timeout():
	# 씬 리소스 로드
	var rock_scene = preload("res://scenes/rock.tscn")
	# 씬을 인스턴스화
	var rock_instance = rock_scene.instantiate()
	# 랜덤한 돌 x 위치 설정을 위해서 난수 함수 호출
	# (여기서는 0 ~ 540까지의 랜덤한 x 반환)
	var random_x_pos = rng.randf_range(0.0, window_size.x)
	# position 속성 조정하여 위치 정해주기
	rock_instance.position.x = random_x_pos
	# RockSpawner 씬에 추가
	add_child(rock_instance)

 

이 코드는 무슨 코드냐! 하면 바로 RockSpawner 에 있는 코드입니다.

우선 처음에 window_size 를 구해주는 이유는 돌이 떨어지는 영역이 ViewPort 사이 즉, x 범위 안에 있어야 하기 때문입니다.

그리고 이때 x 범위 내에서 랜덤으로 떨어져야 하므로 난수를 구하는 객체도 생성했어요!

 

이때 스크립트 전체가 클래스이며, 이 두 가지는 필드, 나머지는 거의 메소드 라고 보시면 됩니다!

 

ready() 메소드는 처음 시작할 때 딱 한 번 실행해 줍니다.

window_size 도 한 번만 구하면 되겠죠? 그래서 여기서 사이즈를 가져와줍니닷.

 

process() 메소든 계속 실행해 주는데요. 지금은 비워 두겠습니다!

 

밑에 새로운 메소드 _on_timer_timeout() 이 만들어졌는데요!

이것은 아까 제가 Signals 부분에서 만들어주고 왔습니다!

 

이 메소드 안의 코드는 첫 줄에서 돌의 씬을 불러만 옵니다!

그래서 두 번째 줄에서 객체를 생성해 주는 것이구요!!!

마지막 줄에서 이러한 돌을 자신의 자식으로, 즉, RockSpawner 의 자식으로 추가합니다!

그리고 돌의 위치를 랜덤으로 떨어뜨리기 위해 range 로 범위를 지정해 줬구요!
위치를 랜덤으로 조정해주는 것이기 때문에 .position 을 꼭 붙여 위치를 정해주었습니다!

이제 Game 씬에 RockSpawner 를 끌어당기면 돌이 메인 화면에 나오게 됩니다.


자고로.... 게임은 캐릭터가 돌에 맞으면 죽어야 하잖아요?! 그래서 player 의 스크립트에 가서

func _on_hit_area_entered(area):
	if area.is_in_group("rock"):
		area.get_parent().queue_free()
		queue_free()

 

이렇게 추가해주면 되지만.. 저희는 나중에 3번을 맞아야 죽게 할 것이므로!

코드를 조금 수정해 주어야 합니다.

func on_dead()
	queue_free()

func hit():
	on_dead()

func _on_hit_area_entered(area):
	if area.is_in_group("rock"):
		area.get_parent().queue_free()
		hit()

 

바로 이렇게 수정해주면 되는데요!

hit() 과 on_dead() 는 제가 만든 함수입니당.

그래서 만약 돌에 맞으면 hit 을 호출해! 라는 의미구요

hit 을 호출하면 on_dead 를 호출하라는 것입니당.

나중에 더 코드를 추가해서 생명이 완전히 사라져야 on_dead 로 넘어가게 할 것입니당.

 

그리고 배경을 끌어당겨서 배경도 추가해 주었어요!!!!!!!!!!!!!!

이렇게 오늘까지 해서 진짜... 그래~ 이 정도면 게임이라곤 할 수 있겠네.... 정도의 게임을 만들었어욬ㅋㅋㅋㅋㅋ

앞으로는 생명이나, 한 번 맞았을 때 몇 초 무적 처리, 움직일 때 부스터 모션 등도 구현하겠습니당.

모두 글 읽어주셔서 감사합니당. 😊

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

godot 9차시  (0) 2024.10.23
godot 8차시  (1) 2024.10.20
godot 6차시  (3) 2024.09.26
godot 5차시  (4) 2024.09.13
godot 4차시  (5) 2024.09.05