system
February 15, 2023, 9:04pm
1
Attention
Topic was automatically imported from the old Question2Answer platform.
Asked By
bobTheSturmmann
extends KinematicBody
export var speed = 2.5
export var acceleration = 25
export var gravity = 35
export var jump_strength = 5
export var sensitivity = 0.1
onready var head = $Head
onready var hand = $AnimatedSprite
onready var interactRay = $Head/InteractRayCast
onready var light = $OmniLight
onready var sword = $Head/sword
onready var swordAnim = $SwordAnimationPlayer
var look_rot = Vector3.ZERO
var move_dir = Vector3.ZERO
var velocity = Vector3.ZERO
var max_angle = 0
var min_angle = 0
var haveLamp = null
var haveSword = null
var onHand = null
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
characterAnimations()
light.visible = false
sword.visible = false
haveLamp = false
haveSword = false
onHand = null
func _physics_process(delta):
head.rotation_degrees.x = look_rot.x
rotation_degrees.y = look_rot.y
characterAnimations()
if not is_on_floor():
velocity.y -= gravity * delta
elif Input.is_action_just_pressed("jump"):
velocity.y = jump_strength
move_dir = Vector3(
Input.get_action_strength("right") - Input.get_action_strength("left")
,0,
Input.get_action_strength("backward") - Input.get_action_strength("forward")
).normalized().rotated(Vector3.UP, rotation.y)
velocity.x = lerp(velocity.x, move_dir.x * speed, acceleration * delta)
velocity.z = lerp(velocity.z, move_dir.z * speed, acceleration * delta)
velocity = move_and_slide(velocity, Vector3.UP)
func _input(event):
if event is InputEventMouseMotion:
look_rot.y -= (event.relative.x * sensitivity)
look_rot.x -= (event.relative.y * sensitivity)
look_rot.x = clamp(look_rot.x, min_angle, max_angle)
func characterAnimations():
if haveLamp == true and onHand == "lamp":
hand.visible = true
if Input.is_action_pressed("backward") or Input.is_action_pressed("forward") or Input.is_action_pressed("left") or Input.is_action_pressed("right"):
hand.play("Walk")
else:
hand.play("Idle")
else:
hand.visible = false
if haveSword == true and onHand == "sword":
sword.visible = true
if Input.is_action_pressed("backward") or Input.is_action_pressed("forward") or Input.is_action_pressed("left") or Input.is_action_pressed("right"):
if swordAnim.current_animation != "Attack-1":
swordAnim.play("Walk")
if Input.is_action_pressed("forward"):
swordAnim.playback_speed = -1
else:
swordAnim.playback_speed = 1
else:
if swordAnim.current_animation != "Attack-1":
swordAnim.play("Idle")
else:
sword.visible = false
if haveSword == true and onHand == "sword":
if Input.is_action_just_pressed("attack"):
swordAnim.current_animation = "Attack-1"
if Input.is_action_just_pressed("scroll"):
if onHand == "sword":
if haveLamp == true:
onHand = "lamp"
elif onHand == "lamp":
if haveSword == true:
onHand = "sword"
func _on_Lamp_lampTaken():
interactRay.set_prompt()
light.visible = true
haveLamp = true
onHand = "lamp"
func _on_Sword_pickedUpSword():
interactRay.set_prompt()
haveSword = true
onHand = "sword"
sword.visible = true
system
February 15, 2023, 11:15pm
2
Reply From:
Gluon
I would suggest either look into a state machine (which given the complexity of your code around animations here would probably be the best idea) or else just use a boolean guard.
If you link the attack button to a function which changes a boolean to true to say that the character is attacking and then have an if check so that the code which starts the walking animation only works when that boolean is false you wont get the override happening. After that you can link the animation finished signal to a function to change the boolean to false again so the walking animation will work again.