I want to make a Bubble Shooter style work with Godot 4.3. First of all, I drew a virtual line to target objects from the bottom and first I created RayCast2D and then I added 2 Line2Ds as its child node. As you can see in the video below, the first line works and takes the color of the object I am targeting, but the second virtual line is active as a continuation of the first line when I target the edges, but it does not detect objects and after reaching the object, it does not take the color of the object and does not end its length. How can I solve these two problems?
Thank you for your help.
Screenshot:

My Code:

extends RayCast2D

@onready var vl = $FirstLine
@onready var dl = $SecondLine
var vector_line_length = 600
@onready var manager = $"../../../Manager"
var default_color: Color = Color(0.388,0.643,0.969,1)

func _physics_process(_delta: float) -> void:
	
	if not $"../../Control3".was_shooted or not $"../../Control4".was_shooted or not $"../../Control5".was_shooted:

		vl.visible = true
		dl.visible = true

		if $"../../Control3".can_be_shot or $"../../Control4".can_be_shot or $"../../Control5".can_be_shot:
			look_at(get_global_mouse_position())

		if is_colliding():
			if not manager.items.has(get_collider()):
				var collision_point = to_local(get_collision_point())
				vl.default_color = default_color
				dl.default_color = default_color
				vl.points[1].x = collision_point.x
				dl.position = collision_point
				dl.rotation_degrees = (rotation_degrees * 2) * -1
				dl.visible = true
			else:
				var collision_point = to_local(get_collision_point())
				if get_collider().color != null:
					vl.default_color = get_collider().color
					dl.default_color = get_collider().color
				else:
					vl.default_color = default_color
					dl.default_color = default_color
				vl.points[1].x = collision_point.x
				dl.visible = false
		else:
			vl.default_color = default_color
			vl.points[1].x = vector_line_length
			dl.visible = false
	else:
		vl.visible = false
		dl.visible = false

    xyz Is this the right way to tie the knot?
    I also use Line2D to create and color virtual lines. Is this the right way to use it or which one should it be?

      codernesim Why 3 raycasts thoug if you only have 2 rays? You can display your actual raycast rays by enabling Debug -> Visible Collision Shapes in the editor menu.

        xyz The reason I use RayCast2D as the main node is because the codes I use give errors in other nodes. That's why I used this one. Which node shape should be the right one?

        • xyz replied to this.

          codernesim Node2D should be sufficient in this case. Or just add one additional ray cast to it, not two.

            xyz I organized the nodes in this way, but the codes I use only support RayCast2D and when I make the main node Node2D, I get an error from the existing codes. Do you have any information about this?

            • xyz replied to this.

              codernesim It's code, not codes. If you just copypasted the code from somewhere without understanding what it's doing then it's unlikely you'll get very far with this. Maybe start with a simpler project.

                xyz
                No, I wrote this code and I know every detail.
                Each object randomly assigned to the scene actually has an ID number and a color.
                The image below is an example of this.
                Then this Line2D will get the color of each targeted object
                “if get_collider().color != null:
                vl.default_color = get_collider().color
                dl.default_color = get_collider().color”
                I used this line of code.
                Then I wrote code to terminate the length of this after reaching the object, and what I explained and what I wanted actually works correctly for FirstLine, but the same features are not applied for SecondLine.
                My only problem now is that the SecondLine does not detect the color of that object and the Line2D length does not end after reaching the object.
                This is the problem in general.

                My Code:

                extends RayCast2D
                
                @onready var vl = $FirstLine
                @onready var dl = $SecondLine
                var vector_line_length = 600
                @onready var manager = $"../../../Manager"
                var default_color: Color = Color(0.388,0.643,0.969,1)
                
                func _physics_process(_delta: float) -> void:
                	
                	if not $"../../Control3".was_shooted or not $"../../Control4".was_shooted or not $"../../Control5".was_shooted:
                
                		vl.visible = true
                		dl.visible = true
                
                		if $"../../Control3".can_be_shot or $"../../Control4".can_be_shot or $"../../Control5".can_be_shot:
                			look_at(get_global_mouse_position())
                
                		if is_colliding():
                			if not manager.items.has(get_collider()):
                				var collision_point = to_local(get_collision_point())
                				vl.default_color = default_color
                				dl.default_color = default_color
                				vl.points[1].x = collision_point.x
                				dl.position = collision_point
                				dl.rotation_degrees = (rotation_degrees * 2) * -1
                				dl.visible = true
                			else:
                				var collision_point = to_local(get_collision_point())
                				if get_collider().color != null:
                					vl.default_color = get_collider().color
                					dl.default_color = get_collider().color
                				else:
                					vl.default_color = default_color
                					dl.default_color = default_color
                				vl.points[1].x = collision_point.x
                				dl.visible = false
                		else:
                			vl.default_color = default_color
                			vl.points[1].x = vector_line_length
                			dl.visible = false
                	else:
                		vl.visible = false
                		dl.visible = false
                • xyz replied to this.

                  codernesim The code that sets up raycasts is what's important here. I don't see any of that in the snippets you posted. Also post a screenshot with actual rays visible. Enable them in the editor Debug menu as I mentioned earlier.

                    xyz
                    I did not write any code for Raycast, I only wrote code for Line2D. Can you give me an idea if I need to write code for Raycast.
                    Also how can I see it in the debug section?
                    FirstLine:

                    SecondLine:

                    • xyz replied to this.

                      codernesim I did not write any code for Raycast

                      Who wrote the raycast code?

                      codernesim Also how can I see it in the debug section?

                      Debug -> Visible collision shapes.

                        xyz
                        I have only this code about Raycast.
                        The screenshots you mentioned are as follows.


                          codernesim Well there you have it. There is no cast ray (red line) aligned with your second line. You need to position and rotate the raycast node so that its ray coincides with the line.

                            xyz
                            That's how it works on the stage.
                            Is there anything wrong here?
                            Also, if I need to position it, where can I do it, with code or on the stage?

                            • xyz replied to this.

                              codernesim You need to do it via code because the position/orientation of the second raycast depends on the rayhit result of the first raycast.

                                xyz
                                I understood what you wanted to say and learned more about the cause of the error.
                                So how can I solve this in the first codes I gave?
                                Do you have any idea?

                                • xyz replied to this.

                                  codernesim Start by using only 2 ray cast nodes. If one collides with a wall, set other's origin to its collision point and its look vector to the look vector of the first raycast reflected around the hit normal. Best to operate in global space to avoid local coordinate system confusion.

                                    xyz
                                    I set the Raycast2Ds as you said and the second Raycast is now active and the second Raycast is now visible and working the way I want it to.
                                    But the problem here is that now the SecondLine color added to the second Raycast is not the same as the first one.
                                    I think the second Raycast does not have the properties of the first Raycast.
                                    How can I fix this, my code is below.

                                    extends RayCast2D
                                    
                                    @onready var vl = $FirstRay
                                    @onready var dl = $SecondRay
                                    @onready var one = $FirstRay/FirstLine
                                    @onready var two = $SecondRay/SecondLine
                                    var vector_line_length = 600
                                    @onready var manager = $"../Manager"
                                    var default_color: Color = Color(0.388,0.643,0.969,1)
                                    
                                    func _physics_process(_delta: float) -> void:
                                    	
                                    	if not $"../Control3".was_shooted or not $"../Control4".was_shooted or not $"../Control5".was_shooted:
                                    
                                    		vl.visible = true
                                    		dl.visible = true
                                    
                                    		if $"../Control3".can_be_shot or $"../Control4".can_be_shot or $"../Control5".can_be_shot:
                                    			look_at(get_global_mouse_position())
                                    
                                    		if is_colliding():
                                    			if not manager.items.has(get_collider()):
                                    				var collision_point = to_local(get_collision_point())
                                    				
                                    				one.default_color = default_color
                                    				two.default_color = default_color
                                    				one.points[1].x = collision_point.x
                                    	
                                    				dl.position = collision_point
                                    				dl.rotation_degrees = (rotation_degrees * 2) * -1
                                    				dl.visible = true
                                    			else:
                                    				var collision_point = to_local(get_collision_point())
                                    				if get_collider().color != null:
                                    					one.default_color = get_collider().color
                                    					two.default_color = get_collider().color
                                    					
                                    					
                                    				else:
                                    					one.default_color = default_color
                                    					two.default_color = default_color
                                    				one.points[1].x = collision_point.x
                                    				dl.visible = false
                                    		else:
                                    			
                                    			one.default_color = default_color
                                    			one.points[1].x = vector_line_length
                                    			dl.visible = false
                                    	else:
                                    		vl.visible = false
                                    		dl.visible = false


                                    • xyz replied to this.