summaryrefslogtreecommitdiffstats
path: root/character
diff options
context:
space:
mode:
authordusoleil <howcansocksbereal@gmail.com>2022-09-15 02:34:38 -0400
committerdusoleil <howcansocksbereal@gmail.com>2022-09-15 02:34:38 -0400
commit5cb75d2c75f27cae565cc77db798ed832b9aaa1f (patch)
tree2dcd2c678eadc0360d9c9681ca63240e576278ae /character
parent134440ace62915ebab3b2e1252ab33ccff467c40 (diff)
parentecf88f1b1a8448bf4a0d5950dc7a9f4db4de7162 (diff)
downloadgame_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 '')
-rw-r--r--character/fps_controller/fps_controller.gd51
-rw-r--r--character/fps_controller/fps_controller.tscn17
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"]