우선 저희가 만든 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 로 넘어가게 할 것입니당.
그리고 배경을 끌어당겨서 배경도 추가해 주었어요!!!!!!!!!!!!!!
이렇게 오늘까지 해서 진짜... 그래~ 이 정도면 게임이라곤 할 수 있겠네.... 정도의 게임을 만들었어욬ㅋㅋㅋㅋㅋ
앞으로는 생명이나, 한 번 맞았을 때 몇 초 무적 처리, 움직일 때 부스터 모션 등도 구현하겠습니당.
모두 글 읽어주셔서 감사합니당. 😊