73 lines
2.1 KiB
GDScript3
73 lines
2.1 KiB
GDScript3
extends Node
|
|
|
|
|
|
# Declare member variables here. Examples:
|
|
# var a = 2
|
|
# var b = "text"
|
|
var door_list = {}
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
pass # Replace with function body.
|
|
|
|
func register_door(obj: Node, name, door_obj, axis, cangle, oangle, spd):
|
|
assert(obj)
|
|
assert(door_obj)
|
|
var root_name = str(obj.get_path())
|
|
if !door_list.has(root_name):
|
|
door_list[root_name] = {}
|
|
var base = door_obj.transform
|
|
door_list[root_name][name] = {}
|
|
door_list[root_name][name].obj = door_obj
|
|
door_list[root_name][name].base = base
|
|
door_list[root_name][name].axis = axis
|
|
door_list[root_name][name].cangle = cangle
|
|
door_list[root_name][name].oangle = oangle
|
|
door_list[root_name][name].cur_angle = cangle
|
|
door_list[root_name][name].speed = spd
|
|
door_list[root_name][name].active = false
|
|
door_list[root_name][name].state = 0
|
|
func open_door(obj, name):
|
|
var root_name = str(obj.get_path())
|
|
if !door_list.has(root_name):
|
|
return
|
|
door_list[root_name][name].active = true
|
|
door_list[root_name][name].state = 1
|
|
func close_door(obj, name):
|
|
var root_name = str(obj.get_path())
|
|
if !door_list.has(root_name):
|
|
return
|
|
door_list[root_name][name].active = true
|
|
door_list[root_name][name].state = 0
|
|
func is_active(obj, name):
|
|
var root_name = str(obj.get_path())
|
|
if !door_list.has(root_name):
|
|
return false
|
|
return door_list[root_name][name].active
|
|
func get_state(obj, name):
|
|
var root_name = str(obj.get_path())
|
|
if !door_list.has(root_name):
|
|
return -1
|
|
return door_list[root_name][name].state
|
|
func _process(delta):
|
|
for e in door_list.keys():
|
|
for j in door_list[e].keys():
|
|
var m = door_list[e][j]
|
|
if m.active:
|
|
var change = min(1.0, m.speed * delta)
|
|
match m.state:
|
|
0:
|
|
if abs(m.cur_angle - m.cangle) < 0.001:
|
|
m.cur_angle = m.cangle
|
|
m.active = false
|
|
else:
|
|
m.cur_angle = lerp_angle(m.cur_angle, m.cangle, change)
|
|
1:
|
|
if abs(m.cur_angle - m.oangle) < 0.001:
|
|
m.cur_angle = m.oangle
|
|
m.active = false
|
|
else:
|
|
m.cur_angle = lerp_angle(m.cur_angle, m.oangle, change)
|
|
m.obj.transform.basis = m.base.basis.rotated(m.axis, m.cur_angle)
|
|
|