Improved Rope behaviour

The rope now spawns with the appropriate
length for the movement radius of the frog.
This is also  true for the death rope respawn.
Looks nice :)
This commit is contained in:
Jakob Feldmann 2023-01-10 15:04:11 +01:00
parent f4889b22a8
commit 35b525dff9
7 changed files with 36 additions and 35 deletions

View File

@ -1,6 +1,7 @@
extends Node2D
export var movement_radius = 200
# Is given in blocks
export var movement_radius = 6
var Rope = preload("res://src/Contraptions/Rope/Rope.tscn")
var RopeAnchor = preload("res://src/Contraptions/Rope/RopeAnchor.tscn")
@ -33,11 +34,11 @@ func _on_WhatAreFrog_child_exiting_tree(node:Node) -> void:
# For some reason the rope only can be instanced in the parent scene
# The scene also has to be ready beforehand
get_parent().add_child(rope)
rope.rope_end = get_node("RopeAnchor")
rope.rope_end = $RopeAnchor
rope.rope_start = anchor
rope.rope_end_joint = get_node("RopeAnchor/cshape/pjoint")
rope.rope_end_joint = $RopeAnchor/cshape/pjoint
rope.rope_start_joint = anchor.get_node("cshape/pjoint")
rope.spawn_rope(anchor.global_position, $RopeAnchor.global_position, movement_radius * 10, false)
rope.spawn_rope(anchor.global_position, $RopeAnchor.global_position, movement_radius, false)
is_first_signal = false
# rope.rope_start = anchor
# anchor.global_position = rope.rope_start_joint.global_position

View File

@ -6,7 +6,7 @@
[node name="BoundFrog" type="Node2D"]
script = ExtResource( 3 )
movement_radius = 100
movement_radius = 7
[node name="WhatAreFrog" parent="." instance=ExtResource( 1 )]

View File

@ -9,7 +9,10 @@ onready var jump_timer: Timer
onready var target_lost_timer: Timer
export var score := 100
# Is given in blocks
export var vision_distance := 6.0
# Also in blocks
var movement_radius: float
var anchor: Node2D
var is_bound := false
@ -37,7 +40,7 @@ func _ready():
func bind_to_anchor(anchor_node: Node2D, radius: float ) -> void:
anchor = anchor_node
movement_radius = radius
movement_radius = radius * 24
is_bound = true
@ -101,7 +104,7 @@ func detect_player() -> void:
var player
if(!players.empty()):
player = players[0]
vision_raycast.cast_to = (player.global_position - global_position).normalized() * 100
vision_raycast.cast_to = (player.global_position - global_position).normalized() * 24 * vision_distance
var ray_angle_to_facing = vision_raycast.cast_to.angle_to(orientation.cast_to)
var collider = vision_raycast.get_collider()
if(target == null && abs(ray_angle_to_facing) < PI/4 && collider != null && collider.is_in_group("player")):

View File

@ -9,7 +9,7 @@
extents = Vector2( 2.72463, 1.17848 )
[sub_resource type="RectangleShape2D" id=2]
extents = Vector2( 15.4794, 6.68174 )
extents = Vector2( 13, 5.12039 )
[sub_resource type="RectangleShape2D" id=3]
extents = Vector2( 15.534, 10.0962 )
@ -54,7 +54,7 @@ cast_to = Vector2( 0, -13 )
collision_mask = 56
[node name="Orientation" type="RayCast2D" parent="."]
cast_to = Vector2( -1, 0 )
cast_to = Vector2( 1, 0 )
collision_mask = 0
collide_with_bodies = false
@ -97,6 +97,7 @@ collision_layer = 2
input_pickable = false
[node name="CollisionShape2D" type="CollisionShape2D" parent="StompDetector"]
position = Vector2( -4.76837e-07, 1.56134 )
shape = SubResource( 2 )
[node name="EnemySkin" type="Area2D" parent="." groups=["player"]]

View File

