Godot Version
3.5
Question
I’m having a problem with the force_raycast_update() function in my game. When I use force_raycast_update(), the player character, who is a Rigidbody in zero gravity, seems to stop moving. However, functions bound to other buttons still work correctly. Without force_raycast_update(), the laser passes through the meteorite without affecting it.
Player
extends RigidBody2D
var speed = 0
var maxSpeed = 800
var acceleration = 15
var direction_vector = Vector2()
var target_angle = 0
var screen_size = Vector2()
onready var ship_particle = get_node("Particles2D")
func _process(delta):
position.x = wrapf(position.x, -50, screen_size.x+50)
position.y = wrapf(position.y, -50, screen_size.y+50)
var mouse_position = get_viewport().get_mouse_position()
direction_vector = mouse_position - self.position
target_angle = direction_vector.angle()+ PI / 2
var current_angle = rotation
var angle_difference = target_angle - current_angle
angle_difference = wrapf(angle_difference, -PI, PI)
set_angular_velocity(angle_difference * 10)
if Input.is_action_pressed("rcm"):
if speed < maxSpeed:
speed += acceleration
self.applied_force = direction_vector.normalized() * speed
ship_particle.emitting = true
func _input(event):
if event is InputEventMouseButton:
if event.button_index == BUTTON_RIGHT and not event.pressed:
speed = 0
self.applied_force = direction_vector.normalized() * speed
ship_particle.emitting = false
func _on_Player_ready():
screen_size = get_viewport().get_size()
LaserGun
extends RayCast2D
var is_casting = false setget set_is_casting
onready var laser_line = get_node("Line2D")
onready var laser_tween = get_node("Tween")
onready var laser_particle = get_node("Particles2D")
func _ready():
set_physics_process(false)
laser_line.points[1] = Vector2.ZERO
func _input(event):
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT and not event.pressed and is_casting:
self.is_casting = false
set_physics_process(is_casting)
laser_particle.emitting = is_casting
if event.button_index == BUTTON_LEFT and event.pressed and not is_casting:
self.is_casting = true
set_physics_process(is_casting)
laser_particle.emitting = is_casting
func _physics_process(delta):
var castPoint = cast_to
force_raycast_update()
if is_colliding():
castPoint = to_local(get_collision_point())
laser_line.points[1] = castPoint
func set_is_casting(cast: bool):
is_casting = cast
if is_casting:
appear()
else:
disappear()
func appear():
laser_tween.stop_all()
laser_tween.interpolate_property(laser_line, "width", 0, 3.0, 0.2)
laser_tween.start()
func disappear():
laser_tween.stop_all()
laser_tween.interpolate_property(laser_line, "width", 3.0, 0, 0.1)
laser_tween.start()