From c74f1102b2417aad865a43ce2a7fd7759fef0038 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Fri, 7 Feb 2025 04:39:08 +0100 Subject: [PATCH] Beam component --- objects/cannon_ray_down.tscn | 32 ++++++++++++++ objects/cannon_ray_left.tscn | 35 +++++++++++++++ scenes/test.tscn | 16 ++++++- scripts/components/beam_component.gd | 64 ++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 objects/cannon_ray_down.tscn create mode 100644 objects/cannon_ray_left.tscn create mode 100644 scripts/components/beam_component.gd diff --git a/objects/cannon_ray_down.tscn b/objects/cannon_ray_down.tscn new file mode 100644 index 0000000..272b3d3 --- /dev/null +++ b/objects/cannon_ray_down.tscn @@ -0,0 +1,32 @@ +[gd_scene load_steps=5 format=3 uid="uid://dfwpha0d18dmn"] + +[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_rwgpm"] +[ext_resource type="Script" path="res://scripts/components/damage.gd" id="2_3cgd2"] +[ext_resource type="Script" path="res://scripts/components/beam_component.gd" id="3_jlh0s"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ptfn7"] +size = Vector2(8, 16) + +[node name="Cannon Ray" type="Area2D"] +collision_layer = 0 +collision_mask = 5 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture_repeat = 2 +texture = ExtResource("1_rwgpm") +region_enabled = true +region_rect = Rect2(176, 64, 16, 16) + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_ptfn7") + +[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")] +script = ExtResource("2_3cgd2") +area2d = NodePath("..") + +[node name="BeamComponent" type="Node2D" parent="." node_paths=PackedStringArray("root", "sprite2d", "collision_shape")] +position = Vector2(0, -8) +script = ExtResource("3_jlh0s") +root = NodePath("..") +sprite2d = NodePath("../Sprite2D") +collision_shape = NodePath("../CollisionShape2D") diff --git a/objects/cannon_ray_left.tscn b/objects/cannon_ray_left.tscn new file mode 100644 index 0000000..b500d0d --- /dev/null +++ b/objects/cannon_ray_left.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=3 uid="uid://d3lt4rhxduv44"] + +[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_l5x2w"] +[ext_resource type="Script" path="res://scripts/components/damage.gd" id="2_68sgi"] +[ext_resource type="Script" path="res://scripts/components/beam_component.gd" id="3_mcbof"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_ptfn7"] +size = Vector2(16, 8) + +[node name="Cannon Ray" type="Area2D"] +collision_layer = 0 +collision_mask = 5 + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture_repeat = 2 +rotation = 1.5708 +texture = ExtResource("1_l5x2w") +region_enabled = true +region_rect = Rect2(176, 64, 16, 16) +region_filter_clip_enabled = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("RectangleShape2D_ptfn7") + +[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")] +script = ExtResource("2_68sgi") +area2d = NodePath("..") + +[node name="BeamComponent" type="Node2D" parent="." node_paths=PackedStringArray("root", "sprite2d", "collision_shape")] +position = Vector2(8, 0) +script = ExtResource("3_mcbof") +direction = Vector2(-1, 0) +root = NodePath("..") +sprite2d = NodePath("../Sprite2D") +collision_shape = NodePath("../CollisionShape2D") diff --git a/scenes/test.tscn b/scenes/test.tscn index 1cf2cc6..ceae183 100644 --- a/scenes/test.tscn +++ b/scenes/test.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=20 format=4 uid="uid://h60obxmju6mo"] +[gd_scene load_steps=22 format=4 uid="uid://h60obxmju6mo"] [ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_5lb42"] [ext_resource type="TileSet" uid="uid://cl4bn8lofqvky" path="res://tileset/village/tileset_village.tres" id="1_d680t"] @@ -8,6 +8,8 @@ [ext_resource type="PackedScene" uid="uid://ct8fim6mduyl3" path="res://objects/collapsing_bridge.tscn" id="6_84ckv"] [ext_resource type="PackedScene" uid="uid://bwdlmualj6xbw" path="res://objects/enemy.tscn" id="7_qgddg"] [ext_resource type="PackedScene" uid="uid://bhc7y4xugu4q7" path="res://objects/bullet.tscn" id="8_c68mx"] +[ext_resource type="PackedScene" uid="uid://dfwpha0d18dmn" path="res://objects/cannon_ray_down.tscn" id="9_ysd8p"] +[ext_resource type="PackedScene" uid="uid://d3lt4rhxduv44" path="res://objects/cannon_ray_left.tscn" id="10_7v2ff"] [sub_resource type="Gradient" id="Gradient_anvhr"] offsets = PackedFloat32Array(1) @@ -432,3 +434,15 @@ position = Vector2(85, -89) [node name="Bullet3" parent="." instance=ExtResource("8_c68mx")] position = Vector2(307, 0) + +[node name="Cannon Ray" parent="." instance=ExtResource("9_ysd8p")] +position = Vector2(328, -48) + +[node name="Cannon Ray2" parent="." instance=ExtResource("9_ysd8p")] +position = Vector2(343, -48) + +[node name="Cannon Ray3" parent="." instance=ExtResource("9_ysd8p")] +position = Vector2(360, -48) + +[node name="Cannon Ray4" parent="." instance=ExtResource("10_7v2ff")] +position = Vector2(445, 57) diff --git a/scripts/components/beam_component.gd b/scripts/components/beam_component.gd new file mode 100644 index 0000000..844734e --- /dev/null +++ b/scripts/components/beam_component.gd @@ -0,0 +1,64 @@ +class_name BeamComponent +extends Node2D + +@export var expansion_speed: float = 16.0 +@export var max_length: float = 512.0 +@export var direction: Vector2 = Vector2.DOWN + +var current_length: float = 16.0 + +@export var root: Node2D +@export var sprite2d: Sprite2D +@export var collision_shape: CollisionShape2D + + +func _ready() -> void: + collision_shape.shape.extents = Vector2(current_length / 2.0, current_length / 2.0) + sprite2d.scale = Vector2(1, 1) + collision_shape.position = Vector2.ZERO + + +func _process(delta: float) -> void: + var new_length = current_length + expansion_speed * delta + if new_length > max_length: + new_length = max_length + + if not check_for_obstacle(new_length): + expand_beam(new_length) + + +func expand_beam(new_length: float) -> void: + current_length = new_length + + if direction == Vector2.UP: + sprite2d.scale.y = current_length / 16.0 + sprite2d.position.y = -current_length / 2.0 + collision_shape.shape.extents = Vector2(8.0, current_length / 2.0) + collision_shape.position.y = -current_length / 2.0 + elif direction == Vector2.DOWN: + sprite2d.scale.y = current_length / 16.0 + sprite2d.position.y = current_length / 2.0 + collision_shape.shape.extents = Vector2(8.0, current_length / 2.0) + collision_shape.position.y = current_length / 2.0 + elif direction == Vector2.LEFT: + sprite2d.scale.y = current_length / 16.0 + sprite2d.position.x = -current_length / 2.0 + collision_shape.shape.extents = Vector2(current_length / 2.0, 8.0) + collision_shape.position.x = -current_length / 2.0 + elif direction == Vector2.RIGHT: + sprite2d.scale.y = current_length / 16.0 + sprite2d.position.x = current_length / 2.0 + collision_shape.shape.extents = Vector2(current_length / 2.0, 8.0) + collision_shape.position.x = current_length / 2.0 + + +func check_for_obstacle(new_length: float) -> bool: + var space_state: PhysicsDirectSpaceState2D = get_world_2d().direct_space_state + var query_start: Vector2 = global_position + var query_end: Vector2 = global_position + direction * new_length + var query: PhysicsRayQueryParameters2D = PhysicsRayQueryParameters2D.create(query_start, query_end) + query.collide_with_areas = false + query.collide_with_bodies = true + + var result: Dictionary = space_state.intersect_ray(query) + return result.size() > 0