![]() |
Attention | Topic was automatically imported from the old Question2Answer platform. |
![]() |
Asked By | javrocks |
Since Godot updated. My laser beam script which was working previously is no longer working. The setget function has changed or something, giving me an error on the variable is_casting.
extends RayCast2D
@export var cast_speed := 7000.0
@export var max_length := 1400
@export var growth_time := 0.1
@export var power = 30
@export var power_avail = true
@onready var casting_particles := $CastingParticles2D
@onready var collision_particles := $CollisionParticles2D
@onready var beam_particles := $BeamParticles2D
@onready var fill := $FillLine2D
@onready var line_width: float = fill.width
var is_casting := false setget set_is_casting #THIS IS NOT WORKING ANYMORE
@onready var Player = get_tree().get_root().find_child("Player", true, false)
@onready var Head = get_tree().get_root().find_child("Head", true, false)
signal burn
signal fix
signal des
func _ready() -> void:
global_position = Head.global_position + Vector2(11,-1)
fill.points[1] = Vector2.ZERO
set_physics_process(false)
func _unhandled_input(_event: InputEvent) -> void:
if Input.is_action_just_pressed("ui_left_click"):
self.is_casting = true
if Input.is_action_just_released("ui_left_click"):
$StopCasting.start()
$Reduce.stop()
$Add.start()
func _on_StopCasting_timeout():
disappear()
func _physics_process(delta: float) -> void:
target_position = (target_position + Vector2.RIGHT * cast_speed *
delta)#.limit_length(max_length)
if power == 0:
power_avail = false
else: power_avail = true
if power == 0:
disappear()
if power_avail == false:
disappear()
if power_avail == true:
cast_beam() # This fires laser
if Input.is_action_just_pressed("ui_left_click"):
$Reduce.start()
$Add.stop()
func set_is_casting(cast: bool) -> void:
is_casting = cast
if is_casting:
target_position = Vector2.ZERO
fill.points[1] = target_position
appear()
else:
collision_particles.emitting = false
disappear()
set_physics_process(true) # This fires laser
beam_particles.emitting = is_casting
casting_particles.emitting = is_casting
func cast_beam() -> void:
var cast_point := target_position
# Required, the raycast's collisions update one frame after moving otherwise, making the laser overshoot the collision point.
force_raycast_update()
if is_colliding():
cast_point = to_local(get_collision_point())
collision_particles.process_material.direction = Vector3(
get_collision_normal().x, get_collision_normal().y, 0
)
if get_collider().is_in_group("Asteroids"):
emit_signal("burn",get_collider())
if get_collider().is_in_group("Ship"):
emit_signal("burn",get_collider())
else :
emit_signal("fix")
if get_collider().is_in_group("Missile"):
emit_signal("des",get_collider())
collision_particles.emitting = is_colliding()
fill.points[1] = cast_point
collision_particles.position = cast_point
beam_particles.position = cast_point * 0.5
beam_particles.process_material.emission_box_extents.x = cast_point.length() * 0.5
func appear() -> void:
var tween = create_tween()
if tween.is_running():
tween.stop()
tween.tween_property(fill, "width", line_width, growth_time * 2)
tween.play()
func disappear() -> void:
var tween = create_tween()
if tween.is_running():
tween.stop()
tween.tween_property(fill, "width", fill.width, growth_time)
tween.play()
set_physics_process(false)
is_casting = false
beam_particles.emitting = false
casting_particles.emitting = false
collision_particles.emitting = false
emit_signal("fix")
func _on_Reduce_timeout():
if power != 0:
power = power - 1
if power == 0:
$Reduce.stop()
func _on_Add_timeout():
if power != 30:
power = power + 1
if power == 30:
$Add.stop()
power_avail = true