본문 바로가기
Programming/Godot

Godot 시작하기#3 - Main Scene

by Wilkyway 2021. 12. 22.
반응형

1. Main Scene 생성

모든 요소들을 모을 Main Scene 을 생성합니다. 새 씬 생성후 "Node"라는 이름의 노드를 추가해줍니다.

그리고 "인스턴스화"아이콘을 클릭하여 Player.tscn을 불러옵니다.

그 외에는 자식노드 추가 기능에서 Timer 3개, Position2D 노드를 추가해주고, 각각의 이름을 아래와 같이 수정해줍니다.


MobTimer - 가장자리에서 Mob이 생성되는 시간 통제 (0.5초)
ScoreTimer - 매초마다 점수 증가시킴 (1.0초)
StartTimer - 시작하기 전에 지연 시간 부여 (2.0초)
StartPosition - Player의 시작 위치(240, 450)

2. Mob 생성

Main 노드가 Mob을 가장자리를 따라 랜덤한 위치에서 생성합니다. 이를 위해서는 Main 노드 하위에 Path2D 노드를 추가해줍니다. Path2D노드를 선택하면 아래와 같은 화면으로 변경되는데, 그 전에 "스마트 스냅 사용", "격자 스냅 사용" 을 클릭합니다. 그리고, 새로 생긴 Path관련 버튼 중 가운데 버튼(1: 점추가)을 누른다음 화면의 네 꼭지점을 시계방향(2~5)으로 클릭해줍니다. 마지막으로 마지막 버튼(6: 곡선닫기)을 클릭해주면 경로가 완성됩니다.


다음으로 PathFollow2D 노드를 Path2D노드 하위에 추가해줍니다. 이 노드는 Path를 따라서 어떤 작업을 해줍니다. 이 게임에서는 Mob 생성이겠죠?

그리고 각각의 이름을 MobPath, MobSpawnLocation으로 바꿔줍니다.

 


3. Main.gd 스크립팅

우선 아래의 코드로 시작하겠습니다.

extends Node

export (PackedScene) var Mob
var score

func _ready():
	randomize()

export (PackedScene) var Mob 구문으로 선언하면, 인스펙터 창에서 Mob이라는 속성이 나타나는 것을 확인할 수 있습니다. 여기에는 Scene을 넣어줄 수 있는데, 우리가 구성한 Mob.tscn을 넣어줍니다.(드래그 앤 드랍)

 

다음으로 Player가 Mob과 부딛혔을 때(hit signal) 게임오버를 나타내는 함수를 작성/연결하겠습니다. 조금 헷갈릴 수도 있는데요, Main Scene 하위에 있는 Player Scene을 선택(한번 클릭)하면, 우측의 "노드" 창에 시그널들이 나타납니다. 우리가 만든 hit 시그널도 보입니다. hit()시그널을 더블클릭하면 메서드 연결창이 나타납니다. 작성할 스크립트가 Main인 것을 확인하고, 받는 메서드의 이름을 game_over로 하여 "연결"을 클릭합니다.


추가되어야 하는 코드는 아래와 같습니다. new_game() 함수도 함께 작성합니다.

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

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


다음으로 각 타이머와 연결된 함수를 만들겠습니다. 우선 StartTimer, ScoreTimer의 timeout() 시그널을 더블 클릭합니다.

각각의 함수는 아래와 같이 코딩합니다.

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

func _on_ScoreTimer_timeout():
    score += 1

_on_StartTimer_timeout()함수에서는 MobTimer와 ScoreTimer가 시작되며,

_on_ScoreTimer_timeout()함수에서는 시간이 흐름에 따라 1점식 올라가게 될 것입니다.

 

MobTimer의 timeout()시그널을 더블클릭하여 연결함수를 생성합니다. _on_MobTimer_timeout()에서는 mob을(mob 인스턴스를) 생성할 것입니다.

func _on_MobTimer_timeout():
	# Choose a random location on Path2D.
    $MobPath/MobSpawnLocation.offset = randi()
    # Create a Mob instance and add it to the scene.
    var mob = Mob.instance()
    add_child(mob)
    # Set the mob's direction perpendicular to the path direction.
    var direction = $MobPath/MobSpawnLocation.rotation + PI / 2
    # Set the mob's position to a random location.
    mob.position = $MobPath/MobSpawnLocation.position
    # Add some randomness to the direction.
    direction += rand_range(-PI / 4, PI / 4)
    mob.rotation = direction
    # Set the velocity (speed & direction).
    mob.linear_velocity = Vector2(rand_range(mob.min_speed, mob.max_speed), 0)
    mob.linear_velocity = mob.linear_velocity.rotated(direction)

4. 테스트

func _ready():
    randomize()
    new_game()


플레이어 이동, 몹 생성, 충돌시 사라지기가 정상 작동되면 다음 HUD 구성을 위해 new_game()부분은 제거해줍니다.

 

- Main Scene 끝 -

반응형

댓글