public void MovePlayer(float delta)
{
	이전에 작성했던 _Process 함수의 내용을
	여기에 붙여넣기
}

 

충돌 감지를 설정하기 전에

이전에 작성했던 _Process 함수 내부의

내용들이 지저분해서 따로 함수로 만들어서 사용한다.

 

using Godot;
using System;

public class Player : Area2D
{
	[Export]
	public int Speed = 400;
	public Vector2 ScreenSize;

	public override void _Ready()
	{
	    ScreenSize = GetViewportRect().Size;
	}

    	public override void _Process(float delta)
    	{
	    MovePlayer(delta);
    	}
    
	public void MovePlayer(float delta)... //생략
}

 

그러면 최종적으로 위와 같이 정리가 된다.

 

[Signal]
public delegate void Hit();

 

Player Class 안에 [Signal] 키워드를 사용하여

Hit()라는 사용자 정의 시그널 함수를 정의한다.

 

 

Player 노드 선택 후 오른쪽 상단에

노드를 선택하여 시그널 목록을 보면

Hit() 함수가 추가가 된 것을 볼 수가 있다.

이 함수는 나중에 만들 몬스터 노드와 충돌 시

신호를 보내기 위한 함수이다.

 

 

시그널 목록에서 Area2D 밑에 있는

body_entered(body: Node)를 클릭하면

시그널을 메서드에 연결하는 창이 뜨고

받는 메서드의 이름을 OnPlayerBodyEntered

바꾸어주고 연결을 해준다.

 

 

연결을 해주면 연결이 됐다고

초록색으로 바뀐다.

 

public void OnPlayerBodyEntered(PhysicsBody2D body)
{
    Hide();
    EmitSignal(nameof(Hit));
    GetNode<CollisionShape2D>("CollisionShape2D").SetDeferred("disabled", true);
}

 

이제 다시 스크립트로 돌아와서 위의 함수를 추가해준다.

여기서 주의할 점은 함수의 이름은

위에서 시그널을 연결할 때 설정했던

이름으로 만들어줘야 한다.

 

이 함수는 몬스터와 충돌을 하면

Hide() 메서드를 사용해 Player가 사라지게 하고

EmitSignal() 메서드를 사용해 시그널 이름이

Hit인 시그널의 신호를 보낸다.

 

그리고 몬스터가 Player와 충돌이 날 때마다

신호를 계속 보내기 때문에

이 신호를 한 번만 보내게 하기 위해서

CollisionShape2D 노드를 가져온 뒤

SetDeferred() 메서드를 사용하여

Player의 충돌을 비활성화시킨다.

 

public override void _Ready()
{
    ScreenSize = GetViewportRect().Size;
    Hide();
}

 

그리고 게임을 시작하기 전에 플레어를

숨기기 위해서 _Ready() 함수에

Hide() 메서드를 추가를 한다.

 

public void Start(Vector2 pos)
{
    Position = pos;
    Show();
    GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
}

 

게임 시작을 위한 Start 함수를 하나 만든다.

이 함수는 Player의 Position을

파라미터의 pos로 설정하고 Show() 메서드를 사용해

숨긴 플레이어의 모습을 나타나게 하고

CollisionShape2D 노드를 가져와서

비활성화가 되어 있다면 Disabled를

false로 설정하여 활성화시킨다.

 

밑에는 전체적인 코드이다.

using Godot;
using System;

public class Player : Area2D
{
    [Export]
    public int Speed = 400;
    [Signal]
    public delegate void Hit();
    public Vector2 ScreenSize;

    public override void _Ready()
    {
        ScreenSize = GetViewportRect().Size;
        Hide();
    }

    public override void _Process(float delta)
    {
        MovePlayer(delta);
    }

    public void OnPlayerBodyEntered(PhysicsBody2D body)
    {
        Hide();
        EmitSignal(nameof(Hit));
        GetNode<CollisionShape2D>("CollisionShape2D").SetDeferred("disabled", true);
    }

    public void Start(Vector2 pos)
    {
        Position = pos;
        Show();
        GetNode<CollisionShape2D>("CollisionShape2D").Disabled = false;
    }
    
    public void MovePlayer(float delta)... //생략

+ Recent posts