@ -1,5 +1,10 @@
extends Node2D
onready var rope_start
onready var rope_end
onready var rope_start_joint
onready var rope_end_joint
var RopePiece = preload("res://src/Contraptions/Rope/RopePiece.tscn")
var RopeAnchor = preload("res://src/Contraptions/Rope/RopeAnchor.tscn")
var piece_length := 2.0
@ -7,26 +12,23 @@ var rope_close_tolerance := 2.0
var rope_pieces := []
var rope_piece_positions : PoolVector2Array= []
var anchor_distance := 1.0
# Is given in blocks
var movement_radius := 1.0
export var mouse_follow := false
onready var rope_start
onready var rope_end
onready var rope_start_joint
onready var rope_end_joint
export var rope_tightness := 0.5
func _physics_process(_delta: float) -> void:
#Resize or reinitialize?
if(mouse_follow):
rope_end.global_position = get_global_mouse_position()
# TODO Resize or reinitialize?
rope_piece_positions.resize(0)
rope_piece_positions = get_piece_positions()
anchor_distance = rope_piece_positions[0].distance_to(rope_piece_positions[-1])
if !rope_piece_positions.empty():
update()
func spawn_rope(start_pos: Vector2, end_pos: Vector2, m_radius: float = 10000, new_anchors: bool = true):
func spawn_rope(start_pos: Vector2, end_pos: Vector2, m_radius: float = 100, new_anchors: bool = true):
# The rope should be the defined length even if the anchors are close together/far apart
movement_radius = m_radius * 24
var mock_end_pos = start_pos + (end_pos - start_pos).normalized() * movement_radius * rope_tightness
if(new_anchors):
rope_start = RopeAnchor.instance()
rope_end = RopeAnchor.instance()
@ -35,12 +37,13 @@ func spawn_rope(start_pos: Vector2, end_pos: Vector2, m_radius: float = 10000, n
add_child(rope_start, true)
add_child(rope_end, true)
rope_start.global_position = start_pos
rope_end.global_position = end_pos
movement_radius = m_radius
anchor_distance = start_pos.distance_to(end_pos)
rope_end.global_position = mock_end_pos
anchor_distance = start_pos.distance_to(mock_end_pos)
var pieces_amount = round(anchor_distance / piece_length)
var spawn_angle = (end_pos-start_pos).angle() - PI/2
create_rope(pieces_amount, rope_start, end_pos, spawn_angle)
var spawn_angle = (mock_end_pos-start_pos).angle() - PI/2
create_rope(pieces_amount, rope_start, mock_end_pos, spawn_angle)
rope_end.global_position = end_pos
func create_rope(pieces_amount: int, last_piece: Object, end_pos: Vector2, spawn_angle: float) -> void:
for i in pieces_amount:

View File

@ -5,3 +5,4 @@
[node name="Rope" type="Node2D"]
z_index = -1
script = ExtResource( 1 )
rope_tightness = 0.5

View File

@ -37,7 +37,7 @@ format = 1
tile_data = PoolIntArray( 131099, -1073741822, 0, 262139, -1610612734, 0, 196635, -1073741822, 0, 327675, -1610612734, 0, 262171, -1073741822, 0, 393211, -1610612734, 0, 327707, -1073741822, 0, 458747, -1610612734, 0, 393243, -1073741822, 0, 524283, -1610612734, 0, 458779, -1073741822, 0, 589819, -1610612734, 0, 524315, -1073741822, 0, 655355, -1610612734, 0, 589851, -1073741822, 0, 720891, -1610612734, 0, 655387, -1073741822, 0, 786427, -1610612734, 0, 720923, -1073741822, 0, 851963, -1610612734, 0, 786459, -1073741822, 0, 917499, -1610612734, 0, 851995, -1073741822, 0, 983036, 2, 0, 983037, 2, 0, 983038, 2, 0, 983039, 2, 0, 917504, 2, 0, 917505, 2, 0, 917506, 2, 0, 917507, 2, 0, 917508, 2, 0, 917509, 2, 0, 917510, 2, 0, 917511, 2, 0, 917512, 2, 0, 917513, 2, 0, 917514, 2, 0, 917515, 2, 0, 917516, 2, 0, 917517, 2, 0, 917518, 2, 0, 917519, 2, 0, 917520, 2, 0, 917521, 2, 0, 917522, 2, 0, 917523, 2, 0, 917524, 2, 0, 917525, 2, 0, 917526, 2, 0, 917527, 2, 0, 917528, 2, 0, 917529, 2, 0, 917530, 2, 0 )
[node name="Spikes" parent="." instance=ExtResource( 13 )]
position = Vector2( 231, 203 )
position = Vector2( 252, 323 )
[node name="BlobbyCam" parent="." instance=ExtResource( 11 )]
@ -50,15 +50,7 @@ scale = Vector2( 0.878906, 0.936025 )
parameters/playback = SubResource( 4 )
[node name="BoundFrog" parent="." instance=ExtResource( 12 )]
position = Vector2( 57, 324 )
scale = Vector2( 0.878906, 0.936025 )
movement_radius = 300
[node name="WhatAreFrog" parent="BoundFrog" index="0"]
position = Vector2( 187.733, 0 )
[node name="RopeAnchor" parent="BoundFrog" index="1"]
position = Vector2( 167.253, 9.61514 )
position = Vector2( 200, 323 )
[node name="Collectibles" type="Node2D" parent="."]
visible = false