class_name MountSeat #la selle : la monture suit le joueur (position + orientation du modele), le joueur est assis a la selle, #et la camera monte progressivement a hauteur de selle. Pas de node : MountRider le cree et l'appelle chaque frame. # #les decalages (selle, hauteur de camera) sont appliques "en delta" sur visual_root et cam_holder, pour ne pas #ecraser les autres reglages de position. Tout cela est regroupe ici : si un jour ces nodes recoivent un vrai #decalage dedie (ex : un node Seat), il n'y aura que ce fichier a changer. var _player : PlayerCharacter var _visual_root : Node3D var _cam_holder : Node3D var _mount : SentPokemon = null var _profile : MountProfile = null var _seat_applied : Vector3 = Vector3.ZERO #decalage de selle actuellement ajoute a visual_root.position var _cam_rise : float = 0.0 #hauteur actuellement ajoutee a cam_holder.position.y func _init(player : PlayerCharacter, visual_root : Node3D, cam_holder : Node3D) -> void: _player = player _visual_root = visual_root _cam_holder = cam_holder func attach(mount : SentPokemon, profile : MountProfile) -> void: _mount = mount _profile = profile func detach() -> void: #le joueur retrouve sa position ; la camera redescend progressivement (update continue de tourner) _visual_root.position -= _seat_applied _seat_applied = Vector3.ZERO _mount = null _profile = null func update(delta : float, camera_follow_speed : float) -> void: var rise_target : float = 0.0 if _mount != null and is_instance_valid(_mount): #la monture suit le joueur (position + orientation du modele) _mount.global_position = _player.global_position var yaw : float = _visual_root.global_rotation.y if !SentPokemon.MODEL_FACES_PLUS_Z: yaw += PI _mount.global_rotation = Vector3(0.0, yaw, 0.0) #le joueur est assis a la selle (seat_offset est exprime dans le repere de la monture) var seat : Vector3 = _mount.global_basis * _profile.seat_offset _visual_root.position += seat - _seat_applied _seat_applied = seat rise_target = _profile.seat_offset.y #la camera monte progressivement a hauteur de selle (en delta : ne gene pas les autres reglages de hauteur) var new_rise : float = lerpf(_cam_rise, rise_target, clampf(camera_follow_speed * delta, 0.0, 1.0)) if absf(new_rise - rise_target) < 0.001: new_rise = rise_target _cam_holder.position.y += new_rise - _cam_rise _cam_rise = new_rise