본문 바로가기
Godot

[GodotDocs][Your First 2D Game] 10. 마무리 작업(GDScript)

by 채식금지 2024. 4. 7.
728x90

본 게시글은 고도엔진 공식문서에 작성된 Your first 2D game를 정리하였습니다.

 

플레이어 숨김

  • 게임을 처음 실행할 때 플레이어가 화면에 출력되지 않도록 수정한다.
  • res://main.gd 파일을 열어 _ready 함수를 아래와 같이 수정한다.
func _ready():
    $Player.hide()

 

게임 오버 후 적 제거

  • 게임이 끝난 후에도 남아있는 적들이 있고, 이 상태에서 게임을 바로 재시작하면 남아 있던 적들도 함께 피해야 되는 문제점이 발생한다.
  • 게임을 재시작했을 때 화면에 적이 없는 상태에서 시작되도록 게임을 수정할 것이다.

 

  • res://Mob.tscn 파일을 열어 Mob 노드를 선택한다.
  • 오른쪽 화면에 있는 Node 도크를 선택한다.
  • Node 도크에서 Groups 탭을 선택한 후 Manage Groups 버튼 바로 아래 있는 텍스트 입력창에 mobs를 입력한다.

 

  • 텍스트 입력창에 mobs를 입력한 후 오른쪽에 있는 Add 버튼을 누르면 mobs 그룹이 새로 추가된다.

 

  • 고도엔진에서 그룹은 유니티의 태그와 유사한 역할을 한다.
  • res://Mob.tscn 파일을 저장한다.

 

  • res://main.gd 파일을 연다.
  • new_game 함수에 아래 내용을 추가한다.
get_tree().call_group("mobs", "queue_free")
  • 새로 추가한 코드는 게임에서 mobs 그룹이 설정된 노드를 찾아 queue_free 함수를 호출한다.
  • 게임을 시작할 때마다 mobs 그룹을 추가한 적들을 화면에서 사라지게 된다.

 

  • res://main.gd 파일을 저장한다.

 

배경 수정

  • res://Main.tscn 파일을 연다.
  • ColorRect 노드를 Main 노드의 자식으로 새로 추가한다.

 

  • ColorRect 노드를 가장 위로 올려 다른 노드들이 ColorRect 노드에 가려지지 않도록 만든다.

 

  • ColorRect 노드를 선택한다.
  • 뷰포트 상단에 새로 추가된 Anchor preset 툴바를 선택한다.
  • Full Rect를 선택하여 ColorRect 노드의 위치와 크기가 게임화면에 맞춰지도록 설정한다.

 

  • Inspector 도크에서 Color를 원하는 색으로 수정한다.

 

  • res://Main.tscn 파일을 저장한다.

 

소리 효과

  • res://Main.tscn 파일을 연다.
  • AudioStreamPlayer2D 노드를 Main 노드의 자식으로 추가한 후 Music으로 이름을 수정한다.
  • AudioStreamPlayer2D 노드를 Main 노드의 자식으로 추가한 후 DeathSound로 이름을 수정한다.

 

  • Music 노드를 선택한다.
  • Inspector 도크에 있는 Stream 속성에 res://art/House In a Forest Loop.ogg 파일을 드래그한다.
  • Stream 속성에 연결된 파일을 클릭하여 AudioStreamOggVoribs 속성이 나오도록 만든다.
  • Stream 속성에 연결된 파일을 우클릭하여 메뉴가 나오도록 만든다.(FileSystem 도크에서 우클릭하면 안 된다.)
  • 메뉴에서 Make Unique를 선택하여 AudioStreamOggVoribs 속성도 설정할 수 있도록 만들어 준다.

 

  • Loop 속성을 체크하여 자동반복재생할 수 있도록 만들어준다.

 

  • DeathSound 노드를 선택한다.
  • Inspector 도크에 있는 Stream 속성에 res://art/gameover.wav 파일을 드래그한다.
  • res://main.gd 파일을 연다.
  • new_game 함수에 아래 내용을 추가한다.
  • 게임을 시작할 때 배경음을 재생한다.
$Music.play()

 

  • game_over 함수에 아래 내용을 추가한다.
  • 게임이 끝날 때 배경음을 멈추고, 사망 효과음을 재생한다.
$Music.stop()
$DeathSound.play()

 

  • res://main.gd, res://Main.tscn 파일을 저장한다.

 

키보드 숏컷

  • Enter 키를 눌러 게임을 시작할 수 있도록 수정할 것이다.

 

  • 상단 메뉴에서 Project>Project Settings... 를 선택한다.
  • Project Settings 팝업창 상단의 Input Map 탭을 선택한다.
  • Add New Action 필드에 start_game 을 입력한 후 Add 버튼을 클릭한다.

 

  • start_game이 추가되면 Deadzon에 있는 ➕아이콘을 클릭한다.
  • Listening for input... 필드가 활성화된 상태에서 키보드 Enter 키를 누르면 자동으로 Enter 키가 선택된다.
  • Enter 키가 선택되면 OK 버튼을 눌러 Event Configuration 팝업창을 닫는다.

 

  • res://HUD.tscn 파일을 연다.
  • StartButton 노드를 선택한다.
  • Inspector 도크에서 Shortcut 속성을 찾아 Shortcut 리소스를 새로 추가한다.

 

  • Inspector 도크에서 추가된 Shortcut 리소스를 클릭하여하여 Shortcut 속성이 나오도록 만든다.
  • Events 속성의 Array[InputEvent] (size 0) 을 클릭하여 Events 속성이 나오도록 만든다.
  • Add Element 버튼을 클릭하여 새로운 이벤트를 추가한다.
  • 새로 추가된 이벤트에 InputEventAction 리소스를 추가한다.

 

  • Inspector 도크에서 추가된 InputEventAction 리소스를 클릭하여하여 InputEventAction 속성이 나오도록 만든다.
  • Action 속성에 start_game을 입력한다.

 

  • res://HUD.tscn 파일을 저장한다.
  • 이제 StartButton이 화면에 출력되고 있을 때 Enter 키를 눌러 게임을 시작할 수 있다.

 

완성된 스크립트

extends Node

@export var mob_scene: PackedScene
var score

func _ready():
    $Player.hide()

func game_over():
    $ScoreTimer.stop()
    $MobTimer.stop()
    $HUD.show_game_over()
    $Music.stop()
    $DeathSound.play()

func new_game():
    score = 0
    $Player.start($StartPosition.position)
    get_tree().call_group("mobs", "queue_free")
    $StartTimer.start()
    $HUD.update_score(score)
    $HUD.show_message("Get Ready")
    $Music.play()

func _on_start_timer_timeout():
    $ScoreTimer.start()
    $MobTimer.start()

func _on_score_timer_timeout():
    score += 1
    $HUD.update_score(score)

func _on_mob_timer_timeout():
    var mob = mob_scene.instantiate()

    var spawn_location = $MobPath/MobSpawnLocation
    spawn_location.progress_ratio = randf()

    var direction = spawn_location.rotation + PI / 2
    direction += randf_range(-PI / 4, PI / 4)

    mob.position = spawn_location.position
    mob.rotation = direction

    var velocity = Vector2(randf_range(150.0, 250.0), 0.0)
    mob.linear_velocity = velocity.rotated(direction)

    add_child(mob)

 

게임 영상

 

godotdocs-1st2dgame-10-16.mp4
6.47MB