Re-implemented zooming (without division by zero) and a test implementation of stair climbing

pull/50/head
unfa 2021-05-24 21:57:19 +02:00
parent 6316952ca5
commit 43d91e2e98
3 changed files with 86 additions and 14 deletions

View File

@ -3,8 +3,26 @@ extends KinematicBody3D
@export var mouse_sensitivity := 0.35
#var speed := 15
@onready var hud = get_tree().root.find_node("HUD", true, false)
@onready var crosshair = hud.get_node("Crosshair")
@onready var head = $Head
@onready var camera = $Head/Camera
@onready var tween = $Head/Camera/Tween
@onready var ground_check = $GroundCheck
@onready var climb_tween = $ClimbTween
@onready var climb_check = $ClimbCheck
@onready var body = $Body
var base_fov = 90
var view_zoom := 1.0 :
set(zoom):
view_zoom = zoom
camera.fov = base_fov / zoom
crosshair.modulate.a = 1 - (zoom - 1)
var climb_height := 1
var direction := Vector3.ZERO
var accel := 0
@ -16,9 +34,9 @@ var accel_type := {
"water": 4
}
var speed_type := {
"ground": 15,
"air": 15,
"water": 7.5
"ground": 10,
"air": 10,
"water": 5
}
var gravity := 28
var jump := 14
@ -31,15 +49,16 @@ var snap := Vector3.ZERO
func _ready() -> void:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
view_zoom = 1.0
func aim(event) -> void:
var mouse_motion = event as InputEventMouseMotion
if mouse_motion:
rotation_degrees.y -= mouse_motion.relative.x * mouse_sensitivity
rotation_degrees.y -= mouse_motion.relative.x * mouse_sensitivity / view_zoom
var current_tilt: float = head.rotation_degrees.x
current_tilt -= mouse_motion.relative.y * mouse_sensitivity
current_tilt -= mouse_motion.relative.y * mouse_sensitivity / view_zoom
head.rotation_degrees.x = clamp(current_tilt, -90, 90)
func _input(event) -> void:
@ -50,6 +69,16 @@ func _input(event) -> void:
else:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
if Input.is_action_just_pressed("view_zoom"):
#tween.stop_all()
tween.interpolate_property(self, "view_zoom", view_zoom, 4.0, 0.5, Tween.TRANS_SINE, Tween.EASE_IN_OUT)
tween.start()
if Input.is_action_just_released("view_zoom"):
#tween.stop_all()
tween.interpolate_property(self, "view_zoom", view_zoom, 1.0, 0.25, Tween.TRANS_SINE, Tween.EASE_IN_OUT)
tween.start()
aim(event)
func _physics_process(delta):
@ -89,6 +118,37 @@ func _physics_process(delta):
slide = move_and_slide_with_snap(movement, snap, Vector3.UP)
# (stair) climbing
return 0
if get_slide_count() > 1:
var hit_wall = false
for i in range(0, get_slide_count()):
if get_slide_collision(i).position.y > global_transform.origin.y:
hit_wall = true
print("hit a wall!")
break
if not hit_wall:
print("didn't hit a wall")
else:
var climb_test_start = global_transform.translated(Vector3(0, climb_height, 0))
var climb_test_step = Vector3(0,0,-0.1).rotated(Vector3.UP, rotation.y)
if not test_move(climb_test_start, climb_test_step): # no collision
var step = climb_check.get_collision_point().y
var start = global_transform.origin.y
print("step: ", step, " start: ", start)
global_transform.origin.y = step
# var climb = start - step
# body.shape.height -= climb
# body.translation.y += climb / 2
#
# climb_tween.interpolate_property(body, "shape/height", body.shape.height, body.shape.height + climb, 1, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
# climb_tween.interpolate_property(body, "shape/translation.y", body.translation.y, body.translation.y - (climb / 2), 1, Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
# climb_tween.start()
if not is_on_floor(): # while in mid-air collisions affect momentum
velocity.x = slide.x
velocity.z = slide.z

View File

@ -3,28 +3,28 @@
[ext_resource path="res://Assets/Characters/Player.gd" type="Script" id=1]
[sub_resource type="CapsuleMesh" id=1]
radius = 0.5
mid_height = 1.3
radius = 0.4
mid_height = 0.9
[sub_resource type="CapsuleShape3D" id=2]
radius = 0.5
height = 1.3
radius = 0.4
height = 0.9
[sub_resource type="CylinderShape3D" id=3]
radius = 0.25
height = 0.5
[node name="Player" type="KinematicBody3D"]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 0 )
script = ExtResource( 1 )
[node name="Mesh" type="MeshInstance3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.852763, 0 )
mesh = SubResource( 1 )
surface_material_override/0 = null
script = null
[node name="Head" type="Node3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.45276, 0 )
script = null
[node name="Camera" type="Camera3D" parent="Head"]
@ -36,18 +36,30 @@ script = null
[node name="Hand" type="Node3D" parent="Head/Camera"]
script = null
[node name="Tween" type="Tween" parent="Head/Camera"]
script = null
[node name="Body" type="CollisionShape3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.852763, 0 )
shape = SubResource( 2 )
script = null
[node name="Feet" type="CollisionShape3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.252763, 0 )
shape = SubResource( 3 )
disabled = true
script = null
[node name="GroundCheck" type="RayCast3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.2, 0 )
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.952763, 0 )
target_position = Vector3( 0, -1.1, 0 )
debug_shape_thickness = 5.0
script = null
[node name="ClimbCheck" type="RayCast3D" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.00905, -0.7 )
target_position = Vector3( 0, -2, 0 )
script = null
[node name="ClimbTween" type="Tween" parent="."]
script = null

View File

@ -58,7 +58,7 @@ trigger_secondary={
}
view_zoom={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"store_command":true,"alt_pressed":false,"shift_pressed":false,"meta_pressed":false,"command_pressed":false,"pressed":false,"keycode":16777240,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"store_command":true,"alt_pressed":false,"shift_pressed":false,"meta_pressed":false,"command_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"unicode":0,"echo":false,"script":null)
]
}
move_special={