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)
'Godot' 카테고리의 다른 글
[GodotDocs][Your First 2D Game] 8. HUD 씬 제작 (2) | 2024.03.17 |
---|---|
[GodotDocs][Your First 2D Game] 7. 게임 씬 코딩(C#) (0) | 2024.03.10 |
[GodotDocs][Your First 2D Game] 6. 게임 씬 제작 (2) | 2024.02.29 |
[GodotDocs][Your First 2D Game] 5. 적(Mob) 코딩(GDScript, C#) (0) | 2024.02.18 |
[GodotDocs][Your First 2D Game] 4. 적(Mob) 제작 (0) | 2024.02.16 |