바위 쪼개기
Coddy Godot 여정의 프로젝트 섹션에 포함된 레슨. 36개 중 18번째.
총알에 맞은 바위는 두 개로 갈라져야 합니다. 바위는 signal broken(rock)과 broken.emit(self)로 자신이 부서졌음을 알립니다. self는 바위이므로, 신호를 받는 쪽은 바위가 어디에 있었고 어떻게 움직였는지 알 수 있습니다.
spawn_rock은 새 바위마다 rock.broken.connect(_on_rock_broken)을 연결하고, 해당 함수는 서로 다른 방향으로 회전한 바위 두 개를 생성합니다:
func _on_rock_broken(rock):
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(0.8) * 1.5)
spawn_rock.call_deferred(rock.position, rock.velocity.rotated(-0.8) * 1.5)Godot가 어떤 영역들이 서로 닿는지 확인하는 동안 신호가 도착합니다. 이때 영역을 추가하면 쿼리를 처리하는 동안에는 이 상태를 변경할 수 없습니다라는 메시지와 함께 게임이 멈춥니다. call_deferred는 안전한 시점인 프레임 끝에 호출을 실행합니다.
지금은 모든 바위가 갈라지므로 바위가 바닥나지 않습니다. 크기는 다음에 다룹니다.
챌린지
어려움바위를 쏘면 두 조각으로 갈라지게 만드세요.
rock.gd에signal broken(rock)을 추가하고, 총알이 맞으면queue_free()전에broken.emit(self)을 호출하세요.main.gd에서spawn_rock안에 각 바위의broken을_on_rock_broken에 연결하세요._on_rock_broken(rock)에서call_deferred를 사용해 아래와 같이 바위 두 개를 생성하세요.
‘플레이’를 누르고 바위를 쏘세요. 바위 두 개가 서로 다른 방향으로 날아갑니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
extends Node2D
const ROCK = preload("res://rock.tscn")
func _ready():
for i in 4:
spawn_rock(Vector2(randf_range(0, 640), 0), Vector2(randf_range(-90, 90), randf_range(40, 90)))
func spawn_rock(where, velocity):
var rock = ROCK.instantiate()
rock.position = where
rock.velocity = velocity
add_child(rock)
프로젝트의 모든 레슨
2프로젝트: 소행성 슈팅 게임
우주선 회전하기엔진 가동하기직접 연습해 보세요: Godot 플레이그라운드