First working spring implementation
The behaviour of the spring is erratic still. The main problem is: Blobby being slowed down, disproportionally much when touching the spring surface. A communication between the contraption and Blobbys physics needs to happen. He has to slow down according to the, motion of the spring plattform, and not go to 0 because hes touching some ground. The other thing is that it should be always possible to jump. Currently the platform can move down faster than blobby and cause him to hover, which makes jumping unavailable.
This commit is contained in:
parent
9c2a01f8a1
commit
1b7b6acd09
@ -20,13 +20,13 @@ onready var camera = $Camera2D
|
|||||||
|
|
||||||
# TODO This is the worst thing since... you know
|
# TODO This is the worst thing since... you know
|
||||||
# When the Enemy stomp AREA enters the enemy collision area -> stomp
|
# When the Enemy stomp AREA enters the enemy collision area -> stomp
|
||||||
func _on_Skin_area_entered(area: Area2D) -> void:
|
func _on_BlobbySkin_area_entered(area: Area2D) -> void:
|
||||||
if area.name == "StompDetector":
|
if area.name == "StompDetector":
|
||||||
velocity = calculate_stomp_velocity(velocity, stomp_feedback)
|
velocity = calculate_stomp_velocity(velocity, stomp_feedback)
|
||||||
|
|
||||||
|
|
||||||
# When the Enemy collision BODY enters the enemy collision area -> die
|
# When the Enemy collision BODY enters the enemy collision area -> die
|
||||||
func _on_Skin_body_entered(body: Node) -> void:
|
func _on_BlobbySkin_body_entered(body: Node) -> void:
|
||||||
if body.name == "EnemyBody":
|
if body.name == "EnemyBody":
|
||||||
die()
|
die()
|
||||||
|
|
||||||
|
|||||||
@ -39,11 +39,11 @@ script = ExtResource( 2 )
|
|||||||
|
|
||||||
[node name="ShiftTween" type="Tween" parent="Camera2D"]
|
[node name="ShiftTween" type="Tween" parent="Camera2D"]
|
||||||
|
|
||||||
[node name="Skin" type="Area2D" parent="."]
|
[node name="BlobbySkin" type="Area2D" parent="."]
|
||||||
collision_mask = 126
|
collision_mask = 126
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Skin"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="BlobbySkin"]
|
||||||
scale = Vector2( 1.03, 1.03 )
|
scale = Vector2( 1.04, 1.04 )
|
||||||
polygon = PoolVector2Array( -6.7, -3.311, -2.676, -7.3, 3.939, -7.3, 8, -1.863, 8, 4.912, 4.944, 8.5, -1.03623, 8.5, -4.213, 8.5, -6.7, 6.089 )
|
polygon = PoolVector2Array( -6.7, -3.311, -2.676, -7.3, 3.939, -7.3, 8, -1.863, 8, 4.912, 4.944, 8.5, -1.03623, 8.5, -4.213, 8.5, -6.7, 6.089 )
|
||||||
|
|
||||||
[node name="PlayerStateMachine" type="Node" parent="."]
|
[node name="PlayerStateMachine" type="Node" parent="."]
|
||||||
@ -74,13 +74,13 @@ valign = 1
|
|||||||
position = Vector2( 3.86988, 6.34765 )
|
position = Vector2( 3.86988, 6.34765 )
|
||||||
|
|
||||||
[node name="Left_Wallcast1" type="RayCast2D" parent="WallRaycasts/LeftWallRaycast"]
|
[node name="Left_Wallcast1" type="RayCast2D" parent="WallRaycasts/LeftWallRaycast"]
|
||||||
position = Vector2( -10.706, -8.03844 )
|
position = Vector2( -10.5748, -8.60978 )
|
||||||
enabled = true
|
enabled = true
|
||||||
cast_to = Vector2( -2, 0 )
|
cast_to = Vector2( -2, 0 )
|
||||||
collision_mask = 9
|
collision_mask = 9
|
||||||
|
|
||||||
[node name="Left_Wallcast2" type="RayCast2D" parent="WallRaycasts/LeftWallRaycast"]
|
[node name="Left_Wallcast2" type="RayCast2D" parent="WallRaycasts/LeftWallRaycast"]
|
||||||
position = Vector2( -10.706, -1.9261 )
|
position = Vector2( -10.5888, -1.27766 )
|
||||||
enabled = true
|
enabled = true
|
||||||
cast_to = Vector2( -2, 0 )
|
cast_to = Vector2( -2, 0 )
|
||||||
collision_mask = 9
|
collision_mask = 9
|
||||||
@ -88,17 +88,17 @@ collision_mask = 9
|
|||||||
[node name="RightWallRaycast" type="Node2D" parent="WallRaycasts"]
|
[node name="RightWallRaycast" type="Node2D" parent="WallRaycasts"]
|
||||||
|
|
||||||
[node name="Right_Wallcast1" type="RayCast2D" parent="WallRaycasts/RightWallRaycast"]
|
[node name="Right_Wallcast1" type="RayCast2D" parent="WallRaycasts/RightWallRaycast"]
|
||||||
position = Vector2( 7.97737, -0.838908 )
|
position = Vector2( 8.00081, -0.776408 )
|
||||||
enabled = true
|
enabled = true
|
||||||
cast_to = Vector2( 2, 0 )
|
cast_to = Vector2( 2, 0 )
|
||||||
collision_mask = 9
|
collision_mask = 9
|
||||||
|
|
||||||
[node name="Right_Wallcast2" type="RayCast2D" parent="WallRaycasts/RightWallRaycast"]
|
[node name="Right_Wallcast2" type="RayCast2D" parent="WallRaycasts/RightWallRaycast"]
|
||||||
position = Vector2( 8.0633, 3.84536 )
|
position = Vector2( 8.01643, 3.91567 )
|
||||||
enabled = true
|
enabled = true
|
||||||
cast_to = Vector2( 2, 0 )
|
cast_to = Vector2( 2, 0 )
|
||||||
collision_mask = 9
|
collision_mask = 9
|
||||||
|
|
||||||
[connection signal="area_entered" from="Skin" to="." method="_on_Skin_area_entered"]
|
[connection signal="area_entered" from="BlobbySkin" to="." method="_on_BlobbySkin_area_entered"]
|
||||||
[connection signal="body_entered" from="Skin" to="." method="_on_Skin_body_entered"]
|
[connection signal="body_entered" from="BlobbySkin" to="." method="_on_BlobbySkin_body_entered"]
|
||||||
[connection signal="timeout" from="PlayerStateMachine/JumpBufferTimer" to="." method="_on_JumpBufferTimer_timeout"]
|
[connection signal="timeout" from="PlayerStateMachine/JumpBufferTimer" to="." method="_on_JumpBufferTimer_timeout"]
|
||||||
|
|||||||
@ -8,6 +8,7 @@ func _ready() -> void:
|
|||||||
velocity.x = -30
|
velocity.x = -30
|
||||||
|
|
||||||
|
|
||||||
|
# TODO Unify areas of kinematic bodies to skin
|
||||||
func _on_StompDetector_body_entered(body: Node) -> void:
|
func _on_StompDetector_body_entered(body: Node) -> void:
|
||||||
if body.global_position.y > get_node("StompDetector").global_position.y:
|
if body.global_position.y > get_node("StompDetector").global_position.y:
|
||||||
return
|
return
|
||||||
|
|||||||
@ -6,10 +6,11 @@ const PhysicsConst = preload("res://src/Utilities/Physic/PhysicsConst.gd")
|
|||||||
# var a: int = 2
|
# var a: int = 2
|
||||||
# var b: Strin = "text"
|
# var b: Strin = "text"
|
||||||
var mass = 1
|
var mass = 1
|
||||||
var spring_k = -200
|
var spring_k = -500
|
||||||
var start_y = 0
|
var start_y = 0
|
||||||
var y_velocity = 0
|
var y_velocity = 0
|
||||||
var friction = 0.9
|
var friction = 0.91
|
||||||
|
var stored_incoming_velocity = 0
|
||||||
|
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
@ -22,7 +23,6 @@ func _physics_process(delta: float) -> void:
|
|||||||
var spring_force = spring_k * (self.position.y - self.start_y)
|
var spring_force = spring_k * (self.position.y - self.start_y)
|
||||||
var weight_force = PhysicsConst.gravity * mass
|
var weight_force = PhysicsConst.gravity * mass
|
||||||
var result_force = weight_force + spring_force
|
var result_force = weight_force + spring_force
|
||||||
|
|
||||||
y_velocity += PhysicsFunc.convert_force_to_velocity(
|
y_velocity += PhysicsFunc.convert_force_to_velocity(
|
||||||
result_force, mass, delta
|
result_force, mass, delta
|
||||||
)
|
)
|
||||||
@ -30,14 +30,36 @@ func _physics_process(delta: float) -> void:
|
|||||||
y_velocity *= friction
|
y_velocity *= friction
|
||||||
|
|
||||||
self.position.y += y_velocity * delta
|
self.position.y += y_velocity * delta
|
||||||
|
if !_if_do_bounce():
|
||||||
|
_store_incoming_velocity()
|
||||||
|
|
||||||
|
|
||||||
func _on_Area2D_area_entered(area: Area2D) -> void:
|
# TODO this works against the physics process
|
||||||
|
func _store_incoming_velocity():
|
||||||
|
var areas: Array = $EnteringVelocityDetector.get_overlapping_areas()
|
||||||
|
for i in range(0, areas.size()):
|
||||||
|
if areas[i].name == "BlobbySkin":
|
||||||
|
print_debug(stored_incoming_velocity)
|
||||||
|
if areas[i].get_parent().velocity.y != 0:
|
||||||
|
stored_incoming_velocity = areas[i].get_parent().velocity.y
|
||||||
|
|
||||||
|
|
||||||
|
func _if_do_bounce() -> bool:
|
||||||
|
var areas: Array = $SpringSkin.get_overlapping_areas()
|
||||||
|
for i in range(0, areas.size()):
|
||||||
|
if areas[i].name == "BlobbySkin":
|
||||||
|
_Kinematic_Body_on_Spring(areas[i])
|
||||||
|
return true
|
||||||
|
return false
|
||||||
|
|
||||||
|
|
||||||
|
func _Kinematic_Body_on_Spring(area: Area2D) -> void:
|
||||||
var area_parent = area.get_parent()
|
var area_parent = area.get_parent()
|
||||||
var a_velocity = area_parent.velocity.y
|
var a_velocity = stored_incoming_velocity
|
||||||
var a_mass = area_parent.mass
|
var a_mass = area_parent.mass
|
||||||
var b_velocity = y_velocity
|
var b_velocity = y_velocity
|
||||||
var b_mass = mass
|
var b_mass = mass
|
||||||
y_velocity += PhysicsFunc.complete_unelastic_shock(
|
y_velocity += PhysicsFunc.complete_unelastic_shock(
|
||||||
a_velocity, b_velocity, a_mass, b_mass
|
a_velocity, b_velocity, a_mass, b_mass
|
||||||
)
|
)
|
||||||
|
stored_incoming_velocity = area_parent.velocity.y
|
||||||
|
|||||||
@ -1,38 +1,42 @@
|
|||||||
[gd_scene load_steps=5 format=2]
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://src/Contraptions/Platform/Spring.gd" type="Script" id=1]
|
[ext_resource path="res://src/Contraptions/Platform/Spring.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/environment/blocks/Basic stone block.png" type="Texture" id=2]
|
[ext_resource path="res://assets/environment/blocks/Basic stone block.png" type="Texture" id=2]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=1]
|
|
||||||
extents = Vector2( 11.913, 1.58343 )
|
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id=2]
|
[sub_resource type="RectangleShape2D" id=2]
|
||||||
extents = Vector2( 11.8988, 1.56963 )
|
extents = Vector2( 11.4526, 1.7975 )
|
||||||
|
|
||||||
|
[sub_resource type="RectangleShape2D" id=1]
|
||||||
|
extents = Vector2( 11.9386, 1.57982 )
|
||||||
|
|
||||||
|
[sub_resource type="RectangleShape2D" id=3]
|
||||||
|
extents = Vector2( 11.4, 1.42384 )
|
||||||
|
|
||||||
[node name="Spring" type="Node2D"]
|
[node name="Spring" type="Node2D"]
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="StaticBody2D" type="StaticBody2D" parent="."]
|
[node name="Sprite" type="Sprite" parent="."]
|
||||||
collision_layer = 32
|
|
||||||
collision_mask = 41
|
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="StaticBody2D"]
|
|
||||||
position = Vector2( -11.9516, -1.58488 )
|
|
||||||
scale = Vector2( 1.48986, 0.197785 )
|
scale = Vector2( 1.48986, 0.197785 )
|
||||||
texture = ExtResource( 2 )
|
texture = ExtResource( 2 )
|
||||||
centered = false
|
|
||||||
|
|
||||||
[node name="SpringBody" type="CollisionShape2D" parent="StaticBody2D"]
|
[node name="SpringSkin" type="Area2D" parent="."]
|
||||||
position = Vector2( -0.0323062, -0.0131137 )
|
|
||||||
shape = SubResource( 1 )
|
|
||||||
|
|
||||||
[node name="Spring" type="Area2D" parent="StaticBody2D"]
|
|
||||||
position = Vector2( -0.0323062, -0.0131137 )
|
|
||||||
collision_layer = 32
|
collision_layer = 32
|
||||||
collision_mask = 3
|
collision_mask = 3
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="StaticBody2D/Spring"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="SpringSkin"]
|
||||||
position = Vector2( 0.0323062, 0.0137925 )
|
|
||||||
shape = SubResource( 2 )
|
shape = SubResource( 2 )
|
||||||
|
|
||||||
[connection signal="area_entered" from="StaticBody2D/Spring" to="." method="_on_Area2D_area_entered"]
|
[node name="SpringBody" type="KinematicBody2D" parent="."]
|
||||||
|
collision_layer = 32
|
||||||
|
collision_mask = 41
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="SpringBody"]
|
||||||
|
shape = SubResource( 1 )
|
||||||
|
|
||||||
|
[node name="EnteringVelocityDetector" type="Area2D" parent="."]
|
||||||
|
position = Vector2( 0, -3.99571 )
|
||||||
|
collision_layer = 32
|
||||||
|
collision_mask = 41
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="EnteringVelocityDetector"]
|
||||||
|
shape = SubResource( 3 )
|
||||||
|
|||||||
@ -64,3 +64,5 @@ position = Vector2( 206.918, 601.665 )
|
|||||||
|
|
||||||
[node name="Blobby" parent="." instance=ExtResource( 1 )]
|
[node name="Blobby" parent="." instance=ExtResource( 1 )]
|
||||||
position = Vector2( 50.7867, 604.063 )
|
position = Vector2( 50.7867, 604.063 )
|
||||||
|
|
||||||
|
[editable path="Spring"]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user