62 lines
2.2 KiB
GDScript3
62 lines
2.2 KiB
GDScript3
|
|
class_name Vine extends Node2D
|
||
|
|
var petal_location : Vector2
|
||
|
|
@export var vine_locations : Array[Vector2]
|
||
|
|
@export var bud_resource : PackedScene
|
||
|
|
@onready var grid : Grid = get_tree().get_root().get_node("main/Earth/Grid")
|
||
|
|
|
||
|
|
func draw_vine(pos1 : Vector2, pos2 : Vector2, img_path):
|
||
|
|
var sprite = Sprite2D.new()
|
||
|
|
get_tree().get_root().get_node("main").add_child(sprite)
|
||
|
|
sprite.texture = ResourceLoader.load(img_path)
|
||
|
|
sprite.position = (pos1 + pos2)/2.0
|
||
|
|
sprite.rotation = (pos1 - pos2).angle() + PI/2
|
||
|
|
sprite.scale *= (pos1 - pos2).length() * 1 / sprite.texture.get_width()
|
||
|
|
sprite.scale.x = 3
|
||
|
|
|
||
|
|
func grow_vine_sequence(location1 : Vector2, offset1 : Vector2, location2: Vector2, offset2 : Vector2, num_segments: int, img_path, grow_bud = false):
|
||
|
|
var pos1 = grid.get_world_position(location1, offset1)
|
||
|
|
var pos2 = grid.get_world_position(location2, offset2)
|
||
|
|
var positions = []
|
||
|
|
positions.append(pos1)
|
||
|
|
|
||
|
|
var segment_length = (pos1 - pos2).length() / num_segments
|
||
|
|
var offsets = generate_random_offsets(num_segments, 0.6 * segment_length)
|
||
|
|
for i in range(num_segments - 1):
|
||
|
|
var t = (i + 1) * 1.0/num_segments
|
||
|
|
var center = t * pos2 + (1 - t) * pos1
|
||
|
|
var offset = offsets[i + 1] * (pos2 - pos1).normalized().rotated(PI/2)
|
||
|
|
positions.append(center + offset)
|
||
|
|
positions.append(pos2)
|
||
|
|
for i in range(num_segments):
|
||
|
|
draw_vine(positions[i], positions[i+1], img_path)
|
||
|
|
await get_tree().create_timer(0.2).timeout
|
||
|
|
if grow_bud and location2.y > 0:
|
||
|
|
spawn_bud(location2, offset2)
|
||
|
|
|
||
|
|
func generate_random_offsets(segment_count, max_second_derivative):
|
||
|
|
var differences = []
|
||
|
|
var last_diff = 0
|
||
|
|
for i in range(segment_count):
|
||
|
|
var new_diff = last_diff + randf_range(-max_second_derivative, max_second_derivative)
|
||
|
|
differences.append(new_diff)
|
||
|
|
last_diff = new_diff
|
||
|
|
var sum = 0.0
|
||
|
|
for i in range(segment_count):
|
||
|
|
sum += differences[i]
|
||
|
|
var correction = - sum / segment_count
|
||
|
|
for i in range(segment_count):
|
||
|
|
differences[i] += correction
|
||
|
|
var ret = []
|
||
|
|
var next_val = 0
|
||
|
|
for i in range(segment_count):
|
||
|
|
ret.append(next_val)
|
||
|
|
next_val += differences[i]
|
||
|
|
return ret
|
||
|
|
|
||
|
|
func spawn_bud(location, offset):
|
||
|
|
var bud = bud_resource.instantiate()
|
||
|
|
bud.location = location
|
||
|
|
bud.offset = offset
|
||
|
|
bud.vine = self
|
||
|
|
get_tree().get_root().get_node("main").add_child(bud)
|