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
| -rw-r--r-- | InputHandler.tscn | 1 | ||||
| -rw-r--r-- | World.gd | 28 | ||||
| -rw-r--r-- | World.tscn | 2 | ||||
| -rw-r--r-- | dots/dot.gd | 27 | ||||
| -rw-r--r-- | dots/dot_template.tscn | 23 | ||||
| -rw-r--r-- | dots/plain_dot.gd | 6 | ||||
| -rw-r--r-- | entity_tracker.gd | 9 | ||||
| -rw-r--r-- | global_vars.gd | 4 | ||||
| -rw-r--r-- | input_handler.gd | 41 | ||||
| -rw-r--r-- | leveldata.gd | 2 | ||||
| -rw-r--r-- | project.godot | 2 | ||||
| -rw-r--r-- | utils.gd | 1 |
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 @@ -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") @@ -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" @@ -1,5 +1,6 @@ extends Node + func instance_scene_on_main(scene, position): var main = get_tree().current_scene var instance = scene.instance() |