diff --git a/objects/environment/moving_platform/moving_platform_scholar.gd b/objects/environment/moving_platform/moving_platform_scholar.gd new file mode 100644 index 0000000..ea6cc83 --- /dev/null +++ b/objects/environment/moving_platform/moving_platform_scholar.gd @@ -0,0 +1,92 @@ +tool +extends Node2D + + +const DEBUG_COLOR := Color(0.4, 0.2, 0.6, 0.75) + +export var size: float = 8.0 setget _set_size +export var speed: float = 20.0 +export var point_a := Vector2.ZERO setget _set_point_a +export var point_b := Vector2.ZERO setget _set_point_b +export (float, 0.0, 1.0, 0.1) var start_position: float = 0.0 setget _set_start_position +export var start_reversed: bool = false + +onready var body: KinematicBody2D = $Body +onready var sprite: Sprite = $"%Sprite" + +var _previous_position: Vector2 + + +func _ready() -> void: + if Engine.editor_hint: + return + + var distance := point_a.distance_to(point_b) + var start_target := point_a if start_reversed else point_b + var end_target := point_b if start_reversed else point_a + var start_weight := start_position if start_reversed else 1.0 - start_position + + var tween := create_tween() + tween.stop() + tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS) + tween.set_loops() + tween.tween_property(body, "position", end_target, distance / speed) + tween.tween_property(body, "position", start_target, distance / speed) + var start_tween := create_tween() + start_tween.set_process_mode(Tween.TWEEN_PROCESS_PHYSICS) + start_tween.tween_property(body, "position", start_target, start_weight * distance / speed) + start_tween.tween_callback(tween, "play") + + _previous_position = body.global_position + + +func _physics_process(delta: float) -> void: + if Engine.editor_hint: + return + + if (body.global_position.y - _previous_position.y) < 0.0 and speed >= 40.0: + sprite.position.y = -1.0 + else: + sprite.position.y = 0.0 + _previous_position = body.global_position + + +func _set_size(value: float) -> void: + size = value + get_node("%Sprite").region_rect.size.x = size + var segment = get_node("%CollisionShape").shape as SegmentShape2D + segment.a.x = size * -0.5 + segment.b.x = size * 0.5 + + +func _set_start_position(value: float) -> void: + start_position = value + if Engine.editor_hint: + get_node("Body").position = lerp(point_a, point_b, start_position) + + +func _set_point_a(value: Vector2) -> void: + point_a = value + if Engine.editor_hint: + _update_positions() + + +func _set_point_b(value: Vector2) -> void: + point_b = value + if Engine.editor_hint: + _update_positions() + + +func _update_positions() -> void: + if point_a == point_b: + _set_start_position(0.0) + else: + var closest_point := Geometry.get_closest_point_to_segment_2d(get_node("Body").position, point_a, point_b) + _set_start_position(point_a.distance_to(closest_point) / point_a.distance_to(point_b)) + property_list_changed_notify() + update() + + +func _draw() -> void: + if Engine.editor_hint: + draw_line(point_a, point_b, DEBUG_COLOR, 1.01) diff --git a/objects/environment/moving_platform/moving_platform_scholar.tscn b/objects/environment/moving_platform/moving_platform_scholar.tscn new file mode 100644 index 0000000..0d83800 --- /dev/null +++ b/objects/environment/moving_platform/moving_platform_scholar.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://graphics/moving_platform/moving_platform.png" type="Texture" id=1] +[ext_resource path="res://objects/environment/moving_platform/moving_platform_scholar.gd" type="Script" id=2] + +[sub_resource type="SegmentShape2D" id=1] +resource_local_to_scene = true +a = Vector2( -4, 0.01 ) +b = Vector2( 4, 0.01 ) + +[node name="MovingPlatform" type="Node2D"] +script = ExtResource( 2 ) + +[node name="Body" type="KinematicBody2D" parent="."] +collision_layer = 4 +motion/sync_to_physics = true +moving_platform_apply_velocity_on_leave = 1 + +[node name="Sprite" type="Sprite" parent="Body"] +unique_name_in_owner = true +texture = ExtResource( 1 ) +offset = Vector2( 0, 2 ) +region_enabled = true +region_rect = Rect2( 0, 0, 8, 4 ) +region_filter_clip = true + +[node name="CollisionShape" type="CollisionShape2D" parent="Body"] +unique_name_in_owner = true +shape = SubResource( 1 ) +one_way_collision = true