Beam component

This commit is contained in:
2025-02-07 04:39:08 +01:00
parent 697a9b7deb
commit c74f1102b2
4 changed files with 146 additions and 1 deletions

View File

@@ -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")

View File

@@ -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")

View File

@@ -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)

View File

@@ -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