Skip to content

Godot:CustomDrawing

사용자 정의 Draw 방법.

Categories

  • Hexagon#Godot - Godot 의 커스텀 드로잉으로 정육면체 그리는 방법 설명.

Features

2D 노드의 사용자 정의 그리기는 정말 유용합니다. 다음은 몇 가지 사용 사례입니다.

  • 트레일이 있는 이미지나 애니메이션이 적용된 특수 다각형과 같이 기존 노드에서 수행할 수 없는 모양 또는 논리 그리기.
  • 테트리스 보드와 같이 노드와 호환되지 않는 시각화. (테트리스 예제에서는 사용자 정의 그리기 기능을 사용하여 블록을 그립니다.)
  • 많은 수의 간단한 개체 그리기. 사용자 지정 그리기는 많은 수의 노드를 사용하는 오버헤드를 방지하여 메모리 사용량을 낮추고 성능을 향상시킬 수 있습니다.
  • 사용자 정의 UI 컨트롤 만들기. 사용할 수 있는 컨트롤이 많이 있지만 비정상적인 요구 사항이 있는 경우 사용자 지정 컨트롤이 필요할 수 있습니다.

Draw Method

_Draw() 함수를 오버라이드 하면 된다.

public override void _Draw()
{
    // Your draw commands here
}

그리는 방법은 CanvasItem에서 확인.

Updating

_draw() 함수는 단 한 번만 호출하고, 그 다음에는 그리기 명령을 캐싱하여 기억하므로 추가 호출은 불필요합니다.

상태 또는 다른 것이 변경되어 다시 그리기가 필요한 경우 동일한 노드에서 CanvasItem.update()를 호출하면 새로 _draw()가 호출된다.

여기 좀 더 복잡한 예가 있는데 텍스처 변수는 수정하면 다시 그려지게 됩니다:

public class CustomNode2D : Node2D
{
    private Texture _texture;
    public Texture Texture
    {
        get
        {
            return _texture;
        }

        set
        {
            _texture = value;
            Update();
        }
    }

    public override void _Draw()
    {
        DrawTexture(_texture, new Vector2());
    }
}

어떤 경우 모든 프레임을 그리는 것이 바람직할 수 있습니다. 이를 위해 _process() 콜백에서 다음과 같이 update() 를 호출하세요:

public class CustomNode2D : Node2D
{
    public override void _Draw()
    {
        // Your draw commands here
    }

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

Example

public class CustomNode2D : Node2D
{
    public void DrawCircleArc(Vector2 center, float radius, float angleFrom, float angleTo, Color color)
    {
        int nbPoints = 32;
        var pointsArc = new Vector2[nbPoints];

        for (int i = 0; i < nbPoints; ++i)
        {
            float anglePoint = Mathf.Deg2Rad(angleFrom + i * (angleTo - angleFrom) / nbPoints - 90f);
            pointsArc[i] = center + new Vector2(Mathf.Cos(anglePoint), Mathf.Sin(anglePoint)) * radius;
        }

        for (int i = 0; i < nbPoints - 1; ++i)
            DrawLine(pointsArc[i], pointsArc[i + 1], color);
    }

    public override void _Draw()
    {
        var center = new Vector2(200, 200);
        float radius = 80;
        float angleFrom = 75;
        float angleTo = 195;
        var color = new Color(1, 0, 0);
        DrawCircleArc(center, radius, angleFrom, angleTo, color);
    }
}

See also

Favorite site