giants-godot/player/TPSController.gd

135 lines
4.1 KiB
GDScript

extends Spatial
class_name TPSController
export var character_scene: PackedScene
var character: Character
var is_in_menu: bool = false
onready var cam = $Head/SpringArm/Camera
onready var default_camera_trans = cam.transform
export var FOV = 80.0
export var HUD_scene: PackedScene
onready var HUD: Control
onready var debug_label = $DebugText
var mouse_axis: Vector2 = Vector2.ZERO
export var mouse_sensitivity = 10.0
onready var head = $Head
func _ready():
cam.fov = FOV
if not Engine.editor_hint:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
HUD = HUD_scene.instance()
add_child(HUD)
character = character_scene.instance()
add_child(character)
func get_target() -> Dictionary:
var weapon = character.current_weapon
var ray_from = cam.global_transform.origin
var ray_to = cam.global_transform.basis.z * -20000
var space_state = get_world().direct_space_state
var result = space_state.intersect_ray(ray_from, ray_to, [self, weapon])
if not result:
return Globals.create_empty_collision_dictionnary(ray_to)
else:
return result
func _physics_process(delta):
if Engine.editor_hint:
return
debug_label.text = "FPS: " + str(Engine.get_frames_per_second()) + " | Objects: " + str(Performance.get_monitor(Performance.OBJECT_COUNT))
# calculate and export target
var target = get_target()
Globals.target_position = target
# cursor change
if target["collider"] and target["collider"] is Entity:
HUD.get_node("cursor_no_enemy").visible = false
HUD.get_node("cursor_enemy").visible = true
else:
HUD.get_node("cursor_enemy").visible = false
HUD.get_node("cursor_no_enemy").visible = true
# update camera
if character.sprinting:
cam.set_fov(lerp(cam.fov, FOV * 1.2, delta * 8))
else:
cam.set_fov(lerp(cam.fov, FOV, delta * 8))
head.global_transform.origin = character.global_transform.origin
func camera_rotation() -> void:
if mouse_axis.length() > 0:
var _smoothness := 80
# Get mouse delta
var horizontal: float = -(mouse_axis.x * mouse_sensitivity) / _smoothness
var vertical: float = -(mouse_axis.y * mouse_sensitivity) / _smoothness
mouse_axis = Vector2.ZERO
character.rotate_y(deg2rad(horizontal))
var temp_rot: Vector3 = head.rotation_degrees
temp_rot += Vector3(vertical, horizontal, 0)
temp_rot.x = clamp(temp_rot.x, -75, 75)
head.rotation_degrees = temp_rot
func _input(event: InputEvent) -> void:
if Engine.editor_hint:
return
if not Globals.process_3d_inputs:
return
if event is InputEventMouseMotion:
mouse_axis = event.relative
if Input.is_action_pressed("camera_front"):
var camera_front_transform = default_camera_trans
camera_front_transform = default_camera_trans.translated(Vector3(5, 0, -5))
camera_front_transform = camera_front_transform.rotated(Vector3.UP, deg2rad(-180))
cam.transform = camera_front_transform
if Input.is_action_just_released("camera_front"):
cam.transform = default_camera_trans
if Input.is_action_just_pressed("inp_fire"):
character.fire_pressed()
if Input.is_action_just_released("inp_fire"):
character.fire_released()
if Input.is_action_just_pressed("weapon_forward"):
character.switch_next_weapon_slot()
if Globals.process_3d_inputs and Input.is_action_just_pressed("ui_cancel"):
var ingame_menu = preload("res://ui/menus/ingame_menu.tscn").instance()
Input.set_mouse_mode(Input.MOUSE_MODE_CONFINED)
add_child(ingame_menu)
ingame_menu.connect("tree_exited", self, "_ingamemenu_closed")
Globals.process_3d_inputs = false
func _ingamemenu_closed():
Globals.process_3d_inputs = true
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
func _process(_delta: float) -> void:
if Engine.editor_hint:
return
if Globals.process_3d_inputs:
camera_rotation()
update_hud()
func update_hud() -> void:
for weapon in character.weapons:
var weapon_slot = character.get_weapon_slot(weapon)
var hud_weapon_slot = HUD.find_node("Weapon%s" % weapon_slot)
var weapon_icon: Control = weapon.ui_icon
if not weapon_icon.get_parent() == hud_weapon_slot:
hud_weapon_slot.add_child(weapon_icon)
if character.current_weapon == weapon:
hud_weapon_slot.get_node("selected").visible = true
else:
hud_weapon_slot.get_node("selected").visible = false