summaryrefslogtreecommitdiff
path: root/addons/escoria-core/testing/player_angles_finder.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/escoria-core/testing/player_angles_finder.gd')
-rw-r--r--addons/escoria-core/testing/player_angles_finder.gd231
1 files changed, 231 insertions, 0 deletions
diff --git a/addons/escoria-core/testing/player_angles_finder.gd b/addons/escoria-core/testing/player_angles_finder.gd
new file mode 100644
index 0000000..e47b83c
--- /dev/null
+++ b/addons/escoria-core/testing/player_angles_finder.gd
@@ -0,0 +1,231 @@
+extends Node2D
+
+# This scenes purpose is to help determining the angles between X and Y axis
+# when clicking somewhere on the screen.
+# Let us consider that player position is always 0,0.
+# Clicking right above his head is angle 0.
+# Clicking on the right is angle 90.
+# Clicking under his feet is angle 180.
+# etc.
+
+var number_of_directions: int
+var angle_horizontal_axes: float
+var angle_vertical_axes: float
+var angle_diagonal_axes: float
+const POLYGON_DISTANCE = 400
+
+enum Directions {
+ NORTH, # 0
+ NORTHEAST, # 1
+ EAST, # 2
+ SOUTHEAST, # 3
+ SOUTH, # 4
+ SOUTHWEST, # 5
+ WEST, # 6
+ NORTHWEST # 7
+}
+
+const starting_angles = [
+ 0, # 0 NORTH
+ PI/4, # 1 NORTHEAST
+ PI/2, # 2 EAST
+ 3*PI/4, # 3 SOUTHEAST
+ PI, # 4 SOUTH
+ 5*PI/4, # 5 SOUTHWEST
+ 3*PI/2, # 6 WEST
+ 7*PI/4, # 7 NORTHWEST
+]
+
+var colors = [
+ Color("red"), # 0 NORTH
+ Color("green"), # 1 NORTHEAST
+ Color("blue"), # 2 EAST
+ Color("black"), # 3 SOUTHEAST
+ Color("yellow"), # 4 SOUTH
+ Color("cyan"), # 5 SOUTHWEST
+ Color("white"), # 6 WEST
+ Color("purple") # 7 NORTHWEST
+]
+
+var result_angles = []
+
+#onready var result_angles_anim = {
+# "angle_offset_rad": PI/2,
+# Directions.NORTH: {
+# "direction_base_angle_rad": 0,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animations": {}
+# },
+# Directions.NORTHEAST: {
+# "direction_base_angle_rad": PI/4,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# },
+# Directions.EAST: {
+# "direction_base_angle_rad": PI/2,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# },
+# Directions.SOUTHEAST: {
+# "direction_base_angle_rad": 3*PI/4,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# },
+# Directions.SOUTH: {
+# "direction_base_angle_rad": PI,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+#
+# },
+# Directions.SOUTHWEST: {
+# "direction_base_angle_rad": 5*PI/4,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# },
+# Directions.WEST: {
+# "direction_base_angle_rad": 3*PI/2,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# },
+# Directions.NORTHWEST: {
+# "direction_base_angle_rad": 7*PI/4,
+# "angle_start_deg": 0,
+# "angle_area_deg": 0,
+# "animation": ""
+# }
+# }
+
+
+
+func _ready():
+ # Find player animations
+ $player_animations.add_item("")
+ for anim_name in $player.get_animation_player().get_animations():
+ $player_animations.add_item(anim_name)
+
+ # Set initial angles
+ var initial_angle: float = 360.0 / 8.0
+ $VBoxContainer/angle_x/angle_horiz.text = str(40)
+ $VBoxContainer/angle_y/angle_vert.text = str(40)
+ $VBoxContainer/angle_diag/angle_diag.text = str(50)
+ angle_horizontal_axes = 40
+ angle_vertical_axes = 40
+ angle_diagonal_axes = 50
+
+ calculate_areas()
+
+
+func _on_number_of_directions_text_changed(new_text: String):
+ if !new_text.is_valid_int():
+ return
+ number_of_directions = int(new_text)
+ calculate_areas(number_of_directions)
+
+
+func clear_areas_node():
+ for n in $areas.get_children():
+ n.queue_free()
+
+
+func calculate_areas(nb_directions: int = 8):
+ clear_areas_node()
+ var angles = []
+ for i in range(nb_directions):
+ var angle_area: float = 0.0
+ var start_angle: float = 0.0
+ # MANUAL
+ match i:
+ Directions.EAST,Directions.WEST:
+ angle_area = deg_to_rad(angle_horizontal_axes)
+ Directions.NORTH,Directions.SOUTH:
+ angle_area = deg_to_rad(angle_vertical_axes)
+ Directions.NORTHEAST,Directions.NORTHWEST,Directions.SOUTHEAST,Directions.SOUTHWEST:
+ angle_area = deg_to_rad(angle_diagonal_axes)
+
+ # Since angles start from EAST, offset by -PI/2 (= -90°) to start on up direction
+ # Then minus angle_area/2 to align on direction
+ start_angle = PI/2 + angle_area / 2
+
+ var angle_start = starting_angles[i] - start_angle
+ var angle_end = angle_start + angle_area
+ angles.push_back([angle_start, angle_end])
+
+ result_angles.push_back([clamp360(rad_to_deg(angle_start) + rad_to_deg(PI/2)),clamp360(rad_to_deg(angle_area))])
+
+ $VBoxContainer/VBoxContainer/angles/angle_array.text = str(result_angles)
+ construct_scene_nodes(angles)
+
+
+func construct_scene_nodes(angles):
+ var areas_nodes = []
+ for i in angles.size():
+ var polygon_node = Polygon2D.new()
+ polygon_node.color = colors[i]
+ var area_node = Area2D.new()
+ area_node.name = Directions.keys()[i]
+ area_node.connect("input_event", Callable(self, "_on_area_click").bind(area_node.name))
+ polygon_node.add_child(area_node)
+
+ var collision = CollisionShape2D.new()
+ var collision_shape = ConvexPolygonShape2D.new()
+
+ var p_points = []
+ p_points.push_back($player.position)
+ p_points.push_back(POLYGON_DISTANCE * Vector2.from_angle(angles[i][0]) + $player.position)
+ p_points.push_back(POLYGON_DISTANCE * Vector2.from_angle(angles[i][1]) + $player.position)
+ polygon_node.polygon = p_points
+ collision_shape.points = p_points
+ collision.set_shape(collision_shape)
+ area_node.add_child(collision)
+
+ $areas.add_child(polygon_node)
+
+
+func _on_angle_horiz_text_changed(new_text: String):
+ if !new_text.is_valid_float():
+ return
+ angle_horizontal_axes = float(new_text)
+# result_angles_anim.Directions.EAST.angle_area_deg = clamp360(angle_horizontal_axes)
+# result_angles_anim.Directions.WEST.angle_area_deg = clamp360(angle_horizontal_axes)
+ calculate_areas()
+
+
+func _on_angle_vert_text_changed(new_text: String):
+ if !new_text.is_valid_float():
+ return
+ angle_vertical_axes = float(new_text)
+# result_angles_anim.Directions.NORTH.angle_area_deg = clamp360(angle_vertical_axes)
+# result_angles_anim.Directions.SOUTH.angle_area_deg = clamp360(angle_vertical_axes)
+ calculate_areas()
+
+
+func _on_angle_diag_text_changed(new_text: String):
+ if !new_text.is_valid_float():
+ return
+ angle_diagonal_axes = float(new_text)
+# result_angles_anim.Directions.NORTHEAST.angle_area_deg = clamp360(angle_diagonal_axes)
+# result_angles_anim.Directions.SOUTHEAST.angle_area_deg = clamp360(angle_diagonal_axes)
+# result_angles_anim.Directions.NORTHWEST.angle_area_deg = clamp360(angle_diagonal_axes)
+# result_angles_anim.Directions.SOUTHWEST.angle_area_deg = clamp360(angle_diagonal_axes)
+ calculate_areas()
+
+
+func _on_area_click(viewport: Object, event: InputEvent, shape_idx: int, area_name: String):
+ if event is InputEventMouseButton and event.is_pressed():
+ pass
+
+func clamp360(angle: float):
+ if angle < 0.0:
+ while angle < 0.0:
+ angle += 360.0
+ elif angle >= 360.0:
+ while angle >= 360.0:
+ angle -= 360.0
+ return angle