Add charge throw mechanics; refactor bullet and brick components
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://bymro4t7angv5"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://bymro4t7angv5"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_1c3jb"]
|
||||
[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_i6t5k"]
|
||||
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_i6t5k"]
|
||||
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_8xipx"]
|
||||
[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="4_rdtjq"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"]
|
||||
size = Vector2(16, 10)
|
||||
@@ -20,12 +21,11 @@ hframes = 12
|
||||
vframes = 12
|
||||
frame = 80
|
||||
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")]
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")]
|
||||
script = ExtResource("2_i6t5k")
|
||||
root = NodePath("..")
|
||||
speed = 320.0
|
||||
area2d = NodePath("..")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
life_time = 2.0
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
@@ -38,3 +38,8 @@ scale = Vector2(0.8, 0.5)
|
||||
[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")]
|
||||
script = ExtResource("3_8xipx")
|
||||
area2d = NodePath("..")
|
||||
|
||||
[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")]
|
||||
script = ExtResource("4_rdtjq")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
root = NodePath("..")
|
||||
|
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=30 format=3 uid="uid://bqi5s710xb1ju"]
|
||||
[gd_scene load_steps=32 format=3 uid="uid://bqi5s710xb1ju"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://ccuddyoakg04u" path="res://scripts/player.gd" id="1_8j4h4"]
|
||||
[ext_resource type="Texture2D" uid="uid://b7gp0gqvkv8j4" path="res://sprites/MrBrick_base.png" id="2_bc55y"]
|
||||
@@ -26,6 +26,8 @@
|
||||
[ext_resource type="Script" uid="uid://bya240e627ti6" path="res://scripts/resources/skill_data.gd" id="21_d0oiv"]
|
||||
[ext_resource type="Resource" uid="uid://d3bjre2etov1n" path="res://resources/skills/magnetic.tres" id="22_vnsgd"]
|
||||
[ext_resource type="Script" uid="uid://bjsyeo1n7bsri" path="res://scripts/components/skill_unlocker_component.gd" id="23_qsv2c"]
|
||||
[ext_resource type="Script" uid="uid://c6fclevp3peuo" path="res://scripts/components/charge_throw_component.gd" id="27_h8c1m"]
|
||||
[ext_resource type="PackedScene" uid="uid://bg76mtpcmfm2j" path="res://objects/ui/charging_bar_layer.tscn" id="28_3f5nm"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_hdsg1"]
|
||||
size = Vector2(16, 31)
|
||||
@@ -157,5 +159,16 @@ stream = ExtResource("19_7anly")
|
||||
[node name="sfx_heal" type="AudioStreamPlayer2D" parent="."]
|
||||
stream = ExtResource("20_bptj5")
|
||||
|
||||
[node name="ChargeThrowComponent" type="Node" parent="."]
|
||||
script = ExtResource("27_h8c1m")
|
||||
metadata/_custom_type_script = "uid://c6fclevp3peuo"
|
||||
|
||||
[node name="ChargingBarLayer" parent="." node_paths=PackedStringArray("charge_throw_component") instance=ExtResource("28_3f5nm")]
|
||||
offset_left = -17.0
|
||||
offset_top = -30.0
|
||||
offset_right = 23.0
|
||||
offset_bottom = -20.0
|
||||
charge_throw_component = NodePath("../ChargeThrowComponent")
|
||||
|
||||
[connection signal="on_death" from="HealthComponent" to="PlayerDeathComponent" method="_on_health_component_on_death"]
|
||||
[connection signal="on_health_change" from="HealthComponent" to="KnockbackComponent" method="_on_health_component_on_health_change"]
|
||||
|
@@ -1,8 +1,12 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://bhc7y4xugu4q7"]
|
||||
[gd_scene load_steps=9 format=3 uid="uid://bhc7y4xugu4q7"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_w543f"]
|
||||
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="2_ll0xw"]
|
||||
[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="3_keogl"]
|
||||
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="3_keogl"]
|
||||
[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="4_lqg4f"]
|
||||
[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="5_qsc5m"]
|
||||
[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="6_6th6w"]
|
||||
[ext_resource type="Script" uid="uid://cvcnfrr1udco5" path="res://scripts/components/straight_motion_component.gd" id="7_e0mqp"]
|
||||
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_txsw8"]
|
||||
radius = 4.0
|
||||
@@ -29,13 +33,34 @@ scale = Vector2(0.4, 0.4)
|
||||
script = ExtResource("2_ll0xw")
|
||||
area2d = NodePath("..")
|
||||
|
||||
[node name="BulletComponent" type="Node2D" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")]
|
||||
script = ExtResource("3_keogl")
|
||||
root = NodePath("..")
|
||||
speed = 120.0
|
||||
area2d = NodePath("..")
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
wait_time = 5.0
|
||||
autostart = true
|
||||
|
||||
[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")]
|
||||
script = ExtResource("4_lqg4f")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
root = NodePath("..")
|
||||
|
||||
[node name="LifetimeComponent" type="Node" parent="." node_paths=PackedStringArray("root", "timer")]
|
||||
script = ExtResource("5_qsc5m")
|
||||
root = NodePath("..")
|
||||
life_time = 10.0
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
autostart = true
|
||||
[node name="LaunchComponent" type="Node2D" parent="." node_paths=PackedStringArray("root")]
|
||||
script = ExtResource("6_6th6w")
|
||||
root = NodePath("..")
|
||||
speed = 120.0
|
||||
metadata/_custom_type_script = "uid://873un8agkyja"
|
||||
|
||||
[node name="StraightMotionComponent" type="Node" parent="." node_paths=PackedStringArray("root", "launch_component")]
|
||||
script = ExtResource("7_e0mqp")
|
||||
root = NodePath("..")
|
||||
launch_component = NodePath("../LaunchComponent")
|
||||
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d")]
|
||||
script = ExtResource("3_keogl")
|
||||
root = NodePath("..")
|
||||
area2d = NodePath("..")
|
||||
metadata/_custom_type_script = "uid://cdnwrn8v05qhi"
|
||||
|
@@ -1,10 +1,14 @@
|
||||
[gd_scene load_steps=8 format=3 uid="uid://5surx230gfw3"]
|
||||
[gd_scene load_steps=13 format=3 uid="uid://5surx230gfw3"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_rcgxf"]
|
||||
[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_1i2y5"]
|
||||
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_y0uai"]
|
||||
[ext_resource type="Script" uid="uid://beg4dk7d5pvhp" path="res://scripts/components/explosive_component.gd" id="4_8lw0n"]
|
||||
[ext_resource type="PackedScene" uid="uid://dyp4i4ru2j2jh" path="res://objects/fxs/explosion_fx.tscn" id="5_6oopj"]
|
||||
[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_5jrjx"]
|
||||
[ext_resource type="Script" uid="uid://873un8agkyja" path="res://scripts/components/launch_component.gd" id="7_a2b5x"]
|
||||
[ext_resource type="Script" uid="uid://bvsgg8lu0a8m6" path="res://scripts/components/lifetime_component.gd" id="7_nqeob"]
|
||||
[ext_resource type="Script" uid="uid://c2gbumw4x4t1v" path="res://scripts/components/gravity_motion_component.gd" id="8_4ly8b"]
|
||||
[ext_resource type="Script" uid="uid://ciowd622nk0i7" path="res://scripts/components/chargable_component.gd" id="9_a2b5x"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"]
|
||||
size = Vector2(16, 10)
|
||||
@@ -12,9 +16,12 @@ size = Vector2(16, 10)
|
||||
[sub_resource type="CircleShape2D" id="CircleShape2D_e6vaq"]
|
||||
radius = 32.0
|
||||
|
||||
[node name="Brick" type="Area2D"]
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_nqeob"]
|
||||
size = Vector2(16, 10)
|
||||
|
||||
[node name="ExplosiveBrick" type="CharacterBody2D"]
|
||||
collision_layer = 16
|
||||
collision_mask = 9
|
||||
collision_mask = 8
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||
shape = SubResource("RectangleShape2D_ar0xf")
|
||||
@@ -25,40 +32,63 @@ hframes = 12
|
||||
vframes = 12
|
||||
frame = 80
|
||||
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")]
|
||||
script = ExtResource("2_1i2y5")
|
||||
root = NodePath("..")
|
||||
speed = 120.0
|
||||
area2d = NodePath("..")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
life_time = 2.0
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
[node name="VisibleOnScreenNotifier2D" type="VisibleOnScreenNotifier2D" parent="."]
|
||||
position = Vector2(0, 2.38419e-07)
|
||||
scale = Vector2(0.8, 0.5)
|
||||
|
||||
[node name="Timer" type="Timer" parent="."]
|
||||
|
||||
[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d")]
|
||||
[node name="DamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d", "damage_timer")]
|
||||
script = ExtResource("3_y0uai")
|
||||
damage = 5.0
|
||||
area2d = NodePath("..")
|
||||
area2d = NodePath("../Explosion area")
|
||||
damage_timer = NodePath("../Timer")
|
||||
|
||||
[node name="ExplosiveComponent" type="Node" parent="." node_paths=PackedStringArray("root", "damage", "area2d", "explosion_area2d")]
|
||||
script = ExtResource("4_8lw0n")
|
||||
root = NodePath("..")
|
||||
damage = NodePath("../DamageComponent")
|
||||
area2d = NodePath("..")
|
||||
area2d = NodePath("../BulletArea")
|
||||
explosion_area2d = NodePath("../Explosion area")
|
||||
explosion_effect = ExtResource("5_6oopj")
|
||||
|
||||
[node name="Explosion area" type="Area2D" parent="."]
|
||||
collision_layer = 0
|
||||
collision_mask = 9
|
||||
collision_mask = 8
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Explosion area"]
|
||||
shape = SubResource("CircleShape2D_e6vaq")
|
||||
debug_color = Color(0.919034, 6.36289e-05, 0.69998, 0.42)
|
||||
|
||||
[node name="ExplosionFX" parent="." instance=ExtResource("5_6oopj")]
|
||||
randomness = 0.24
|
||||
|
||||
[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")]
|
||||
script = ExtResource("6_5jrjx")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
root = NodePath("..")
|
||||
|
||||
[node name="LifetimeComponent" type="Node" parent="." node_paths=PackedStringArray("root", "timer")]
|
||||
script = ExtResource("7_nqeob")
|
||||
root = NodePath("..")
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
[node name="LaunchComponent" type="Node2D" parent="." node_paths=PackedStringArray("root")]
|
||||
script = ExtResource("7_a2b5x")
|
||||
root = NodePath("..")
|
||||
speed = 240.0
|
||||
metadata/_custom_type_script = "uid://873un8agkyja"
|
||||
|
||||
[node name="GravityMotionComponent" type="Node2D" parent="." node_paths=PackedStringArray("character_body", "launch_component")]
|
||||
script = ExtResource("8_4ly8b")
|
||||
character_body = NodePath("..")
|
||||
launch_component = NodePath("../LaunchComponent")
|
||||
|
||||
[node name="BulletArea" type="Area2D" parent="."]
|
||||
collision_layer = 16
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="BulletArea"]
|
||||
shape = SubResource("RectangleShape2D_nqeob")
|
||||
|
||||
[node name="ChargableComponent" type="Node" parent="."]
|
||||
script = ExtResource("9_a2b5x")
|
||||
|
@@ -1,10 +1,11 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://daau4j5hbklk0"]
|
||||
[gd_scene load_steps=8 format=3 uid="uid://daau4j5hbklk0"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_52l28"]
|
||||
[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_hjcob"]
|
||||
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_hjcob"]
|
||||
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_sog2h"]
|
||||
[ext_resource type="Resource" uid="uid://obodgnkhxuhe" path="res://resources/status_effect/fire.tres" id="4_xx5l4"]
|
||||
[ext_resource type="Script" uid="uid://d3brcje121krs" path="res://scripts/components/effect_inflictor_component.gd" id="5_ofrqk"]
|
||||
[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_64yur"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"]
|
||||
size = Vector2(16, 10)
|
||||
@@ -22,12 +23,11 @@ hframes = 12
|
||||
vframes = 12
|
||||
frame = 80
|
||||
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")]
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")]
|
||||
script = ExtResource("2_hjcob")
|
||||
root = NodePath("..")
|
||||
speed = 330.0
|
||||
area2d = NodePath("..")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
life_time = 2.0
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
@@ -46,3 +46,8 @@ status_effect_data = ExtResource("4_xx5l4")
|
||||
[node name="EffectInflictorComponent" type="Node" parent="." node_paths=PackedStringArray("damage")]
|
||||
script = ExtResource("5_ofrqk")
|
||||
damage = NodePath("../DamageComponent")
|
||||
|
||||
[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")]
|
||||
script = ExtResource("6_64yur")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
root = NodePath("..")
|
||||
|
@@ -1,10 +1,11 @@
|
||||
[gd_scene load_steps=7 format=3 uid="uid://bcmx07k12gcsc"]
|
||||
[gd_scene load_steps=8 format=3 uid="uid://bcmx07k12gcsc"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://djifxc5x0dyrw" path="res://sprites/ppc_tileset.png" id="1_xusxl"]
|
||||
[ext_resource type="Script" uid="uid://bh2vrkdbrtpin" path="res://scripts/components/bullet.gd" id="2_ilnf5"]
|
||||
[ext_resource type="Script" uid="uid://cdnwrn8v05qhi" path="res://scripts/components/bullet_component.gd" id="2_ilnf5"]
|
||||
[ext_resource type="Script" uid="uid://dkmxhjtmu5xlb" path="res://scripts/components/damage_component.gd" id="3_3yf4g"]
|
||||
[ext_resource type="Resource" uid="uid://02l4nbnf2aft" path="res://resources/status_effect/ice.tres" id="4_da7hn"]
|
||||
[ext_resource type="Script" uid="uid://d3brcje121krs" path="res://scripts/components/effect_inflictor_component.gd" id="5_x7vqb"]
|
||||
[ext_resource type="Script" uid="uid://1tnr46o1ib4u" path="res://scripts/components/out_of_screen_component.gd" id="6_7tdxt"]
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_ar0xf"]
|
||||
size = Vector2(16, 10)
|
||||
@@ -22,12 +23,11 @@ hframes = 12
|
||||
vframes = 12
|
||||
frame = 80
|
||||
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "visibility_notifier", "timer")]
|
||||
[node name="BulletComponent" type="Node" parent="." node_paths=PackedStringArray("root", "area2d", "timer")]
|
||||
script = ExtResource("2_ilnf5")
|
||||
root = NodePath("..")
|
||||
speed = 250.0
|
||||
area2d = NodePath("..")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
life_time = 2.0
|
||||
timer = NodePath("../Timer")
|
||||
|
||||
@@ -46,3 +46,8 @@ status_effect_data = ExtResource("4_da7hn")
|
||||
[node name="EffectInflictorComponent" type="Node" parent="." node_paths=PackedStringArray("damage")]
|
||||
script = ExtResource("5_x7vqb")
|
||||
damage = NodePath("../DamageComponent")
|
||||
|
||||
[node name="OutOfScreenComponent" type="Node" parent="." node_paths=PackedStringArray("visibility_notifier", "root")]
|
||||
script = ExtResource("6_7tdxt")
|
||||
visibility_notifier = NodePath("../VisibleOnScreenNotifier2D")
|
||||
root = NodePath("..")
|
||||
|
17
objects/ui/charging_bar_layer.tscn
Normal file
17
objects/ui/charging_bar_layer.tscn
Normal file
@@ -0,0 +1,17 @@
|
||||
[gd_scene load_steps=4 format=3 uid="uid://bg76mtpcmfm2j"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://q32rtephu1t1" path="res://scripts/ui/charge_progress_bar.gd" id="1_014ut"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_arbva"]
|
||||
bg_color = Color(0, 0, 0, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_014ut"]
|
||||
bg_color = Color(0.921569, 0.827451, 0.12549, 1)
|
||||
|
||||
[node name="ProgressBar" type="ProgressBar" node_paths=PackedStringArray("progress_bar")]
|
||||
offset_right = 40.0
|
||||
offset_bottom = 10.0
|
||||
theme_override_styles/background = SubResource("StyleBoxFlat_arbva")
|
||||
theme_override_styles/fill = SubResource("StyleBoxFlat_014ut")
|
||||
script = ExtResource("1_014ut")
|
||||
progress_bar = NodePath(".")
|
@@ -9,6 +9,7 @@ name = "Brick power"
|
||||
description = "Allows you to throw bricks at enemies"
|
||||
node = ExtResource("1_5gnea")
|
||||
config = {
|
||||
"charge_throw_component": NodePath("ChargeThrowComponent"),
|
||||
"player_controller": NodePath("."),
|
||||
"timer": NodePath("ThrowTimer")
|
||||
}
|
||||
|
@@ -11,6 +11,7 @@ description = "Allows you to throw explosive bricks at enemies"
|
||||
node = ExtResource("2_e0o8w")
|
||||
config = {
|
||||
"brick_scene": ExtResource("1_6pfoa"),
|
||||
"charge_throw_component": NodePath("./ChargeThrowComponent"),
|
||||
"player_controller": NodePath("."),
|
||||
"timer": NodePath("ThrowTimer")
|
||||
}
|
||||
|
@@ -5,35 +5,50 @@ extends Node
|
||||
@export var fire_rate: float = 1.0
|
||||
@export var player_controller: PlayerController
|
||||
@export var timer: Timer
|
||||
@export var charge_throw_component: ChargeThrowComponent
|
||||
|
||||
var can_throw: bool = true
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
setup_timer()
|
||||
can_throw = true
|
||||
|
||||
|
||||
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("attack") and can_throw:
|
||||
throw_brick()
|
||||
|
||||
if event.is_action_pressed("attack") and can_throw and charge_throw_component:
|
||||
charge_throw_component.start_charging()
|
||||
|
||||
if event.is_action_released("attack") and can_throw and charge_throw_component:
|
||||
var power_multiplier: float = charge_throw_component.stop_charging()
|
||||
print("Power Multiplier: ", power_multiplier)
|
||||
throw_brick(power_multiplier)
|
||||
|
||||
|
||||
func setup_timer() -> void:
|
||||
timer.wait_time = fire_rate
|
||||
timer.one_shot = false
|
||||
timer.autostart = false
|
||||
timer.timeout.connect(on_timer_timeout)
|
||||
|
||||
|
||||
|
||||
func on_timer_timeout() -> void:
|
||||
can_throw = true
|
||||
|
||||
|
||||
func throw_brick() -> void:
|
||||
|
||||
|
||||
func throw_brick(power_multiplier: float = 1.0) -> void:
|
||||
var brick_instance: Node2D = brick_scene.instantiate()
|
||||
var brick: BulletComponent = brick_instance.get_node("BulletComponent")
|
||||
brick_instance.position = player_controller.position
|
||||
brick.direction = player_controller.last_direction
|
||||
|
||||
var launch_component := brick_instance.get_node_or_null("LaunchComponent") as LaunchComponent
|
||||
var chargable_component := brick_instance.get_node_or_null("ChargableComponent") as ChargableComponent
|
||||
if launch_component:
|
||||
launch_component.initial_direction = player_controller.last_direction
|
||||
launch_component.spawn_position = player_controller.global_position
|
||||
launch_component.spawn_rotation = player_controller.rotation
|
||||
launch_component.speed *= power_multiplier if chargable_component else 1.0
|
||||
|
||||
brick_instance.global_position = player_controller.global_position
|
||||
get_tree().current_scene.add_child(brick_instance)
|
||||
|
||||
|
||||
can_throw = false
|
||||
timer.start()
|
||||
|
@@ -1,40 +0,0 @@
|
||||
class_name BulletComponent
|
||||
extends Node
|
||||
|
||||
@export var root: Node2D
|
||||
@export var direction: Vector2 = Vector2.RIGHT
|
||||
@export var speed: float = 10.0
|
||||
@export var area2d: Area2D
|
||||
@export var visibility_notifier: VisibleOnScreenNotifier2D
|
||||
@export var life_time: float = 5.0
|
||||
@export var timer: Timer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
root = get_parent()
|
||||
visibility_notifier.screen_exited.connect(_on_screen_exited)
|
||||
area2d.body_entered.connect(on_area2d_body_entered)
|
||||
area2d.area_entered.connect(on_area2d_area_entered)
|
||||
|
||||
timer.wait_time = life_time
|
||||
timer.timeout.connect(on_timer_timeout)
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
root.position += direction * speed * delta
|
||||
|
||||
|
||||
func _on_screen_exited() -> void:
|
||||
root.queue_free()
|
||||
|
||||
|
||||
func on_area2d_body_entered(_body: Node2D) -> void:
|
||||
root.queue_free()
|
||||
|
||||
|
||||
func on_area2d_area_entered(_area: Area2D) -> void:
|
||||
root.queue_free()
|
||||
|
||||
|
||||
func on_timer_timeout() -> void:
|
||||
root.queue_free()
|
@@ -1 +0,0 @@
|
||||
uid://bh2vrkdbrtpin
|
18
scripts/components/bullet_component.gd
Normal file
18
scripts/components/bullet_component.gd
Normal file
@@ -0,0 +1,18 @@
|
||||
class_name BulletComponent
|
||||
extends Node
|
||||
|
||||
@export var root: Node2D
|
||||
@export var area2d: Area2D
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
area2d.body_entered.connect(on_area2d_body_entered)
|
||||
area2d.area_entered.connect(on_area2d_area_entered)
|
||||
|
||||
|
||||
func on_area2d_body_entered(_body: Node2D) -> void:
|
||||
root.queue_free()
|
||||
|
||||
|
||||
func on_area2d_area_entered(_area: Area2D) -> void:
|
||||
root.queue_free()
|
1
scripts/components/bullet_component.gd.uid
Normal file
1
scripts/components/bullet_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cdnwrn8v05qhi
|
2
scripts/components/chargable_component.gd
Normal file
2
scripts/components/chargable_component.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
class_name ChargableComponent
|
||||
extends Node
|
1
scripts/components/chargable_component.gd.uid
Normal file
1
scripts/components/chargable_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://ciowd622nk0i7
|
45
scripts/components/charge_throw_component.gd
Normal file
45
scripts/components/charge_throw_component.gd
Normal file
@@ -0,0 +1,45 @@
|
||||
class_name ChargeThrowComponent
|
||||
extends Node
|
||||
|
||||
@export var min_power: float = 0.5
|
||||
@export var max_power: float = 2.0
|
||||
@export var max_charge_time: float = 1.5
|
||||
|
||||
var charge_start_time: float = 0.0
|
||||
var is_charging: bool = false
|
||||
signal charge_started
|
||||
signal charge_updated(charge_ratio: float)
|
||||
signal charge_stopped
|
||||
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if not is_charging:
|
||||
return
|
||||
|
||||
var charge_ratio := get_charge_ratio()
|
||||
charge_updated.emit(charge_ratio)
|
||||
|
||||
|
||||
func start_charging() -> void:
|
||||
is_charging = true
|
||||
charge_start_time = Time.get_ticks_msec() / 1000.0
|
||||
charge_started.emit()
|
||||
|
||||
|
||||
func get_charge_ratio() -> float:
|
||||
if not is_charging:
|
||||
return 0.0
|
||||
|
||||
var held_time := (Time.get_ticks_msec() / 1000.0) - charge_start_time
|
||||
var t = clamp(held_time / max_charge_time, 0.0, 1.0)
|
||||
|
||||
return lerp(min_power, max_power, t)
|
||||
|
||||
|
||||
func stop_charging() -> float:
|
||||
is_charging = false
|
||||
var held_time := (Time.get_ticks_msec() / 1000.0) - charge_start_time
|
||||
var t = clamp(held_time / max_charge_time, 0.0, 1.0)
|
||||
charge_start_time = 0.0
|
||||
charge_stopped.emit()
|
||||
return lerp(min_power, max_power, t)
|
1
scripts/components/charge_throw_component.gd.uid
Normal file
1
scripts/components/charge_throw_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c6fclevp3peuo
|
30
scripts/components/gravity_motion_component.gd
Normal file
30
scripts/components/gravity_motion_component.gd
Normal file
@@ -0,0 +1,30 @@
|
||||
class_name GravityMotionComponent
|
||||
extends Node2D
|
||||
|
||||
@export var character_body: CharacterBody2D
|
||||
@export var launch_component: LaunchComponent
|
||||
@export var gravity: Vector2 = Vector2(0, 980.0)
|
||||
@export var target_direction: Vector2 = Vector2(1.0, -1.0)
|
||||
|
||||
var velocity: Vector2 = Vector2.ZERO
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not launch_component:
|
||||
return
|
||||
var direction := target_direction if launch_component.initial_direction.x > 0 else Vector2(-target_direction.x, target_direction.y)
|
||||
direction = direction.normalized()
|
||||
velocity = direction * launch_component.speed
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if not character_body:
|
||||
return
|
||||
|
||||
velocity += gravity * delta
|
||||
character_body.velocity = velocity
|
||||
|
||||
character_body.move_and_slide()
|
||||
|
||||
if velocity.length_squared() > 0.01:
|
||||
character_body.rotation = velocity.angle()
|
1
scripts/components/gravity_motion_component.gd.uid
Normal file
1
scripts/components/gravity_motion_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c2gbumw4x4t1v
|
17
scripts/components/launch_component.gd
Normal file
17
scripts/components/launch_component.gd
Normal file
@@ -0,0 +1,17 @@
|
||||
class_name LaunchComponent
|
||||
extends Node2D
|
||||
|
||||
@export var root: Node2D
|
||||
@export var initial_direction: Vector2 = Vector2.RIGHT
|
||||
@export var speed: float = 16.0
|
||||
@export var spawn_position: Vector2 = Vector2.ZERO
|
||||
@export var spawn_rotation: float = 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
root.global_position = spawn_position
|
||||
root.global_rotation = spawn_rotation
|
||||
|
||||
|
||||
func get_initial_velocity() -> Vector2:
|
||||
return initial_direction.normalized() * speed
|
1
scripts/components/launch_component.gd.uid
Normal file
1
scripts/components/launch_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://873un8agkyja
|
22
scripts/components/lifetime_component.gd
Normal file
22
scripts/components/lifetime_component.gd
Normal file
@@ -0,0 +1,22 @@
|
||||
class_name LifetimeComponent
|
||||
extends Node
|
||||
|
||||
@export var root: Node
|
||||
@export var life_time: float = 5.0
|
||||
@export var timer: Timer
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not root:
|
||||
printerr("Root node not set.")
|
||||
return
|
||||
|
||||
if not timer:
|
||||
printerr("Timer node not set.")
|
||||
return
|
||||
|
||||
timer.timeout.connect(on_timer_timeout)
|
||||
|
||||
|
||||
func on_timer_timeout() -> void:
|
||||
root.queue_free()
|
1
scripts/components/lifetime_component.gd.uid
Normal file
1
scripts/components/lifetime_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bvsgg8lu0a8m6
|
21
scripts/components/out_of_screen_component.gd
Normal file
21
scripts/components/out_of_screen_component.gd
Normal file
@@ -0,0 +1,21 @@
|
||||
class_name OutOfScreenComponent
|
||||
extends Node
|
||||
|
||||
@export var visibility_notifier: VisibleOnScreenNotifier2D
|
||||
@export var root: Node
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not visibility_notifier:
|
||||
printerr("Visibility notifier not set.")
|
||||
return
|
||||
|
||||
visibility_notifier.screen_exited.connect(_on_screen_exited)
|
||||
|
||||
|
||||
func _on_screen_exited() -> void:
|
||||
if not root:
|
||||
printerr("Root node not set.")
|
||||
return
|
||||
|
||||
root.queue_free()
|
1
scripts/components/out_of_screen_component.gd.uid
Normal file
1
scripts/components/out_of_screen_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://1tnr46o1ib4u
|
@@ -27,10 +27,14 @@ func shoot() -> void:
|
||||
return
|
||||
|
||||
var bullet_instance: Node2D = bullet_scene.instantiate()
|
||||
var bullet_component: BulletComponent = bullet_instance.get_node("BulletComponent")
|
||||
var launch_component: LaunchComponent = bullet_instance.get_node_or_null("LaunchComponent")
|
||||
var spawn_position: Vector2 = bullet_spawn_right.global_position if shoot_direction == Vector2.RIGHT else bullet_spawn_left.global_position
|
||||
if launch_component:
|
||||
launch_component.initial_direction = shoot_direction
|
||||
launch_component.spawn_position = spawn_position
|
||||
launch_component.spawn_rotation = root.rotation
|
||||
|
||||
bullet_instance.position = spawn_position
|
||||
bullet_component.direction = shoot_direction
|
||||
get_tree().current_scene.add_child(bullet_instance)
|
||||
|
||||
|
||||
|
21
scripts/components/projectile_component.gd
Normal file
21
scripts/components/projectile_component.gd
Normal file
@@ -0,0 +1,21 @@
|
||||
class_name ProjectileComponent
|
||||
extends Node2D
|
||||
|
||||
@export var speed: float = 16.0
|
||||
@export var dir: float
|
||||
@export var spawn_position: Vector2
|
||||
@export var spawn_rotation: float
|
||||
@export var character_body: CharacterBody2D
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
global_position = spawn_position
|
||||
global_rotation = spawn_rotation
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
if not character_body:
|
||||
return
|
||||
|
||||
character_body.velocity = Vector2(0, -speed).rotated(dir)
|
||||
character_body.move_and_slide()
|
1
scripts/components/projectile_component.gd.uid
Normal file
1
scripts/components/projectile_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bk2fvcv0g4x1q
|
9
scripts/components/straight_motion_component.gd
Normal file
9
scripts/components/straight_motion_component.gd
Normal file
@@ -0,0 +1,9 @@
|
||||
class_name StraightMotionComponent
|
||||
extends Node
|
||||
|
||||
@export var root: Node2D
|
||||
@export var launch_component: LaunchComponent
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
root.position += launch_component.get_initial_velocity() * delta
|
1
scripts/components/straight_motion_component.gd.uid
Normal file
1
scripts/components/straight_motion_component.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cvcnfrr1udco5
|
@@ -28,7 +28,6 @@ func add_skill(skill_data: SkillData) -> void:
|
||||
elif skill_instance.has_node(value):
|
||||
value = skill_instance.get_node(value)
|
||||
else:
|
||||
print("NodePath not found: ", value)
|
||||
continue
|
||||
|
||||
skill_instance[key] = value
|
||||
|
52
scripts/ui/charge_progress_bar.gd
Normal file
52
scripts/ui/charge_progress_bar.gd
Normal file
@@ -0,0 +1,52 @@
|
||||
extends Node
|
||||
|
||||
@export var progress_bar: ProgressBar
|
||||
@export var charge_throw_component: ChargeThrowComponent
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not charge_throw_component:
|
||||
return
|
||||
|
||||
if not progress_bar:
|
||||
return
|
||||
|
||||
setup_progress_bar()
|
||||
progress_bar.hide()
|
||||
|
||||
charge_throw_component.charge_started.connect(on_charge_started)
|
||||
charge_throw_component.charge_updated.connect(on_charge_updated)
|
||||
charge_throw_component.charge_stopped.connect(on_charge_stopped)
|
||||
|
||||
|
||||
func on_charge_updated(charge_ratio: float) -> void:
|
||||
if not progress_bar:
|
||||
return
|
||||
|
||||
progress_bar.value = charge_ratio
|
||||
progress_bar.show()
|
||||
|
||||
|
||||
func on_charge_stopped() -> void:
|
||||
if not progress_bar:
|
||||
return
|
||||
|
||||
progress_bar.hide()
|
||||
|
||||
|
||||
func on_charge_started() -> void:
|
||||
if not progress_bar:
|
||||
return
|
||||
|
||||
progress_bar.show()
|
||||
|
||||
|
||||
func setup_progress_bar() -> void:
|
||||
if not progress_bar:
|
||||
return
|
||||
|
||||
progress_bar.min_value = charge_throw_component.min_power
|
||||
progress_bar.max_value = charge_throw_component.max_power
|
||||
progress_bar.value = charge_throw_component.min_power
|
||||
progress_bar.step = 0.01
|
||||
progress_bar.show()
|
1
scripts/ui/charge_progress_bar.gd.uid
Normal file
1
scripts/ui/charge_progress_bar.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://q32rtephu1t1
|
Reference in New Issue
Block a user