Menu
CoddyTech

바위 쪼개기

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는 안전한 시점인 프레임 끝에 호출을 실행합니다.

지금은 모든 바위가 갈라지므로 바위가 바닥나지 않습니다. 크기는 다음에 다룹니다.

challenge icon

챌린지

어려움

바위를 쏘면 두 조각으로 갈라지게 만드세요.

  1. rock.gd에 signal broken(rock)을 추가하고, 총알이 맞으면 queue_free() 전에 broken.emit(self)을 호출하세요.
  2. main.gd에서 spawn_rock 안에 각 바위의 broken을 _on_rock_broken에 연결하세요.
  3. _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)

프로젝트의 모든 레슨

직접 연습해 보세요: Godot 플레이그라운드