96 lines
2.0 KiB
GDScript
96 lines
2.0 KiB
GDScript
|
|
extends KinematicBody
|
|
|
|
# member variables here, example:
|
|
# var a=2
|
|
# var b="textvar"
|
|
|
|
var g = -9.8
|
|
var vel = Vector3()
|
|
const MAX_SPEED = 5
|
|
const JUMP_SPEED = 7
|
|
const ACCEL= 2
|
|
const DEACCEL= 4
|
|
const MAX_SLOPE_ANGLE = 30
|
|
|
|
func _fixed_process(delta):
|
|
|
|
var dir = Vector3() #where does the player intend to walk to
|
|
var cam_xform = get_node("target/camera").get_global_transform()
|
|
|
|
if (Input.is_action_pressed("move_forward")):
|
|
dir+=-cam_xform.basis[2]
|
|
if (Input.is_action_pressed("move_backwards")):
|
|
dir+=cam_xform.basis[2]
|
|
if (Input.is_action_pressed("move_left")):
|
|
dir+=-cam_xform.basis[0]
|
|
if (Input.is_action_pressed("move_right")):
|
|
dir+=cam_xform.basis[0]
|
|
|
|
dir.y=0
|
|
dir=dir.normalized()
|
|
|
|
vel.y+=delta*g
|
|
|
|
var hvel = vel
|
|
hvel.y=0
|
|
|
|
var target = dir*MAX_SPEED
|
|
var accel
|
|
if (dir.dot(hvel) >0):
|
|
accel=ACCEL
|
|
else:
|
|
accel=DEACCEL
|
|
|
|
hvel = hvel.linear_interpolate(target,accel*delta)
|
|
|
|
vel.x=hvel.x;
|
|
vel.z=hvel.z
|
|
|
|
var motion = move(vel*delta)
|
|
|
|
var on_floor = false
|
|
var original_vel = vel
|
|
|
|
|
|
var floor_velocity=Vector3()
|
|
|
|
var attempts=4
|
|
|
|
while(is_colliding() and attempts):
|
|
var n=get_collision_normal()
|
|
|
|
if ( rad2deg(acos(n.dot( Vector3(0,1,0)))) < MAX_SLOPE_ANGLE ):
|
|
#if angle to the "up" vectors is < angle tolerance
|
|
#char is on floor
|
|
floor_velocity=get_collider_velocity()
|
|
on_floor=true
|
|
|
|
motion = n.slide(motion)
|
|
vel = n.slide(vel)
|
|
if (original_vel.dot(vel) > 0):
|
|
#do not allow to slide towads the opposite direction we were coming from
|
|
motion=move(motion)
|
|
if (motion.length()<0.001):
|
|
break
|
|
attempts-=1
|
|
|
|
if (on_floor and floor_velocity!=Vector3()):
|
|
move(floor_velocity*delta)
|
|
|
|
if (on_floor and Input.is_action_pressed("jump")):
|
|
vel.y=JUMP_SPEED
|
|
|
|
var crid = get_node("../elevator1").get_rid()
|
|
# print(crid," : ",PS.body_get_state(crid,PS.BODY_STATE_TRANSFORM))
|
|
|
|
func _ready():
|
|
# Initalization here
|
|
set_fixed_process(true)
|
|
pass
|
|
|
|
|
|
func _on_tcube_body_enter( body ):
|
|
get_node("../ty").show()
|
|
pass # replace with function body
|