Grafo de nodos

Cuatro nodos con puertos que conectas arrastrando. GraphEdit dibuja la curva, aceptar la conexión es cosa tuya.

El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.

Clases de Godot usadas

GraphEditGraphNode

El código

scripts/main.gd
extends Node

const NODES: Array = [
	{title = 'Noise', at = Vector2(60, 80), outputs = 1, inputs = 0, color = '#8eef97'},
	{title = 'Color ramp', at = Vector2(360, 60), outputs = 1, inputs = 1, color = '#8da5f3'},
	{title = 'Multiply', at = Vector2(360, 260), outputs = 1, inputs = 2, color = '#f3d48d'},
	{title = 'Output', at = Vector2(680, 160), outputs = 0, inputs = 1, color = '#fc7f7f'},
]

var graph: GraphEdit
var status: Label


func _ready() -> void:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	var column: VBoxContainer = VBoxContainer.new()
	add_child(column)
	column.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

	# outside the GraphEdit, whose plain children stay pinned to a corner over the nodes
	status = Label.new()
	status.text = 'drag from a port to another to wire the nodes'
	status.add_theme_color_override('font_color', Color('#999999'))
	column.add_child(status)

	graph = GraphEdit.new()
	graph.show_grid = true
	graph.minimap_enabled = false
	graph.size_flags_vertical = Control.SIZE_EXPAND_FILL
	column.add_child(graph)

	for entry in NODES:
		graph.add_child(_make_node(entry))

	graph.connection_request.connect(_on_connect)
	graph.disconnection_request.connect(_on_disconnect)

	print('GraphEdit does the dragging and the curves, the connection is yours to accept')


func _make_node(entry: Dictionary) -> GraphNode:
	var node: GraphNode = GraphNode.new()
	node.title = entry.title
	node.position_offset = entry.at
	node.custom_minimum_size = Vector2(190, 0)

	var rows: int = max(entry.inputs, entry.outputs)

	for i in rows:
		var label: Label = Label.new()
		label.text = 'port %d' % i
		label.add_theme_color_override('font_color', Color('#999999'))
		node.add_child(label)

		node.set_slot(i, i < entry.inputs, 0, Color(entry.color), i < entry.outputs, 0, Color(entry.color))

	return node


func _on_connect(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
	graph.connect_node(from_node, from_port, to_node, to_port)
	status.text = '%s:%d -> %s:%d' % [from_node, from_port, to_node, to_port]


func _on_disconnect(from_node: StringName, from_port: int, to_node: StringName, to_port: int) -> void:
	graph.disconnect_node(from_node, from_port, to_node, to_port)
	status.text = 'disconnected %s from %s' % [from_node, to_node]

Más ejemplos de Interfaz