diff --git a/scenes/level2.tscn b/scenes/level2.tscn index 1222b26..ef7c047 100644 --- a/scenes/level2.tscn +++ b/scenes/level2.tscn @@ -12,16 +12,14 @@ [ext_resource type="PackedScene" uid="uid://c1u8k6ny02t4y" path="res://scenes/player.tscn" id="10_ikw2v"] [ext_resource type="PackedScene" path="res://scenes/prefabs/hazards/spikes_double.tscn" id="11_cgqhq"] [ext_resource type="PackedScene" path="res://scenes/prefabs/hazards/spikes_grey.tscn" id="12_ttvjw"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/interactables/spring_red.tscn" id="13_ac7c3"] [ext_resource type="PackedScene" path="res://scenes/prefabs/interactables/door.tscn" id="14_qo7hg"] [ext_resource type="PackedScene" path="res://scenes/prefabs/collectibles/coin_gold_round.tscn" id="15_odav0"] [ext_resource type="PackedScene" path="res://scenes/prefabs/collectibles/key_gold.tscn" id="16_3xffc"] [ext_resource type="PackedScene" path="res://scenes/prefabs/collectibles/diamond.tscn" id="17_icuov"] -[ext_resource type="PackedScene" path="res://scenes/prefabs/enemies/walker.tscn" id="18_walker"] [ext_resource type="PackedScene" path="res://scenes/prefabs/enemies/laser.tscn" id="19_laser"] [ext_resource type="PackedScene" path="res://scenes/prefabs/enemies/bullet_field.tscn" id="20_field"] -[node name="Main" type="Node2D" unique_id=2061129075] +[node name="Main2" type="Node2D" unique_id=2061129075] [node name="HUD" parent="." unique_id=215179112 instance=ExtResource("1_g8vcy")] @@ -244,11 +242,6 @@ position = Vector2(234, 234) [node name="Interactables" type="Node2D" parent="Level/PrefabInstances" unique_id=769532488] -[node name="SpringRed_01" parent="Level/PrefabInstances/Interactables" unique_id=34192139 instance=ExtResource("13_ac7c3")] -visible = false -z_index = 5 -position = Vector2(448, 125) - [node name="Door_01" parent="Level/PrefabInstances/Interactables" unique_id=1264725697 instance=ExtResource("14_qo7hg")] z_index = 5 position = Vector2(288, 37) diff --git a/scenes/level3.tscn b/scenes/level3.tscn index 03bcd40..03f3abf 100644 --- a/scenes/level3.tscn +++ b/scenes/level3.tscn @@ -161,7 +161,7 @@ script = ExtResource("8_7hs6g") [node name="TerrainBase" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=91115499] position = Vector2(9, 9) -tile_map_data = PackedByteArray("AAD//wkAAAACAAEAAAD//woAAAAEAAAAAAABAA0AAAACAAYAAAACAA0AAAAEAAUAAAACAA4AAAAEAAUAAAADAA0AAAACAAYAAAABAAoAAAACAAYAAAAAAAoAAAAEAAUAAAAAAAkAAAACAAEAAAACAAsAAAAEAAUAAAAAAA0AAAAEAAUAAAD//w0AAAAEAAEAAAAFAA0AAAAEAAUAAAAEAA4AAAAEAAUAAAADAA4AAAACAAYAAAAAAA4AAAACAAYAAAABAA4AAAACAAYAAAAHAAwAAAACAAEAAAALAAwAAAACAAEAAAAKAA0AAAAEAAUAAAAIAA4AAAAEAAUAAAALAA4AAAAEAAUAAAAMAA4AAAACAAYAAAANAA0AAAACAAYAAAAOAA0AAAAEAAUAAAAPAA0AAAAEAAUAAAAQAA0AAAAEAAUAAAARAAwAAAACAAUAAAATAAwAAAACAAUAAAAVAAsAAAACAAYAAAAWAAsAAAAEAAUAAAAUAAwAAAACAAYAAAAQAAwAAAACAAMAAAAKAA4AAAAEAAUAAAAJAA4AAAAEAAUAAAAFAA4AAAACAAYAAAAGAA4AAAAEAAUAAAAHAA4AAAAEAAUAAAANAA4AAAACAAYAAAAOAA4AAAACAAYAAAAPAA4AAAACAAYAAAASAA0AAAACAAYAAAATAA0AAAAEAAUAAAAUAA0AAAACAAYAAAAVAA0AAAACAAYAAAAWAA0AAAACAAYAAAAXAA0AAAAEAAUAAAALAA0AAAAEAAUAAAAMAA0AAAACAAYAAAAPAAwAAAACAAMAAAAXAAsAAAAEAAUAAAAYAAsAAAAEAAUAAAAZAAsAAAACAAYAAAAZAAwAAAACAAYAAAAYAAwAAAAEAAUAAAAZAA4AAAAEAAUAAAAXAA4AAAAEAAUAAAAWAA4AAAAEAAUAAAAVAA4AAAACAAYAAAAUAA4AAAACAAYAAAATAA4AAAACAAYAAAASAA4AAAACAAYAAAAYAA4AAAACAAYAAAARAA4AAAACAAYAAAAEAA0AAAACAAYAAAD//w4AAAAEAAEAAAABAAkAAAACAAEAAAAIAAwAAAACAAEAAAAOAAwAAAACAAMAAAANAAwAAAACAAMAAAAMAAwAAAACAAMAAAAUAAkAAAABAAUAAAAUAAoAAAABAAYAAAAPAAgAAAASAAQAABAWAAoAAAACAAYAAAAXAAcAAAACAAUAAAAYAAkAAAACAAYAAAAYAAoAAAACAAYAAAAXAAoAAAACAAYAAAAXAAkAAAACAAYAAAAZAAkAAAACAAYAAAAZAAoAAAACAAYAAAAQAA4AAAAEAAUAAAARAA0AAAACAAYAAAASAAwAAAACAAUAAAAVAAoAAAACAAYAAAAWAAkAAAACAAUAAAAXAAgAAAAEAAEAAAAUAAsAAAAFAAEAAAAVAAwAAAAEAAUAAAAWAAwAAAACAAYAAAAXAAwAAAAEAAUAAAAYAA0AAAACAAYAAAAZAA0AAAAEAAUAAAAAAAwAAAACAAYAAAACAAwAAAACAAYAAAADAAwAAAAEAAUAAAAEAAwAAAACAAYAAAAFAAwAAAAEAAUAAAAGAAwAAAAEAAUAAAAGAA0AAAACAAYAAAAHAA0AAAACAAYAAAAIAA0AAAAEAAUAAAAJAA0AAAACAAYAAAAKAAwAAAACAAEAAAD//wwAAAAFAAAAAAD//wsAAAAEAAAAAAAAAAsAAAAEAAUAAAABAAsAAAACAAYAAAABAAwAAAACAAYAAAAYAAcAAAACAAUAAAAZAAcAAAADAAUAAAAYAAgAAAACAAYAAAAZAAgAAAACAAYAAAAVAAkAAAACAAUAAAADAAsAAAACAAYAAAAEAAsAAAACAAEAAAAFAAsAAAACAAEAAAAGAAsAAAACAAEAAAACAAoAAAACAAEAAAADAAoAAAACAAEAAAARAAcAAAAOAAcAAAASAAcAAAAOAAcAAAAQAAcAAAAOAAcAAAAPAAcAAAANAAcAAAAIAAYAAAANAAcAAAATAAcAAAAPAAcAAAAMAAYAAAAPAAcAAAALAAYAAAAOAAcAAAAKAAYAAAAOAAcAAAABAAgAAAARAAYAAAABAAcAAAAQAAUAAAABAAYAAAARAAUAAAABAAUAAAAQAAUAAAAAAAQAAAASAAIAAAABAAQAAAASAAIAAAACAAQAAAASAAIAAAD//wQAAAARAAIAAAAEAAQAAAATAAIAAAADAAQAAAASAAIAAAAAAAMAAAASAAEAAAABAAMAAAASAAEAAAACAAMAAAASAAEAAAADAAMAAAASAAAAAAAEAAMAAAATAAAAAAD//wMAAAARAAEAAAD//wIAAAARAAEAAAD//wEAAAARAAEAAAAAAAEAAAASAAEAAAAAAAIAAAASAAEAAAABAAEAAAASAAEAAAABAAIAAAASAAEAAAACAAEAAAASAAEAAAACAAIAAAASAAEAAAACAAYAAAATAAQAAAAJAAYAAAAOAAcAAAAJAAwAAAACAAEAAAAIAAMAAAALAAQAAAAHAAMAAAALAAQAAAAGAAMAAAALAAQAAAATAAQAAAALAAQAAAAUAAQAAAALAAQAAAAVAAQAAAALAAQAAAAWAAQAAAALAAQAAAAMAAkAAAALAAQAAAAOAAkAAAALAAQAAAA=") +tile_map_data = PackedByteArray("AAD//wkAAAACAAEAAAD//woAAAAEAAAAAAABAA0AAAACAAYAAAACAA0AAAAEAAUAAAACAA4AAAAEAAUAAAADAA0AAAACAAYAAAABAAoAAAACAAYAAAAAAAoAAAAEAAUAAAAAAAkAAAACAAEAAAACAAsAAAAEAAUAAAAAAA0AAAAEAAUAAAD//w0AAAAEAAEAAAAFAA0AAAAEAAUAAAAEAA4AAAAEAAUAAAADAA4AAAACAAYAAAAAAA4AAAACAAYAAAABAA4AAAACAAYAAAAHAAwAAAACAAEAAAALAAwAAAACAAEAAAAKAA0AAAAEAAUAAAAIAA4AAAAEAAUAAAALAA4AAAAEAAUAAAAMAA4AAAACAAYAAAANAA0AAAACAAYAAAAOAA0AAAAEAAUAAAAPAA0AAAAEAAUAAAAQAA0AAAAEAAUAAAARAAwAAAACAAUAAAATAAwAAAACAAUAAAAVAAsAAAACAAYAAAAWAAsAAAAEAAUAAAAUAAwAAAACAAYAAAAQAAwAAAACAAMAAAAKAA4AAAAEAAUAAAAJAA4AAAAEAAUAAAAFAA4AAAACAAYAAAAGAA4AAAAEAAUAAAAHAA4AAAAEAAUAAAANAA4AAAACAAYAAAAOAA4AAAACAAYAAAAPAA4AAAACAAYAAAASAA0AAAACAAYAAAATAA0AAAAEAAUAAAAUAA0AAAACAAYAAAAVAA0AAAACAAYAAAAWAA0AAAACAAYAAAAXAA0AAAAEAAUAAAALAA0AAAAEAAUAAAAMAA0AAAACAAYAAAAPAAwAAAACAAMAAAAXAAsAAAAEAAUAAAAYAAsAAAAEAAUAAAAZAAsAAAACAAYAAAAZAAwAAAACAAYAAAAYAAwAAAAEAAUAAAAZAA4AAAAEAAUAAAAXAA4AAAAEAAUAAAAWAA4AAAAEAAUAAAAVAA4AAAACAAYAAAAUAA4AAAACAAYAAAATAA4AAAACAAYAAAASAA4AAAACAAYAAAAYAA4AAAACAAYAAAARAA4AAAACAAYAAAAEAA0AAAACAAYAAAD//w4AAAAEAAEAAAABAAkAAAACAAEAAAAIAAwAAAACAAEAAAAOAAwAAAACAAMAAAANAAwAAAACAAMAAAAMAAwAAAACAAMAAAAUAAkAAAABAAUAAAAUAAoAAAABAAYAAAAWAAoAAAACAAYAAAAXAAcAAAACAAUAAAAYAAkAAAACAAYAAAAYAAoAAAACAAYAAAAXAAoAAAACAAYAAAAXAAkAAAACAAYAAAAZAAkAAAACAAYAAAAZAAoAAAACAAYAAAAQAA4AAAAEAAUAAAARAA0AAAACAAYAAAASAAwAAAACAAUAAAAVAAoAAAACAAYAAAAWAAkAAAACAAUAAAAXAAgAAAAEAAEAAAAUAAsAAAAFAAEAAAAVAAwAAAAEAAUAAAAWAAwAAAACAAYAAAAXAAwAAAAEAAUAAAAYAA0AAAACAAYAAAAZAA0AAAAEAAUAAAAAAAwAAAACAAYAAAACAAwAAAACAAYAAAADAAwAAAAEAAUAAAAEAAwAAAACAAYAAAAFAAwAAAAEAAUAAAAGAAwAAAAEAAUAAAAGAA0AAAACAAYAAAAHAA0AAAACAAYAAAAIAA0AAAAEAAUAAAAJAA0AAAACAAYAAAAKAAwAAAACAAEAAAD//wwAAAAFAAAAAAD//wsAAAAEAAAAAAAAAAsAAAAEAAUAAAABAAsAAAACAAYAAAABAAwAAAACAAYAAAAYAAcAAAACAAUAAAAZAAcAAAADAAUAAAAYAAgAAAACAAYAAAAZAAgAAAACAAYAAAAVAAkAAAACAAUAAAADAAsAAAACAAYAAAAEAAsAAAACAAEAAAAFAAsAAAACAAEAAAAGAAsAAAACAAEAAAACAAoAAAACAAEAAAADAAoAAAACAAEAAAARAAcAAAAOAAcAAAASAAcAAAAOAAcAAAAQAAcAAAAOAAcAAAAIAAYAAAANAAcAAAATAAcAAAAPAAcAAAAMAAYAAAAPAAcAAAALAAYAAAAOAAcAAAAKAAYAAAAOAAcAAAABAAgAAAARAAYAAAABAAcAAAAQAAUAAAABAAYAAAARAAUAAAABAAUAAAAQAAUAAAAAAAQAAAASAAIAAAABAAQAAAASAAIAAAACAAQAAAASAAIAAAD//wQAAAARAAIAAAAEAAQAAAATAAIAAAADAAQAAAASAAIAAAAAAAMAAAASAAEAAAABAAMAAAASAAEAAAACAAMAAAASAAEAAAADAAMAAAASAAAAAAAEAAMAAAATAAAAAAD//wMAAAARAAEAAAD//wIAAAARAAEAAAD//wEAAAARAAEAAAAAAAEAAAASAAEAAAAAAAIAAAASAAEAAAABAAEAAAASAAEAAAABAAIAAAASAAEAAAACAAEAAAASAAEAAAACAAIAAAASAAEAAAACAAYAAAATAAQAAAAJAAYAAAAOAAcAAAAJAAwAAAACAAEAAAAPAAcAAAANAAcAAAA=") tile_set = ExtResource("9_yeq8b") [node name="TerrainDetailsA" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=1513560262] @@ -208,7 +208,7 @@ position = Vector2(331, 216) [node name="Enemies" type="Node2D" parent="Level/PrefabInstances" unique_id=93211253] -[node name="BulletRain_01" parent="Level/PrefabInstances/Enemies" instance=ExtResource("20_rain")] +[node name="BulletRain_01" parent="Level/PrefabInstances/Enemies" unique_id=1814844955 instance=ExtResource("20_rain")] position = Vector2(234, 0) [node name="Interactables" type="Node2D" parent="Level/PrefabInstances" unique_id=769532488] diff --git a/scripts/bullet.gd b/scripts/bullet.gd index 8a604b5..0fc314a 100644 --- a/scripts/bullet.gd +++ b/scripts/bullet.gd @@ -1,6 +1,6 @@ extends Area2D -## 弹幕子弹:直线飞行,碰到玩家扣血,撞到地形或超时消失。 +## 弹幕子弹:直线飞行,碰到玩家扣血。 ## 贴图是代码生成的实心圆,不需要额外美术素材。 @export var speed: float = 70.0 @@ -8,6 +8,11 @@ extends Area2D @export var lifetime: float = 8.0 @export var radius: int = 3 @export var bullet_color: Color = Color(1.0, 0.35, 0.7) +## 撞到地形/绳子之类的障碍就消失。 +## 关掉(默认)的话子弹会**穿过一切**,只靠存活时间和出界来回收 +@export var stop_on_obstacle: bool = false +## 掉到这个世界 y 以下就自动回收(默认在关卡底部之外) +@export var despawn_y: float = 340.0 var direction: Vector2 = Vector2.LEFT @@ -48,6 +53,8 @@ func _ready() -> void: circle.radius = float(radius) hit.shape = circle _probe = get_node_or_null("Probe") as RayCast2D + if _probe != null: + _probe.enabled = stop_on_obstacle body_entered.connect(_on_body_entered) @@ -59,12 +66,12 @@ func launch(dir: Vector2, spd: float = -1.0) -> void: func _physics_process(delta: float) -> void: _age += delta - if _age >= lifetime: + if _age >= lifetime or global_position.y > despawn_y: queue_free() return var step := direction * speed * delta - if _probe != null: + if stop_on_obstacle and _probe != null: _probe.target_position = step * 1.5 _probe.force_raycast_update() if _probe.is_colliding(): diff --git a/scripts/bullet_rain.gd b/scripts/bullet_rain.gd index 856ade0..149662b 100644 --- a/scripts/bullet_rain.gd +++ b/scripts/bullet_rain.gd @@ -1,20 +1,19 @@ extends Node2D -## 子弹雨:从天上随机横坐标往下落子弹,密度可以调得很疏。 +## 子弹雨:从天上随机横坐标往下落子弹,密度可以调。 ## -## 落下来的子弹撞到地形、或撞到你铺的「绳子/木板桥」就会消失 —— -## 绳子的碰撞放在 TileSet 的第 2 物理层,只有子弹的探针(mask = 3)会检测它, -## 玩家(mask = 1)和钥匙(跟着玩家的 mask)都不受影响,能直接穿过去。 +## 落下来的子弹**不会被任何东西挡住**(bullet 的 stop_on_obstacle 默认关掉), +## 会一直穿到关卡底下才回收。 const BULLET := preload("res://scenes/prefabs/enemies/bullet.tscn") @export var enabled: bool = true ## 平均多少秒落一颗(数值越大越稀疏) -@export var interval: float = 1.0 +@export var interval: float = 0.4 ## 间隔随机浮动范围(0 = 完全固定节奏) -@export var interval_jitter: float = 0.6 +@export var interval_jitter: float = 0.25 ## 开场后第一次落下的延迟 -@export var start_delay: float = 1.5 +@export var start_delay: float = 1.0 ## 生成高度(相对自己的 y,负数 = 从屏幕上方外面) @export var spawn_y: float = -30.0 ## 水平撒落范围:以自己的 x 为中心,左右各一半 @@ -56,6 +55,7 @@ func drop() -> void: bullet.bullet_color = bullet_color bullet.speed = fall_speed bullet.damage = damage + bullet.stop_on_obstacle = false get_parent().add_child(bullet) bullet.global_position = Vector2( global_position.x + _rng.randf_range(-span * 0.5, span * 0.5),