mirror of
https://github.com/Relintai/pandemonium_demo_projects.git
synced 2024-12-21 13:56:50 +01:00
62 lines
1.7 KiB
GDScript
62 lines
1.7 KiB
GDScript
extends KinematicBody
|
|
|
|
const MAX_SPEED = 3
|
|
const JUMP_SPEED = 5
|
|
const ACCELERATION = 2
|
|
const DECELERATION = 4
|
|
|
|
onready var camera = $Target/Camera
|
|
onready var gravity = -ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
onready var start_position = translation
|
|
var velocity: Vector3
|
|
|
|
func _physics_process(delta):
|
|
if Input.is_action_just_pressed("exit"):
|
|
get_tree().quit()
|
|
if Input.is_action_just_pressed("reset_position"):
|
|
translation = start_position
|
|
|
|
var dir = Vector3()
|
|
dir.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
|
dir.z = Input.get_action_strength("move_back") - Input.get_action_strength("move_forward")
|
|
|
|
# Get the camera's transform basis, but remove the X rotation such
|
|
# that the Y axis is up and Z is horizontal.
|
|
var cam_basis = camera.global_transform.basis
|
|
var basis = cam_basis.rotated(cam_basis.x, -cam_basis.get_euler().x)
|
|
dir = basis.xform(dir)
|
|
|
|
# Limit the input to a length of 1. length_squared is faster to check.
|
|
if dir.length_squared() > 1:
|
|
dir /= dir.length()
|
|
|
|
# Apply gravity.
|
|
velocity.y += delta * gravity
|
|
|
|
# Using only the horizontal velocity, interpolate towards the input.
|
|
var hvel = velocity
|
|
hvel.y = 0
|
|
|
|
var target = dir * MAX_SPEED
|
|
var acceleration
|
|
if dir.dot(hvel) > 0:
|
|
acceleration = ACCELERATION
|
|
else:
|
|
acceleration = DECELERATION
|
|
|
|
hvel = hvel.linear_interpolate(target, acceleration * delta)
|
|
|
|
# Assign hvel's values back to velocity, and then move.
|
|
velocity.x = hvel.x
|
|
velocity.z = hvel.z
|
|
velocity = move_and_slide(velocity, Vector3.UP)
|
|
|
|
# Jumping code. is_on_floor() must come after move_and_slide().
|
|
if is_on_floor() and Input.is_action_pressed("jump"):
|
|
velocity.y = JUMP_SPEED
|
|
|
|
|
|
func _on_tcube_body_entered(body):
|
|
if body == self:
|
|
get_node("WinText").show()
|