본문 바로가기
Programming/Godot

Godot 시작하기#4 - HUD Scene 및 마무리

by Wilkyway 2021. 12. 22.


1. HUD Scene 추가

HUD는 Head Up Display의 약자인데 게임의 요소와는 상관없는 UI 작성을 위한 부분입니다. Scene을 하나 추가한 뒤 CanvasLayer노드를 추가합니다. HUD에서 표시할 내용으로는 Score, "Game Over" 또는 "Get Ready!" 같은 문구, "Start" 버튼입니다. 즉 레이블과 버튼 요소가 필요합니다. 아래의 노드들을 CanvasLayer노드 하위에 자식노드로 추가해줍니다.

 

  • ScoreLabel (Label)
  • Message (Label)
  • StartButton (Button)
  • MessageTimer (Timer)

2. 폰트

폰트를 추가합니다. 경로는 인스펙터 창에서 Control > Theme Overrides > Fonts > 새 DynamicFont를 선택하고, 한번 더 클릭하여 Font > Font Data부분에 dodge_assets > font에 있는 "Xolonium-Regular.ttf"폰트를 넣어줍니다.(드래그 앤 드랍)

Font > Settings > Size는 64로 설정합니다.

 

font >Dyna....의 아래쪽 화살표를 누르면 여러 메뉴가 나오고, "복사" 메뉴가 나옵니다. 이걸 누르면 복사가 가능한데, 만들어두었던 Message 라벨로 가서 동일한 위치에서 "붙여넣기"를 해주면 지금 했던 설정을 복사해 넣게됩니다.




3. 레이아웃

우선 ScoreLabel을 설정해보겠습니다. 상단 오른쪽에 나타나는 레이아웃을 선택하고 '위쪽 넓게'를 클릭합니다. 그리고 인스펙터 창에서는 Text: 0, Align: Center, Valign: Center로 설정해줍니다.

다음으로 Message 라벨을 수정해줍니다.

그리고 StartButton은 "Start"라고 텍스트를 입력하고, 레이아웃은 "아래쪽 중앙", Font도 복하를 해줍니다.

그리고나서  Margin속성에 Top: -200, Button: -100을 입력합니다.


MessageTimer노드에서 Wait Time을 2초로 설정해주고, One Shot속성을 "On"으로 합니다.

 

4. HUD.gd 스크립팅

start_game 시그널은 버튼이 눌렸을 때 Main노드에게 알려주는 시그널로 쓰일 예정입니다.

extends CanvasLayer

signal start_game


전달되는 메시지를 표시하기위한 함수를 작성합니다.

func show_message(text):
    $Message.text = text
    $Message.show()
    $MessageTimer.start()


Player가 충돌하여 죽었을 때 텍스트를 보여주는 함수를 아래와 같이 작성합니다.

func show_game_over():
    show_message("Game Over")
    # Wait until the MessageTimer has counted down.
    yield($MessageTimer, "timeout")

    $Message.text = "Dodge the\nCreeps!"
    $Message.show()
    # Make a one-shot timer and wait for it to finish.
    yield(get_tree().create_timer(1), "timeout")
    $StartButton.show()


그리고 시간이 변할때마다 Main 씬에의해 아래의 코드가 지속적으로 호출되어 점수(시간)을 증가시킵니다.

func update_score(score):
    $ScoreLabel.text = str(score)


그리고 MessageTimer의 timeout()시그널과, StartButton버튼의 pressed()시그널에 함수를 연결하겠습니다. 함수는 아래와 같이 작성해줍니다.

func _on_StartButton_pressed():
    $StartButton.hide()
    emit_signal("start_game")

func _on_MessageTimer_timeout():
    $Message.hide()


5. HUD를 Main에 연결

Main 씬에서 HUD를 불러와 연결하도록 하겠습니다.

Main 씬에서 HUD 씬(노드)를 선택하고, 노드탭으로 가면 연결할 수 있는 HUD의 시그널들이 나타납니다. 여기서 start_game시그널을 연결할 함수로 new_game()이라고 이름짓고 아래의 코드를 추가해줍니다.

$HUD.update_score(score)
$HUD.show_message("Get Ready")


game_over() 함수가 실행될 때 HUD에 표시되는 메시지를 실행하도록 아래 라인을 추가해줍니다.

$HUD.show_game_over()


_on_ScoreTimer_timeout() 함수에 아래 코드를 추가하여 점수 변경시 업데이트되도록 합니다.

$HUD.update_score(score)



6. 오래된 크리프 제거

아직은 Player가 죽고나서 다시 시작할 때 Mob들이 살아있습니다. 그래서 시작버튼을 누르면 전부 사라지도록 수정할 필요가 있습니다.

 

Mob 씬에서 루트노드를 선택하고 노드탭 > Groups탭 으로 갑니다. 그리고 이름을 "mobs"라고하여 Add버튼을 눌러 Mob들의 그룹을 지정합니다. 그리고는 game_over()함수에 아래의 코드를 추가합니다. 해당 그룹에 있는 객체들을 한번에 제거하는 명령입니다.

get_tree().call_group("mobs", "queue_free")

7. 마무리

Background

Main노드 최상단 자식노드로 ColorRect 노드를 추가한다. "Layout" -> "Full Rect" 으로 전체 화면 커버가 가능하다.TextureRect노드를 사용하면 이미지를 불러올 수도 있다.

Sound effects

Main신의 하위로 AudioStreamPlayer노드를 추가하고 이름을 Music이라고 변경합니다. 하나더 추가하여 DeathSound라고 이름을 변경합니다. Stream속성의 Load를 클릭하여 해당되는 오디오 파일을 지정해줍니다.
 
new_game()함수 아래 아래 코드를 추가합니다.
$Music.play()

game_over() 함수 아래 아래코드를 추가합니다.

$Music.stop()
$DeathSound.play()

Keyboard shortcut

HUD씬에서 StartButton을 클릭하고 Shortcut속성을 찾아서 "New Shortcut" > "Shortcut"을 클릭하면 두번째 속성이 나타납니다. "New InputEventAction">"InputEventAction"을 입력하면 Action속성이 나타나는데, ui_select라고 타이핑 입력합니다. 이게 스페이스바와 연동되는 지시어라고 합니다.

 

- 끝 -

 
반응형

태그

, ,

댓글0