Godot:CustomDrawing
사용자 정의 Draw 방법.
Categories
- Hexagon#Godot - Godot 의 커스텀 드로잉으로 정육면체 그리는 방법 설명.
Features
2D 노드의 사용자 정의 그리기는 정말 유용합니다. 다음은 몇 가지 사용 사례입니다.
- 트레일이 있는 이미지나 애니메이션이 적용된 특수 다각형과 같이 기존 노드에서 수행할 수 없는 모양 또는 논리 그리기.
- 테트리스 보드와 같이 노드와 호환되지 않는 시각화. (테트리스 예제에서는 사용자 정의 그리기 기능을 사용하여 블록을 그립니다.)
- 많은 수의 간단한 개체 그리기. 사용자 지정 그리기는 많은 수의 노드를 사용하는 오버헤드를 방지하여 메모리 사용량을 낮추고 성능을 향상시킬 수 있습니다.
- 사용자 정의 UI 컨트롤 만들기. 사용할 수 있는 컨트롤이 많이 있지만 비정상적인 요구 사항이 있는 경우 사용자 지정 컨트롤이 필요할 수 있습니다.
Draw Method
_Draw()
함수를 오버라이드 하면 된다.
그리는 방법은 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);
}
}