본문 바로가기
Godot

[GodotDocs][Your First 2D Game] 7. 게임 씬 코딩(GDScript)

by 채식금지 2024. 3. 3.
728x90

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

 

스크립트 추가

  • res://Main.tscn 파일을 열어 Main 노드를 선택한다.
  • Attach Script... 를 선택하여 res://main.gd 스크립트를 추가한다.

 

스크립트 코딩

  • res://main.gd 파일을 열어 아래와 같이 변수를 추가한다.
extends Node

@export var mob_scene: PackedScene
var score
  • 스크립트를 저장하면 @export로 선언한 mob_scene 변수 Main 노드에 Mob Scene 속성으로 추가된다.
  • Main 노드에 추가된 Mob Scene 속성과 res://Mob.tscn 씬을 연결한다.

 

  • 게임을 시작할 때 호출할 new_game() 함수와 게임이 끝날 때 호출할 game_over() 함수를 추가한다.
func game_over():
    $ScoreTimer.stop()
    $MobTimer.stop()

func new_game():
    score = 0
    $Player.start($StartPosition.position)
    $StartTimer.start()
  • game_over() 함수가 호출되면 ScoreTimer 노드와 MobTimer 노드를 정지시킨다.
  • new_game() 함수가 호출되면 점수와 플레이어의 위치가 초기화되고, StartTimer 노드를 작동시킨다.

 

  • StartTimer, ScoreTimer, MobTimer 노드의 timeout 시그널을 Main 노드와 연결한다.

 

  • 각각의 시그널과 연결된 함수에 아래 내용을 추가한다.
func _on_start_timer_timeout():
    $ScoreTimer.start()
    $MobTimer.start()

func _on_score_timer_timeout():
    score += 1

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)
  • StartTimer 노드의 timeout 시그널이 발생하면 ScoreTimer, MobTimer 노드를 작동시킨다.
  • ScoreTimer 노드의 timeout 시그널이 발생할 때마다 1점씩 점수가 증가한다.
  • MobTimer 노드의 timeout 시그널이 발생할 때마다 적(Mob)이 생성된다.
  • 생성된 적은 렌덤한 위치에 렌덤한 방향과 속도로 이동한다.

 

  • _ready() 함수가 안에 new_game() 함수를 추가한다.
func _ready():
    new_game()

 

플레이어 씬 추가

  • res://Player.tscn 씬을 Main 노드의 자식으로 추가한다.

 

  • Player 노드의 hit 시그널을 res://main.gd 스크립트에 추가했던 game_over 함수와 연결한다.
  • game_over 함수는 이미 추가되어 있기 때문에 시그널과 연결해도 함수가 자동으로 추가되지 않는다.

 

게임 씬 테스트

  • 오른쪽 상단의 Run Project를 클릭하여 main.tscn 씬을 메인 씬으로 설정하는 동시에 게임이 실행되도록 만든다.

 

완성된 스크립트

extends Node

@export var mob_scene: PackedScene
var score

func _ready():
    new_game()

func game_over():
    $ScoreTimer.stop()
    $MobTimer.stop()

func new_game():
    score = 0
    $Player.start($StartPosition.position)
    $StartTimer.start()

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

func _on_score_timer_timeout():
    score += 1

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)