Beam component
This commit is contained in:
32
objects/cannon_ray_down.tscn
Normal file
32
objects/cannon_ray_down.tscn
Normal 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")
|
35
objects/cannon_ray_left.tscn
Normal file
35
objects/cannon_ray_left.tscn
Normal 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")
|
@@ -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="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"]
|
[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://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://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://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"]
|
[sub_resource type="Gradient" id="Gradient_anvhr"]
|
||||||
offsets = PackedFloat32Array(1)
|
offsets = PackedFloat32Array(1)
|
||||||
@@ -432,3 +434,15 @@ position = Vector2(85, -89)
|
|||||||
|
|
||||||
[node name="Bullet3" parent="." instance=ExtResource("8_c68mx")]
|
[node name="Bullet3" parent="." instance=ExtResource("8_c68mx")]
|
||||||
position = Vector2(307, 0)
|
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)
|
||||||
|
64
scripts/components/beam_component.gd
Normal file
64
scripts/components/beam_component.gd
Normal 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
|
Reference in New Issue
Block a user