diff options
author | dusoleil <howcansocksbereal@gmail.com> | 2022-09-15 02:34:38 -0400 |
---|---|---|
committer | dusoleil <howcansocksbereal@gmail.com> | 2022-09-15 02:34:38 -0400 |
commit | 5cb75d2c75f27cae565cc77db798ed832b9aaa1f (patch) | |
tree | 2dcd2c678eadc0360d9c9681ca63240e576278ae /character | |
parent | 134440ace62915ebab3b2e1252ab33ccff467c40 (diff) | |
parent | ecf88f1b1a8448bf4a0d5950dc7a9f4db4de7162 (diff) | |
download | game_jam49-5cb75d2c75f27cae565cc77db798ed832b9aaa1f.tar.gz game_jam49-5cb75d2c75f27cae565cc77db798ed832b9aaa1f.zip |
Merge tag 'pull-ship-development-iter1' of ssh://normalmode.org/mika/game_jam49 into mika-pr
Iteration one of ship development
Diffstat (limited to 'character')
-rw-r--r-- | character/fps_controller/fps_controller.gd | 51 | ||||
-rw-r--r-- | character/fps_controller/fps_controller.tscn | 17 |
2 files changed, 60 insertions, 8 deletions
diff --git a/character/fps_controller/fps_controller.gd b/character/fps_controller/fps_controller.gd index 3021d40..09ef556 100644 --- a/character/fps_controller/fps_controller.gd +++ b/character/fps_controller/fps_controller.gd @@ -2,13 +2,17 @@ extends KinematicBody onready var camera = $Camera onready var ray = $Camera/RayCast +onready var ladder_area = $ladder_detector -export var walk_speed : int = 5 +export var walk_speed : int = 10 export var accel : float = 0.2 export var gravity : int = -1 export var term_velocity : int = -35 +export var jump_strength : int = 20 +export var inertia : int = 5 var velocity : Vector3 +var is_climbing : bool = false func _ready(): Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) @@ -18,6 +22,8 @@ func _process(_delta): func _physics_process(_delta): handle_movement() + handle_jumping() + handle_collision() func get_input(): var dir : Vector3 = Vector3.ZERO @@ -26,8 +32,12 @@ func get_input(): if Input.is_action_pressed("forward"): dir += -global_transform.basis.z + if is_climbing: + dir += global_transform.basis.y if Input.is_action_pressed("backward"): dir += global_transform.basis.z + if is_climbing: + dir += -global_transform.basis.y if Input.is_action_pressed("left"): dir += -global_transform.basis.x if Input.is_action_pressed("right"): @@ -35,18 +45,22 @@ func get_input(): dir = dir.normalized() - #Pull X and Z values from directional input. Velocity.y will be handled in physics loop + #Pull X and Z values from directional input. Velocity.y will be handled in physics loop unless climbing. + + if is_climbing: + velocity.y = lerp(velocity.y, dir.y * walk_speed, accel) velocity.x = lerp(velocity.x, dir.x * walk_speed, accel) velocity.z = lerp(velocity.z, dir.z * walk_speed, accel) func handle_movement(): #Apply gravity - velocity.y += gravity - if velocity.y < term_velocity: - velocity.y = term_velocity + if !is_climbing: + velocity.y += gravity + if velocity.y < term_velocity: + velocity.y = term_velocity - velocity = move_and_slide(velocity, Vector3.UP, false, 4, PI/4, false) + velocity = move_and_slide(velocity, Vector3.UP, true, 4, PI/4, false) func _input(event): #Handle mouse movement for camera @@ -55,4 +69,29 @@ func _input(event): camera.rotate_x(-event.relative.y * Settings.mouse_sens) camera.rotation.x = clamp(camera.rotation.x, -1.2, 1.2) +func handle_jumping(): + if Input.is_action_just_pressed("jump") and is_on_floor(): + velocity.y = jump_strength + +func handle_collision(): + for index in get_slide_count(): + var collision = get_slide_collision(index) + var collider = collision.collider + if (collider.get_class() == "RigidBody"): + var col_force_vec = -collision.normal * inertia # rotate the force along collision normal + # collision pos + # > RigidBody.add_force(force, pos) > The position uses the rotation of the global coordinate system, but is centered at the object's origin. + # > KinematicCollision.position() > The point of collision, in global coordinates. + # So to add force at collision position, substract colliders pos from collision.position + var col_pos = collision.position - collider.transform.origin + collider.add_force(col_force_vec, col_pos) + + +func _on_ladder_detector_body_entered(body): + if body.is_in_group("ladder"): + is_climbing = true + +func _on_ladder_detector_body_exited(body): + if body.is_in_group("ladder"): + is_climbing = false diff --git a/character/fps_controller/fps_controller.tscn b/character/fps_controller/fps_controller.tscn index d187121..d1bf6be 100644 --- a/character/fps_controller/fps_controller.tscn +++ b/character/fps_controller/fps_controller.tscn @@ -1,9 +1,13 @@ -[gd_scene load_steps=3 format=2] +[gd_scene load_steps=4 format=2] [ext_resource path="res://character/fps_controller/fps_controller.gd" type="Script" id=1] [sub_resource type="CapsuleShape" id=1] radius = 0.3 +height = 2.0 + +[sub_resource type="CapsuleShape" id=2] +radius = 0.374691 [node name="fps_controller" type="KinematicBody"] script = ExtResource( 1 ) @@ -13,9 +17,18 @@ transform = Transform( 1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0 shape = SubResource( 1 ) [node name="Camera" type="Camera" parent="."] -transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.796127, 0 ) +transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30045, 0 ) far = 5000.0 [node name="RayCast" type="RayCast" parent="Camera"] cast_to = Vector3( 0, 0, -3 ) collision_mask = 2 + +[node name="ladder_detector" type="Area" parent="."] + +[node name="CollisionShape" type="CollisionShape" parent="ladder_detector"] +transform = Transform( 1, 0, 0, 0, -1, -8.74228e-08, 0, 8.74228e-08, -1, 0, 0.0169024, -0.58521 ) +shape = SubResource( 2 ) + +[connection signal="body_entered" from="ladder_detector" to="." method="_on_ladder_detector_body_entered"] +[connection signal="body_exited" from="ladder_detector" to="." method="_on_ladder_detector_body_exited"] |