이전글


안녕, 나 고도 뉴비.

이번에는 retry 기능을 넣고, Game Over! 표시를 해봤어. 캐릭터 감지랑, 카메라 설정도.


7cf3c028e2f206a26d81f6e443877664


리트라이 R키

왼쪽 위에 프로젝트 - 프로젝트 설정 - 입력 맵에 R 추가

7ff3c028e2f206a26d81f6ec4585736e


최상위 노드(Game)에 딸린 스크립트 파일에 R키 눌리면 씬 다시 부르는 코드 추가

func _process(delta)
if Input.is_action_pressed("retry")
get_tree().reload_current_scene()
 
cs

죽음 감지

7ef3c028e2f206a26d81f6e14181756d


Enemy_1 밑에 스프라이트 넣고, 콜리전 넣고 모양 잡고.


Enemy_1 노드에 스크립트 달고 시그널 Player_dead 추가. 

무당벌레 영역 안에 캐릭터 바디가 들어오면 얘 죽었다고 방송하라는 뜻이야.


signal Player_dead
func _on_body_entered(body):
Player_dead.emit()
 
cs

화면 오른쪽에 인스펙터 옆에 노드 있거든. 노드 - 시그널 누르고, 왼쪽 트리에서 방금 만든 Enemy_1 노드를 선택하면 시그널이 쭉 떠. 그 중에서 Player_dead 더블클릭하면 이 스크립트에 연결: 하면서 이것저것 떠. Player 선택하고 연결.

Player 스크립트에 죽으면 속도 0으로 바꾸고, 스프라이트 바꿔치는 코드 추가.

func _on_enemy_1_player_dead():
velocity = Vector2(0,0)
get_node("DeadSprite").visible = true
get_node("Sprite2D").visible = false
 
cs

GameOver Label을 만들고 Game 노드 스크립트에 코드 추가

func _ready():
get_node("GameOver").visible = false
func _on_enemy_1_player_dead():
get_node("GameOver").visible = true
 
cs


무당벌레를 어떻게 구분할까 고민이 많았어.

이게 왜 고민이었냐면, 진딧물이 무당벌레 근처에 오면 덮쳐서 죽이고 싶었단 말야.

그런데 무당벌레를 객체로 만들어서 메인 씬에서 “Enemy_1”을 불렀더니 거기다 스크립트를 달면, Enemy_1이랑 2에 스크립트를 각각 달 수 있는게 아니고, 무당벌레 자체에 스크립트가 붙더라고,, 그래서 그냥 최상위 노드에 쑤셔 넣음 ^^

Enemy_1만 캐릭터를 감지하고 동작하면 되는데 모든 무당벌레가 감지하는게 싫었어.


고민 하나 더

79f3c028e2f206a26d81f6e44081726f


  1. 무당벌레를 따로 씬으로 빼고, 불러서 쓸까 했단 말이지? 근데 구현을 굉장히 모르겠다는 문제가 있었어.
  2. 맵을 길게 만들고 무당벌레를 각자 만드는 방법.

스승님한테 여쭤봤더니 2가 유지보수가 편해서 그렇게 하신다더라. 오,, 일리 있어. 2번 당첨!


캐릭터 감지

무당벌레 코앞에 캐릭터가 온 걸 감지하고 싶어.

CollisionShape2D를 쓰면, 벽에 가로막힌 것처럼 나아가지를 못해서,

RayCast2D를 쓰기로 하긴 했어.

근데 만들고 나서 보니까 노드를 추가할 필요도 없더라구?

이거 Enemy_1 스크립트에 추가한 게 끝이야.


var is_entered = false
func _ready():
is_entered = false
func _physics_process(delta):
if is_entered == false:
var space_state = get_world_2d().direct_space_state
var query = PhysicsRayQueryParameters2D.create(Vector2(position.x - 100, 0), Vector2(position.x - 100, 750))
var result = space_state.intersect_ray(query)
 
if result:
position.y = result.position.y
is_entered = true
cs

  1. var query = PhysicsRayQueryParameters2D.create(Vector2(400, 0), Vector2(400, 750))
  2. var query = PhysicsRayQueryParameters2D.create(Vector2(position.x - 100, 0), Vector2(position.x - 100, 750))

처음에는 1처럼 씬 기준 위치를 박았는데, 배치 수정한다고 옮기니까 망가져서 2처럼 바꿨어.


카메라 설정

78f3c028e2f206a26d81f6e1448271


Q. 카메라가 캐릭터를 따라가게 하고 싶어요.


7bf3c028e2f206a26d81f6e34385726cde

A. 캐릭터 노드 밑에 카메라를 넣으세요


이게.. 머임?? 개쉽네

찾아본 내가 한심함.


7af3c028e2f206a26d81f6e74786756b


인스펙터에 이런거 있거든?

Drag 밑에 저 Margin이 뭐냐면, 

캐릭터가 찔끔 움직였는데 카메라가 정신사납게 계속 따라다니면 보고 있기 피곤하대. 

그래서 캐릭터가 얼마 이상 움직였을 때 카메라도 움직이세요~ 하는거임.


75f3c028e2f206a26d81f6e2478075


밑에 Node2D 밑에 Transform Position도 있는데 

이건 캐릭터 (0,0) 기준으로 카메라는 어디를 따라갈 건지 정하는 부분.


74f3c028e2f206a26d81f6ed468675

Player 글씨 오른쪽에(= 화면 중앙) 보면 십자 표시 있잖음? 캐릭터보다 x축으로 250 픽셀 더 간 거임.


나는 겁나 긴 삽질을 했는데 써보니까 별로 한 게 없네..

추석인데 다들 맛난거 먹고 힘내자.