CCCPaste

Godot Doom Sprite 3D Script

extends KinematicBody

export var anim_col = 0
export var speed = 7
export var gravity = 20
const ACCEL_DEFAULT = 7
const ACCEL_AIR = 1
onready var accel = ACCEL_DEFAULT

var direction = Vector3()
var velocity = Vector3()
var gravity_vec = Vector3()
var movement = Vector3()
var snap
var jump = 10

onready var sprite = $Sprite3D
onready var ani_player = $AnimationPlayer

var camera = null

func _ready():
	add_to_group("Imps")
	ani_player.play("anim_col")

func _physics_process(delta):
	follow_camera()
	jump(delta)
	move(delta)

func set_camera(c):
	camera = c
	
func follow_camera():
	if camera == null:
		return
	
	var p_fwd = -camera.global_transform.basis.z
	var fwd = global_transform.basis.z
	var left = global_transform.basis.x
	
	var l_dot = left.dot(p_fwd)
	var f_dot = fwd.dot(p_fwd)
	var row = 0
	sprite.flip_h = false
	if f_dot < -8.5:
		row = 0 # front sprite
	elif f_dot > 8.5:
		row = 4 # back sprite
	else:
		sprite.flip_h = l_dot > 0
		if abs(f_dot) < 0.3:
			row = 2 # left sprite
		elif f_dot < 0:
			row = 1 # forward left sprite
		else:
			row = 3 # back left sprite
	sprite.frame = anim_col + row * 4

func jump(delta):
	#jumping and gravity
	if is_on_floor():
		snap = -get_floor_normal()
		accel = ACCEL_DEFAULT
		gravity_vec = Vector3.ZERO
	else:
		snap = Vector3.DOWN
		accel = ACCEL_AIR
		gravity_vec += Vector3.DOWN * gravity * delta
		
	#if Input.is_action_just_pressed("jump") and is_on_floor():
	#	snap = Vector3.ZERO
	#	gravity_vec = Vector3.UP * jump

func move(delta):
	#make it move
	velocity = velocity.linear_interpolate(direction * speed, accel * delta)
	movement = velocity + gravity_vec
	
	move_and_slide_with_snap(movement, snap, Vector3.UP)