레쭈고 godot

godot 14차시

정땅미 2024. 11. 26. 03:24

이 날에도 어김 없이 코드를 작성해 주엇어여~

11/21

extends Node2D

# 현재 플레이어가 서 있는 계단 위치
var current_stair_idx = -1
var prev_stair_direction
var staircase_instance

# 게임 화면 구성
func _ready():
	# 계단 인스턴스 추가
	var staircase_scene = preload("res://scenes/staircase.tscn")
	staircase_instance = staircase_scene.instantiate()
	# 주어진 크기만큼의 랜덤한 계단 방향 생성
	var random_staircase_directions = Staircase.generate_random_directions(20)
	# 계단 방향 설정 후 Game 씬에 추가
	staircase_instance.set_staircase_directions(random_staircase_directions)
	add_child(staircase_instance)
	
	# 플레이어 중앙 하단에 위치하도록 위치 조정
	# (window 객체의 정보를 얻어오는 것이 좋지만 여기서는 그냥 하드코딩)
	$Player.position.x = 270
	$Player.position.y = 960
	
	# 첫 번째 계단의 방향에 따라 플레이어가 바라보는 방향도 바꿔주기
	var first_stair_direction = staircase_instance.get_stair_direction_at(0)
	if first_stair_direction == "left": $Player.turn_left()
	else: $Player.turn_right()
	
	# 처음에는 이전에 밟은 계단 방향 정보가 없으므로 시작 방향과 동일하게 설정
	prev_stair_direction = first_stair_direction

# 한 계단을 오를 때마다 매번 호출할 메서드 (up 혹은 turn)
func step_up_stairs(input):
	# 계단 인덱스 1 증가
	current_stair_idx += 1
	
	# 다음 계단 위치, 인스턴스 정보 가져오기
	var stair_direction = staircase_instance.get_stair_direction_at(current_stair_idx)
	var stair_instance = staircase_instance.get_stair_at(current_stair_idx)
	
	# 성공한 입력인지 판단할 변수
	var correct_input = false
	
	# up 입력을 한 경우, 이전 계단과 이후 계단의 방향이 "같아야" 정확한 입력으로 처리
	if input == "up": correct_input = stair_direction == prev_stair_direction
	# turn 입력을 한 경우, 이전 계단과 이후 계단의 방향이 "달라야" 정확한 입력으로 처리
	if input == "turn": correct_input = stair_direction != prev_stair_direction
	print(correct_input)
	
	if correct_input:
		# 다음 계단 방향과 플레이어 방향 맞추기	
		if stair_direction == "left": $Player.turn_left()
		if stair_direction == "right": $Player.turn_right()
		# 다음 계단 위로 플레이어가 올라올 수 있도록, 계단의 위치를 참조하여 플레이어 위치 조정
		$Player.position.x = stair_instance.position.x
		# 계단 스프라이트 높이만큼 올려주기
		$Player.position.y = stair_instance.position.y - 40
		# 이전 계단의 방향 기록
		prev_stair_direction = stair_direction
	else:
		# 일단 올라가지 못하도록 처리 (이후 여기서 게입 오버 처리 작업을 진행)
		print("게임 오버!")
		current_stair_idx -= 1

func _process(delta):
	if Input.is_action_just_pressed("up"):
		step_up_stairs("up")
	if Input.is_action_just_pressed("turn"):
		step_up_stairs("turn")

 

우선 현재 플레이어가 서 있는 계단의 위치를 구해 주기 위해 변수를 설정하구요.

게임 화면을 구성할 때 계단 인스턴스를 추가하며, 주어진 크기만큼 계단 방향을 랜덤하게 하여 계단을 생성해 줬어요!

계단 방향을 설정하면 Game 씬에 이것을 추가합니다.

플레이어는 당연히 중앙 하단에 위치해야 하기 때문에 View port 를 잘 조절해 주시면 됩니닷.

계단을 오를 때 캐릭터가 보는 방향도 달라져야 디테일이 살잖아유~?

그런 것두 놓치지 않고 표시해 줬습니닷.

 

하나의 계단을 오를 때마다 계단 인덱스가 1 증가하고 다음 계단의 위치를 가져옵니다.

맞게 버튼을 눌렀는지 확인하는 로직을 작성해 줍니다.

다음 계단 위로 올라가기 위해 계단의 위치를 참조하여 플레이어의 위치도 조정해 줍니닷.

만약 옳은 키를 눌렀다면 캐릭터를 스프라이트 높이만큼 올려주었어요!

올바르지 않은 키를 누르면 우선 지금은 Game Over 를 출력하게 하였답니닷.

 

'레쭈고 godot' 카테고리의 다른 글

godot 13차시  (0) 2024.11.26
godot 12차시  (0) 2024.11.19
godot 11차시  (3) 2024.11.10
godot 10차시  (3) 2024.10.31
godot 9차시  (0) 2024.10.23