Skip to content

Commit

Permalink
Add a parent CameraState class to get autocompletion and type checks
Browse files Browse the repository at this point in the history
  • Loading branch information
NathanLovato committed Nov 28, 2019
1 parent 27c77f8 commit e8f87cd
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 22 deletions.
6 changes: 6 additions & 0 deletions project.godot
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ _global_script_classes=[ {
"language": "GDScript",
"path": "res://src/Player/Camera/CameraRig.gd"
}, {
"base": "State",
"class": "CameraState",
"language": "GDScript",
"path": "res://src/Player/Camera/CameraState.gd"
}, {
"base": "Spatial",
"class": "Mannequiny",
"language": "GDScript",
Expand Down Expand Up @@ -41,6 +46,7 @@ _global_script_classes=[ {
} ]
_global_script_class_icons={
"CameraRig": "",
"CameraState": "",
"Mannequiny": "",
"Player": "",
"PlayerState": "",
Expand Down
1 change: 1 addition & 0 deletions src/Player/Camera/CameraRig.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ signal aim_fired(target_vector)
onready var camera: InterpolatedCamera = $InterpolatedCamera
onready var spring_arm: SpringArm = $SpringArm
onready var aim_ray: RayCast = $AimRay
onready var aim_target: Sprite3D = $AimTarget

var player: KinematicBody

Expand Down
10 changes: 10 additions & 0 deletions src/Player/Camera/CameraState.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
extends State
class_name CameraState


var camera_rig: CameraRig


func _ready() -> void:
yield(owner, "ready")
camera_rig = owner
10 changes: 5 additions & 5 deletions src/Player/Camera/States/Aim.gd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
extends State
extends CameraState
"""
Logic state for the camera where configuration are made to the camera to set
the field of view, position offset (over the shoulder), etc.
Expand All @@ -15,16 +15,16 @@ func unhandled_input(event: InputEvent) -> void:
_state_machine.transition_to("Camera/Default")
elif event.is_action_pressed("action"):
_state_machine.transition_to("Camera/Default")
owner.emit_signal("aim_fired",
owner.aim_ray.get_collision_point() if owner.aim_ray.is_colliding()
else owner.get_global_transform().origin)
camera_rig.emit_signal("aim_fired",
camera_rig.aim_ray.get_collision_point() if camera_rig.aim_ray.is_colliding()
else camera_rig.get_global_transform().origin)
else:
_parent.unhandled_input(event)


func physics_process(delta: float) -> void:
_parent.physics_process(delta)
_parent.aim_target.update(owner.aim_ray)
_parent.aim_target.update(camera_rig.aim_ray)


func enter(msg: Dictionary = {}) -> void:
Expand Down
33 changes: 17 additions & 16 deletions src/Player/Camera/States/Camera.gd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
extends State
extends CameraState
"""
Parent state for all camera based states for the Camera. Handles input based on
mouse/gamepad and movement and configuration based on which state we're using.
Expand All @@ -9,7 +9,7 @@ logic contained in a central location while being easily modifiable.
"""


onready var aim_target: Sprite3D = owner.get_node("AimTarget")
onready var aim_target: Sprite3D

export var is_y_inverted: = true
export var fov_default: = 70.0
Expand All @@ -26,10 +26,11 @@ var _is_aiming: = false
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
yield(owner, "ready")
aim_target = camera_rig.aim_target


func physics_process(delta: float) -> void:
owner.global_transform.origin = owner.player.global_transform.origin + owner._position_start
camera_rig.global_transform.origin = camera_rig.player.global_transform.origin + camera_rig._position_start

var look_direction: = get_look_direction()
var move_direction: = get_move_direction()
Expand All @@ -44,12 +45,12 @@ func physics_process(delta: float) -> void:
if not is_moving_towards_camera and not _is_aiming:
auto_rotate(move_direction)

owner.rotation.y = wrapf(owner.rotation.y, -PI, PI)
camera_rig.rotation.y = wrapf(camera_rig.rotation.y, -PI, PI)

if owner.camera.fov != _fov_current:
owner.camera.fov = lerp(owner.camera.fov, _fov_current, 0.05)
if camera_rig.camera.fov != _fov_current:
camera_rig.camera.fov = lerp(camera_rig.camera.fov, _fov_current, 0.05)

owner.spring_arm.translation = lerp(owner.spring_arm.translation, owner._position_start + _offset, 0.05)
camera_rig.spring_arm.translation = lerp(camera_rig.spring_arm.translation, camera_rig._position_start + _offset, 0.05)


func enter(msg: Dictionary = {}) ->void:
Expand All @@ -59,13 +60,13 @@ func enter(msg: Dictionary = {}) ->void:


func auto_rotate(move_direction: Vector3) -> void:
var offset: float = owner.player.rotation.y - owner.rotation.y
var offset: float = camera_rig.player.rotation.y - camera_rig.rotation.y
var target_angle: float = (
owner.player.rotation.y - 2 * PI if offset > PI
else owner.player.rotation.y + 2 * PI if offset < -PI
else owner.player.rotation.y
camera_rig.player.rotation.y - 2 * PI if offset > PI
else camera_rig.player.rotation.y + 2 * PI if offset < -PI
else camera_rig.player.rotation.y
)
owner.rotation.y = lerp(owner.rotation.y, target_angle, 0.015)
camera_rig.rotation.y = lerp(camera_rig.rotation.y, target_angle, 0.015)


func unhandled_input(event: InputEvent) -> void:
Expand All @@ -83,12 +84,12 @@ func unhandled_input(event: InputEvent) -> void:

func process_camera_input(input: Vector2) -> void:
if input.x != 0:
owner.rotation.y -= input.x
camera_rig.rotation.y -= input.x
if input.y != 0:
var angle: = input.y
owner.rotation.x -= angle * -1.0 if is_y_inverted else angle
owner.rotation.x = clamp(owner.rotation.x, -0.75, 1.25)
owner.rotation.z = 0
camera_rig.rotation.x -= angle * -1.0 if is_y_inverted else angle
camera_rig.rotation.x = clamp(camera_rig.rotation.x, -0.75, 1.25)
camera_rig.rotation.z = 0


"""
Expand Down
2 changes: 1 addition & 1 deletion src/Player/Camera/States/Default.gd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
extends State
extends CameraState
"""
Logic state for the camera - implies no modification to the camera settings.
"""
Expand Down

0 comments on commit e8f87cd

Please sign in to comment.