티스토리 뷰

728x90

"리듬 게임 분석하기" 글에 이어서 여러 가지 기술적 요소를 살펴보고 있다. 

 

■ 씬 인스턴스 활용

다양한 게임 요소들은 동적인 요소와 정적인 요소로 나눌 수 있는데 음악의 비트에 따라 터치 또는 드래그하도록 숫자와 원으로 표시하는 씬이나 터치한 곳에 점수를 표시하는 씬은 게임 진행에 따라 위치와 내용, 개수가 동적인 요소이다. 반면에 배경 이미지나 게임 진행 중 화면 상단에 표시하는 점수는 게임 제작 시점에 정해진 위치와 개수대로 유지하는 정적인 요소라 할 수 있다. 동적인 요소든 정적인 요소든 동일한 씬을 위치와 모양을 바꾸어 가며 재사용하는 것이 씬의 인스턴스 활용이다.

 

1. 동적 예제1

extends Node2D

export var sprite_fx: PackedScene


func _ready() -> void:
	Events.connect("scored", self, "_create_score_fx")


func _create_score_fx(msg: Dictionary) -> void:
	var new_sprite_fx := sprite_fx.instance()

	add_child(new_sprite_fx)
	new_sprite_fx.setup(msg.position, msg.score)

위의 코드는 리듬 게임 메인 씬의 RhythmGameDemo.gd 스크립트 내용이다.

 

점수 처리 시그널("scored")이 씬에 도착하면 개별 항목에 위의 그림처럼 Miss, Great, Ok, Perfect 등의 점수를 표시하는 기능을 수행한다.

 

코드를 보면 sprite_fx 변수를 PackedScene 타입으로 선언하고 export로 지정했다. 이렇게 지정하면 위의 그림처럼 편집기에서 sprite_fx에 적용할 씬을 지정할 수 있으며 게임에서는 VFXScore.tscn을 선택했다. 코드 내부에서는 어떤 씬이 적용될지 모르겠지만 개발자가 지정한 씬으로 위치와 점수를 보내는 역할만 하는 것이다. 코드의 내용은 점수 처리 시그널이 오면 편집기에서 지정한 씬을 instance() 함수로 인스턴스화하고 add_child()로 현재 씬에  새로운 자식 노드로 추가 한다. 그리고, 인스턴스 씬의 setup() 함수를 호출한 것처럼 필요한 조치를 취해준 것이다. 만약 사용자 나름의 점수 처리 씬을 작성했다면 편집기에서 sprite_fx 변수에 사용가 작성한 씬으로 VFXScore.tscn를 대체하면 된다.

 

2. 동적 예제 2

func _spawn_beat(msg: Dictionary) -> void:
	if not enabled:
		return

	if _stack_current.empty():
		enabled = false
		Events.emit_signal("track_finished", {})
		return

	var hit_beat_data: Dictionary = _stack_current.pop_front()

	if not hit_beat_data.has("global_position"):
		return

	hit_beat_data.bps = msg.bps

	var new_beat: Node = hit_beat_data.scene.instance()
	add_child(new_beat)

	new_beat.setup(hit_beat_data)

위의 코드는 비트에 따라 터치 또는 드래그해야 하는 개별 게임 요소를 추가하는 스크립트이다.

 

앞서 점수를 표시하는 것과 마찬가지로 instance() 함수로 인스턴스화하고 add_child()로 노드를 추가하고 setup()으로 나머지 필요한 조치를 지시하는 작업을 수행하고 있다. 차이점이라면 점수 표시 인스턴스로는 위치와 점수가 넘어갔고, 여기에서는 비트 정보가 전달된 차이점이 있다.

 

3. 동적 예제 3

func _generate_tiles() -> void:
	var separation_current := 0.0

	for i in tracks.size():
		var track_data: TrackData = tracks[i]
		var track_tile: TrackTile = track_tile_scene.instance()

		track_tile.track_data = track_data
		_track_tiles.append(track_tile)

		track_tile.position = Vector2(separation_current, 0)
		separation_current += separation
		add_child(track_tile)

	_min_x_position = -(separation * (_track_tiles.size() - 1))

위의 코드는 첫 화면에서 드래그로 플레이할 트랙을 선택할 수 있도록 개별 트랙 정보를 준비하는 과정이다.

 

설정한 트랙 정보에 따라 표시할 트랙의 개수도 달라지므로 당연히 instance() 함수로 인스턴스화하고 add_child()로 노드를 추가하는 과정이 필요하다. 다만, 앞서 언급한 두 가지와 다른 점은 비트에 따른 게임 요소도 점수를 표시하는 것도 이벤트에 따라 즉시 수행하는 과정이 필요했지만 여기에서는 씬의 위치 정보와 같은 기본 정보만 설정하고 씬 준비 작업까지만 진행했다. 나머지는 사용자의 드래그 동작에 따라 반응할 것이므로......

 

4. 정적인 노드의 씬 인스턴스화

지금까지는 고도 스크립트에서 씬의 인스턴스화 과정과 사례들을 살펴보았지만 정적인 노드 유형인 경우는 위의 그림처럼 편집기에서 씬 인스턴스화를 적용하면 된다. 인스턴스의 원본 씬을 확인하거나 수정하려면 위의 그림처럼 노드 우측의 "에디터에서 열기" 아이콘을 클릭한다.

 

제작해 놓은 씬을 자식 노드로 인스턴스화하는 방법은 씬 트리에서 추가하려는 노드를 우측 마우스로 클릭하여 "자식 씬 인스턴스화" 메뉴를 선택하거나 Ctrl+Shift+A 단축키를 누르고 위의 그림처럼 인스턴스화할 씬을 선택하면 된다.

 

 

728x90
댓글
글 보관함
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31