extends KinematicBody ######## #### Caracteristic var pseudo = "" var color = Color( 1.0, 0.25, 0.25, 1.0 ) var gender = 1 var size = 1.0 var slot = 0 var dir = Vector3() const GRAVITY = -24.8 var vel = Vector3() const MAX_SPEED = 20 const ACCEL= 4.5 const FLY_SPEED = 7 const DEACCEL= 16 const MAX_SLOPE_ANGLE = 40 var MOUSE_SENSITIVITY = 0.05 onready var camera_rotation = $Camera_rotation_helper onready var camera = $Camera_rotation_helper/Camera onready var player_infos_billboard = $infos_spatial/character_infos_billboard onready var player_mesh = $MeshInstance onready var flashlight = $MeshInstance/Flashlight ### Caractéristiques du personnage. var douleur = 0 var trauma = 0 var oubli = 0 func set_info_billboard_position(): var above_head = $infos_spatial player_infos_billboard.get_node("label").text = self.pseudo var offset = Vector2(-(player_infos_billboard.get_size().x/2), 0) var unprojected_translation = camera.unproject_position(above_head.global_transform.xform(Vector3(0,0,0))) player_infos_billboard.rect_position = (unprojected_translation + offset) func _ready(): self.show_third_person_camera() self.set_info_billboard_position() self.update() #func _enter_tree(): # print("qsdfghjklkjhgfdsqsdfghj") # if self.get_parent().has_node( "start_position" ): # self.translation = self.get_parent().get_node( "start_position" ).translation func update( start_position = null ): if start_position: self.translation = start_position.translation self.rotation = start_position.rotation self.scale = Vector3( self.size, self.size, self.size ) # $infos_spatial.scale = Vector3( self.size, self.size, self.size ) # self.player_mesh.scale = Vector3( self.size, self.size, self.size ) self.player_mesh.get_surface_material(0).set_shader_param( "albedo", self.color ) func _process(delta): process_input(delta) process_movement(delta) set_info_billboard_position() func process_input(delta): if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: # ---------------------------------- # Walking dir = Vector3() var cam_xform = camera.get_global_transform() var input_movement_vector = Vector3() var cam_scroll = 0.0 if Input.is_action_pressed("move_up"): input_movement_vector.z += 1 if Input.is_action_pressed("move_down"): input_movement_vector.z -= 1 if Input.is_action_pressed("move_left"): input_movement_vector.x -= 1 if Input.is_action_pressed("move_right"): input_movement_vector.x += 1 input_movement_vector = input_movement_vector.normalized() dir += -cam_xform.basis.z.normalized() * input_movement_vector.z dir += cam_xform.basis.x.normalized() * input_movement_vector.x if Input.is_action_pressed("fly_up"): vel.y = FLY_SPEED elif Input.is_action_pressed("fly_down"): vel.y = -FLY_SPEED else: vel.y = 0 if Input.is_action_pressed( "ui_face_cam" ): $Camera_rotation_helper/face_camera.make_current() elif Input.is_action_just_released( "ui_face_cam" ): $Camera_rotation_helper/Camera.make_current() func process_movement(delta): if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: dir.y = 0 dir = dir.normalized() # vel.y += delta*GRAVITY var hvel = vel hvel.y = 0 var target = dir target *= 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 collision_info = move_and_collide(vel * delta) if collision_info: vel = vel.bounce(collision_info.normal) var obj = collision_info.collider if obj.is_class( "RigidBody" ): obj.sleeping = false obj.apply_impulse( collision_info.position, -collision_info.normal*delta ) if not obj.get_node( "MeshInstance" ).get_surface_material(0).get("albedo_color") == null: obj.get_node( "MeshInstance" ).get_surface_material(0).albedo_color = Color( 1, 0, 1, 1 ) self.douleur += 0.25 if self.douleur >= 100: self.trauma += 0.25 if self.trauma >= 100: self.oubli += 0.25 func _input(event): if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: if event is InputEventMouseMotion : camera_rotation.rotate_x(deg2rad(event.relative.y * MOUSE_SENSITIVITY * -1)) self.rotate_y(deg2rad(event.relative.x * MOUSE_SENSITIVITY * -1)) var camera_rot = camera_rotation.rotation_degrees camera_rot.x = clamp(camera_rot.x, -30, 30) camera_rotation.rotation_degrees = camera_rot if event is InputEventMouseButton: # to prevent the cam sliding effect when clamp limit reached. var old_x_translation = camera.translation.x var old_y_translation = camera.translation.y var cam_scroll = Vector3( 0.0, 0.0, 0.0 ) if event.button_index == BUTTON_WHEEL_UP: cam_scroll.z = -1.0 * MOUSE_SENSITIVITY if event.button_index == BUTTON_WHEEL_DOWN: cam_scroll.z = 1.0 * MOUSE_SENSITIVITY camera.translate( cam_scroll ) camera.translation.x = old_x_translation camera.translation.y = old_y_translation camera.translation.z = clamp(camera.translation.z, 0, 5) # TODO trouver pourquoi cela ne se fait plus: if Input.is_action_just_pressed("game_flashlight"): # flashlight.visible = not flashlight.visible if flashlight.is_visible_in_tree(): flashlight.hide() else: flashlight.show() if Input.is_action_pressed( "hide_char" ): if self.visible: self.hide() else: self.show() func hide_infos(): $infos_spatial/character_infos_billboard.hide() func show_infos(): $infos_spatial/character_infos_billboard.show() ######## #### Cameras func show_third_person_camera(): $Camera_rotation_helper/Camera.make_current()