collisions fixed
what was happening, in reality, was that the raycast didnt have enough time to find its spot, and because functions run simultaneously in godot, it fucked up
bendn 2022-03-02
parent 807f089 · commit 838260b
-rw-r--r--InputHandler.tscn1
-rw-r--r--World.gd28
-rw-r--r--World.tscn2
-rw-r--r--dots/dot.gd27
-rw-r--r--dots/dot_template.tscn23
-rw-r--r--dots/plain_dot.gd6
-rw-r--r--entity_tracker.gd9
-rw-r--r--global_vars.gd4
-rw-r--r--input_handler.gd41
-rw-r--r--leveldata.gd2
-rw-r--r--project.godot2
-rw-r--r--utils.gd1
12 files changed, 88 insertions, 58 deletions
diff --git a/InputHandler.tscn b/InputHandler.tscn
index 2b48ba8..c01dce6 100644
--- a/InputHandler.tscn
+++ b/InputHandler.tscn
@@ -7,5 +7,6 @@ script = ExtResource( 1 )
[node name="Line2D" type="Line2D" parent="."]
default_color = Color( 0, 0, 0, 0 )
+joint_mode = 2
end_cap_mode = 2
antialiased = true
diff --git a/World.gd b/World.gd
index 8548b55..bcc3a67 100644
--- a/World.gd
+++ b/World.gd
@@ -9,39 +9,55 @@ var counted_done = 0
var h = GlobalVars.height
var w = GlobalVars.width
+
func _ready():
- spawn_dots(Leveldata.dots)
Events.connect("done_moving", self, "_on_dot_done_moving")
Events.connect("dots_done_moving", self, "_dots_done_moving")
+ Events.connect("turn_over", self, "_move_dots")
+ Events.connect("level_initialized", self, "_move_dots")
+ spawn_dots(Leveldata.dots)
-func spawn_dots(library : Array):
+
+func spawn_dots(library: Array):
var lib_size = library.size()
for wi in w:
for hi in h:
var current_row_item
- if GlobalVars.turns_used != 0: # if its the first turn, the arrays will be empty, and i dont want to pad them with " "
+ var new_dot = choose_random_dot(lib_size, library)
+ if GlobalVars.turns_used != 0: # if its the first turn, the arrays will be empty, and i dont want to pad them with " "
current_row_item = EntityTracker.rows[hi][wi]
if current_row_item != 0:
continue
- var new_dot = choose_random_dot(lib_size, library)
- EntityTracker.rows[hi].append(new_dot)
+ else:
+ EntityTracker.rows[hi].append(new_dot)
dots_holder.add_child(new_dot)
- var offset = Vector2(GlobalVars.size.x * wi, GlobalVars.size.y * hi)
+ var offset = Vector2(GlobalVars.size.x * wi, GlobalVars.size.y * hi)
var new_pos = ($Corners/Position2D.global_position + offset).snapped(GlobalVars.size)
new_dot.global_position = new_pos
Events.emit_signal("level_initialized")
+
func choose_random_dot(lib_size, library) -> Array:
randomize()
var rand_number = randi() % lib_size
var new_dot = library[rand_number].instance()
return new_dot
+
func _on_dot_done_moving():
counted_done += 1
if counted_done >= (w * h):
Events.emit_signal("dots_done_moving")
GlobalVars.state = GlobalVars.states.player_turn
+ print("dots done")
+
func _dots_done_moving():
pass
+
+
+func _move_dots():
+ for row in EntityTracker._flip_rows():
+ for Dot in row:
+ Dot.move()
+ yield(get_tree(), "idle_frame")
diff --git a/World.tscn b/World.tscn
index 3a57c6d..dc59b79 100644
--- a/World.tscn
+++ b/World.tscn
@@ -19,9 +19,9 @@ position = Vector2( 630, 770 )
[node name="Dots" type="Node2D" parent="."]
[node name="area" type="Area2D" parent="."]
+position = Vector2( 350, 840 )
collision_layer = 2
collision_mask = 0
[node name="CollisionShape2D" type="CollisionShape2D" parent="area"]
-position = Vector2( 350, 805 )
shape = SubResource( 1 )
diff --git a/dots/dot.gd b/dots/dot.gd
index 5a5066e..40c77be 100644
--- a/dots/dot.gd
+++ b/dots/dot.gd
@@ -1,33 +1,30 @@
-extends Area2D
+extends Node2D
class_name dot
-onready var dotcollider : CollisionShape2D = $dotcollider
-onready var ray : RayCast2D = $dotray
+onready var dotcollider : CollisionShape2D = $dot_collisions/dotcollider
+onready var dotcollisions : Area2D = $dot_collisions
+onready var ray : RayCast2D = $dot_collisions/dotray
+onready var dotsprite : Sprite = $dotsprite
var tween = Tween.new()
export(GlobalVars.type) var dot_type
func _ready():
- Events.connect("level_initialized", self, "move")
- Events.connect("turn_over", self, "move")
add_child(tween)
func move():
- var go_to = get_collision_point()
- print(go_to)
- tween.interpolate_property(self, "global_position",
- global_position, go_to, 2,
+ ray.force_raycast_update()
+ var go_to = Vector2(global_position.x, ray.get_collision_point().y - 35)
+ dotcollisions.global_position = go_to
+
+ tween.interpolate_property(dotsprite, "global_position",
+ dotsprite.global_position, go_to, .25,
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
tween.start()
+ yield(tween, "tween_all_completed")
Events.emit_signal("done_moving")
-func get_collision_point() -> Vector2:
- ray.enabled = true
- ray.force_raycast_update()
- ray.enabled = false
- return ray.get_collision_point()
-
func turn_off_collision():
dotcollider.disabled = true
diff --git a/dots/dot_template.tscn b/dots/dot_template.tscn
index a450aa6..d80d830 100644
--- a/dots/dot_template.tscn
+++ b/dots/dot_template.tscn
@@ -6,27 +6,24 @@
[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 35, 35 )
-[node name="dot_template" type="Area2D"]
-collision_layer = 2
-collision_mask = 0
+[node name="dot_template" type="Node2D"]
script = ExtResource( 1 )
-[node name="dotsprite" type="Sprite" parent="."]
-position = Vector2( 5, -65 )
-texture = ExtResource( 2 )
-centered = false
+[node name="dot_collisions" type="Area2D" parent="."]
+collision_layer = 2
+collision_mask = 2
-[node name="dotcollider" type="CollisionShape2D" parent="."]
-visible = false
-position = Vector2( 35, -35 )
+[node name="dotcollider" type="CollisionShape2D" parent="dot_collisions"]
shape = SubResource( 1 )
-[node name="dotray" type="RayCast2D" parent="."]
-position = Vector2( 0, -70 )
+[node name="dotray" type="RayCast2D" parent="dot_collisions"]
enabled = true
cast_to = Vector2( 0, 1000 )
collision_mask = 2
collide_with_areas = true
collide_with_bodies = false
-[connection signal="input_event" from="." to="." method="_on_dot_input"]
+[node name="dotsprite" type="Sprite" parent="."]
+texture = ExtResource( 2 )
+
+[connection signal="input_event" from="dot_collisions" to="." method="_on_dot_input"]
diff --git a/dots/plain_dot.gd b/dots/plain_dot.gd
index 56f7f77..5a02586 100644
--- a/dots/plain_dot.gd
+++ b/dots/plain_dot.gd
@@ -1,6 +1,10 @@
extends dot
+var color : Color
+
func _ready():
randomize()
var i = randi() % Leveldata.dot_colors.size()
- $dotsprite.set_self_modulate(Leveldata.dot_colors[i])
+ var n_color = Leveldata.dot_colors[i]
+ $dotsprite.set_self_modulate(n_color)
+ color = n_color
diff --git a/entity_tracker.gd b/entity_tracker.gd
index 717c764..117a28d 100644
--- a/entity_tracker.gd
+++ b/entity_tracker.gd
@@ -2,6 +2,13 @@ extends Node
var rows = []
+
func _ready():
- for w in GlobalVars.width:
+ for h in GlobalVars.height:
rows.append([])
+
+
+func _flip_rows() -> Array:
+ var new_rows = rows
+ new_rows.invert()
+ return new_rows
diff --git a/global_vars.gd b/global_vars.gd
index ec38b06..cf01c53 100644
--- a/global_vars.gd
+++ b/global_vars.gd
@@ -1,8 +1,8 @@
extends Node
const size = Vector2(70, 70)
-enum type {normal, unnormal}
-enum states {player_turn, level_turn}
+enum type { normal, unnormal }
+enum states { player_turn, level_turn }
var turns_used = 0
var state = states.level_turn
diff --git a/input_handler.gd b/input_handler.gd
index 7d6bc65..ccd2d3b 100644
--- a/input_handler.gd
+++ b/input_handler.gd
@@ -6,40 +6,45 @@ var nodes_with_points = []
onready var line = $Line2D
-func _pressed(event : InputEvent, node : dot):
+
+func _pressed(event: InputEvent, node: dot):
if not GlobalVars.state == GlobalVars.states.player_turn:
return
- print("aloh")
- if line.get_point_count() > 0:
- if node.color == line.default_color:
- if not node in nodes_with_points:
-# line.remove_point(line.get_point_count() - 1) # remove the last points
- set_physics_process(false)
- yield(get_tree(), "idle_frame")
- line.add_point(node.position + GlobalVars.size / 2)
- nodes_with_points.append(node)
- set_physics_process(true)
- elif event.is_action("click") and event.is_pressed():
+ var node_center = node.dotcollisions.global_position
+ if (
+ line.get_point_count() > 0
+ and node.color == line.default_color
+ and not node in nodes_with_points
+ ):
+ print("points", line.get_point_count())
+ line.add_point(node_center)
+ nodes_with_points.append(node)
+ elif event.is_action("click") and event.is_pressed() and pressed == false: # on first click
pressed = true
line.clear_points()
nodes_with_points.clear()
nodes_with_points.append(node)
- line.add_point(node.position + GlobalVars.size / 2) # add a point in the center of the dot
+ line.add_point(node_center)
line.add_point(line.get_global_mouse_position())
line.default_color = node.color
-
+
+
func _physics_process(_delta):
if line.get_point_count() > 0:
if Input.is_action_pressed("click") and pressed == true:
- line.remove_point(line.get_point_count() - 1)
- line.add_point(line.get_global_mouse_position())
- elif line.get_point_count() > 2:
- line.clear_points()
+ move_last_point_to_mouse()
else:
line.clear_points()
nodes_with_points.clear()
pressed = false
+
func set_pressed(new_pressed):
pressed = new_pressed
set_physics_process(pressed)
+
+
+func move_last_point_to_mouse():
+ # get_point count counts from one, remove point counts from 0
+ line.remove_point(line.get_point_count() - 1)
+ line.add_point(line.get_global_mouse_position())
diff --git a/leveldata.gd b/leveldata.gd
index 2f25b03..1df8385 100644
--- a/leveldata.gd
+++ b/leveldata.gd
@@ -3,8 +3,10 @@ extends Node
export(PoolColorArray) var dot_colors
export(Color) var background_color
+
func _ready():
randomize()
VisualServer.set_default_clear_color(background_color)
+
export(Array, PackedScene) var dots
diff --git a/project.godot b/project.godot
index d628b7b..96bbfd0 100644
--- a/project.godot
+++ b/project.godot
@@ -9,7 +9,7 @@
config_version=4
_global_script_classes=[ {
-"base": "Area2D",
+"base": "Node2D",
"class": "dot",
"language": "GDScript",
"path": "res://dots/dot.gd"
diff --git a/utils.gd b/utils.gd
index 9140d1a..314aa0a 100644
--- a/utils.gd
+++ b/utils.gd
@@ -1,5 +1,6 @@
extends Node
+
func instance_scene_on_main(scene, position):
var main = get_tree().current_scene
var instance = scene.instance()