안녕, 나 고도 뉴비.
이번에는 retry 기능을 넣고, Game Over! 표시를 해봤어. 캐릭터 감지랑, 카메라 설정도.
왼쪽 위에 프로젝트 - 프로젝트 설정 - 입력 맵에 R 추가
최상위 노드(Game)에 딸린 스크립트 파일에 R키 눌리면 씬 다시 부르는 코드 추가
func _process(delta): if Input.is_action_pressed("retry"): get_tree().reload_current_scene() | cs |
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만 캐릭터를 감지하고 동작하면 되는데 모든 무당벌레가 감지하는게 싫었어.
고민 하나 더
- 무당벌레를 따로 씬으로 빼고, 불러서 쓸까 했단 말이지? 근데 구현을 굉장히 모르겠다는 문제가 있었어.
- 맵을 길게 만들고 무당벌레를 각자 만드는 방법.
스승님한테 여쭤봤더니 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 |
- var query = PhysicsRayQueryParameters2D.create(Vector2(400, 0), Vector2(400, 750))
- var query = PhysicsRayQueryParameters2D.create(Vector2(position.x - 100, 0), Vector2(position.x - 100, 750))
처음에는 1처럼 씬 기준 위치를 박았는데, 배치 수정한다고 옮기니까 망가져서 2처럼 바꿨어.
Q. 카메라가 캐릭터를 따라가게 하고 싶어요.
A. 캐릭터 노드 밑에 카메라를 넣으세요
이게.. 머임?? 개쉽네
찾아본 내가 한심함.
인스펙터에 이런거 있거든?
Drag 밑에 저 Margin이 뭐냐면,
캐릭터가 찔끔 움직였는데 카메라가 정신사납게 계속 따라다니면 보고 있기 피곤하대.
그래서 캐릭터가 얼마 이상 움직였을 때 카메라도 움직이세요~ 하는거임.
밑에 Node2D 밑에 Transform Position도 있는데
이건 캐릭터 (0,0) 기준으로 카메라는 어디를 따라갈 건지 정하는 부분.
Player 글씨 오른쪽에(= 화면 중앙) 보면 십자 표시 있잖음? 캐릭터보다 x축으로 250 픽셀 더 간 거임.
나는 겁나 긴 삽질을 했는데 써보니까 별로 한 게 없네..
추석인데 다들 맛난거 먹고 힘내자.
댓글 1