208 lines
5.4 KiB
GDScript
208 lines
5.4 KiB
GDScript
extends Spatial
|
|
|
|
onready var character = $character
|
|
var cam = {
|
|
"speed":10,
|
|
"current_speed":20,
|
|
"mode":2,
|
|
}
|
|
var action = {
|
|
"air_speed":0,
|
|
"climb":false,
|
|
}
|
|
|
|
var direction = Vector3()
|
|
var direction2 = Vector3()
|
|
var velocity = Vector3()
|
|
var gravity = -27
|
|
var linear_speed = 6
|
|
var jump_height = 12
|
|
var walk_speed = 8
|
|
var run_speed = 16
|
|
var speed = 8
|
|
var fpv_camera_angle = 0
|
|
var fpv_mouse_sensitivity = 0.3
|
|
var tpv_camera_speed = 0.001
|
|
|
|
func _ready():
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
OS.set_window_position(Vector2(0,0))
|
|
|
|
|
|
func rotating(dir):
|
|
var a = atan2(dir.x* -1, dir.z* -1)
|
|
var rot = character.get_rotation()
|
|
if abs(rot.y-a) > PI:
|
|
var m = PI * 2
|
|
var d = fmod(a-rot.y,m)
|
|
a = rot.y + (fmod(2 * d,m)-d)*0.2
|
|
else:
|
|
a = lerp(rot.y,a,0.1)
|
|
character.rotation.y = a
|
|
|
|
func _input(event):
|
|
if Input.is_action_just_pressed("ui_cancel"):
|
|
get_tree().quit()
|
|
if event is InputEventMouseMotion:
|
|
if cam.mode == 1:
|
|
# == First player view
|
|
rotate_y(deg2rad(-event.relative.x * fpv_mouse_sensitivity))
|
|
var change = -event.relative.y * fpv_mouse_sensitivity
|
|
if change + fpv_camera_angle < 90 and change + fpv_camera_angle > -90:
|
|
$head/Camera.rotate_x(deg2rad(change))
|
|
fpv_camera_angle += change
|
|
elif cam.mode == 2:
|
|
# == Third player view
|
|
$head.rotate_y(-event.relative.x * tpv_camera_speed)
|
|
$head/tpv.rotate_x(-event.relative.y * tpv_camera_speed)
|
|
|
|
|
|
func _process(delta):
|
|
direction = Vector3()
|
|
var aim = $head/tpv.get_global_transform().basis
|
|
var walk = false
|
|
var run = false
|
|
if Input.is_key_pressed(KEY_ESCAPE):
|
|
get_tree().quit()
|
|
if Input.is_key_pressed(KEY_W):
|
|
direction -= aim.z
|
|
walk = true
|
|
if Input.is_key_pressed(KEY_S):
|
|
direction += aim.z
|
|
walk = true
|
|
if Input.is_key_pressed(KEY_A):
|
|
direction -= aim.x
|
|
walk = true
|
|
if Input.is_key_pressed(KEY_D):
|
|
direction += aim.x
|
|
walk = true
|
|
if Input.is_key_pressed(KEY_SHIFT):
|
|
run = true
|
|
direction = direction.normalized()
|
|
if walk and action.climb == false:
|
|
direction2 = direction
|
|
|
|
|
|
#===On ground
|
|
if character.is_on_floor():
|
|
action.air_speed = 0
|
|
action.walljump = Vector3()
|
|
|
|
#Jump
|
|
if Input.is_key_pressed(KEY_SPACE) and character.cur_anim != "kong":#Input.is_action_just_pressed("jump"):
|
|
velocity.y = jump_height
|
|
character.animation("jump")
|
|
#Walk
|
|
elif walk:
|
|
rotating(direction)
|
|
if velocity.y < 0.1:
|
|
if run:
|
|
speed = run_speed
|
|
character.animation("run")
|
|
if Input.is_key_pressed(KEY_E):
|
|
character.cur_anim = "dive"
|
|
else:
|
|
speed = walk_speed
|
|
character.animation("walk")
|
|
if cam.current_speed > 2:
|
|
cam.current_speed -= delta*5
|
|
#idle
|
|
else:
|
|
character.animation("stand")
|
|
if cam.current_speed < cam.speed:
|
|
cam.current_speed += delta*10
|
|
else:
|
|
#camera
|
|
if cam.current_speed > 2:
|
|
cam.current_speed -= delta*10
|
|
|
|
#moves===========
|
|
|
|
|
|
#climb
|
|
if run == false and action.climb == false and $character/climb1.is_colliding() and velocity.y <= 0 and $character/ground.is_colliding() == false:
|
|
var p = $character/climb1.get_collision_point()
|
|
$character/climb2.global_transform.origin.y=p.y
|
|
$character/climb2.force_update_transform()
|
|
$character/climb2.force_raycast_update()
|
|
if $character/climb2.is_colliding() and $character/climb1.get_collider() == $character/climb2.get_collider():
|
|
character.animation("climb")
|
|
speed = walk_speed
|
|
action.climb = true
|
|
p = $character/climb2.get_collision_point()
|
|
var n = $character/climb2.get_collision_normal()*-1
|
|
direction = n
|
|
direction2 = n
|
|
character.global_transform.origin = p + (character.global_transform.origin-$character/armhook.global_transform.origin)
|
|
#walljump
|
|
elif $character/climb2.is_colliding() and action.climb == false and direction2 != Vector3() and Input.is_key_pressed(KEY_SPACE) and velocity.y < 0 and $character/ground.is_colliding() == false:
|
|
var d = todir(direction)
|
|
if d != action.walljump:
|
|
speed = walk_speed
|
|
action.air_speed = 1
|
|
direction = direction2 *-20
|
|
velocity.y = jump_height
|
|
rotating(direction)
|
|
character.animation("jump")
|
|
action.walljump = d
|
|
#jump from climb
|
|
elif Input.is_action_just_pressed("jump"):
|
|
if action.climb:
|
|
speed = walk_speed
|
|
action.climb = false
|
|
velocity.y = jump_height
|
|
character.animation("jump")
|
|
direction*=20
|
|
rotating(direction2)
|
|
|
|
#moves===========
|
|
|
|
|
|
#climb
|
|
if action.climb:
|
|
velocity = Vector3()
|
|
if run:
|
|
action.climb = false
|
|
var n = $character/climb2.get_collision_normal()
|
|
var r = Vector2(n.x,n.z).angle()
|
|
if Input.is_key_pressed(KEY_A) and $character/armhook/armclimbL.is_colliding():
|
|
direction = Vector3(-sin(r),0,cos(r))*3
|
|
elif Input.is_key_pressed(KEY_D) and $character/armhook/armclimbR.is_colliding():
|
|
direction = Vector3(sin(r),0,-cos(r))*3
|
|
else:
|
|
return
|
|
else:
|
|
#move & gravity
|
|
velocity.y += gravity * delta
|
|
var tv = velocity
|
|
if action.air_speed == 0 or action.air_speed == 1:
|
|
action.air_speed *=2
|
|
tv = velocity.linear_interpolate(direction * speed,6 * delta)
|
|
else:
|
|
tv = velocity.linear_interpolate(direction * speed,1 * delta)
|
|
|
|
velocity.x = tv.x
|
|
velocity.z = tv.z
|
|
velocity = character.move_and_slide(velocity,Vector3(0,1,0))
|
|
|
|
#camera
|
|
$head.transform.origin += (character.transform.origin-$head.transform.origin)/cam.current_speed
|
|
|
|
if character.transform.origin.y < -50:
|
|
character.transform.origin = Vector3(0,0,0)
|
|
|
|
func todir(a):
|
|
|
|
if a.x != 0:
|
|
a.x = a.x/abs(a.x)
|
|
else:
|
|
a.x = 0
|
|
if a.y != 0:
|
|
a.y = a.y/abs(a.y)
|
|
else:
|
|
a.y = 0
|
|
if a.z != 0:
|
|
a.z = a.z/abs(a.z)
|
|
else:
|
|
a.z = 0
|
|
return a |