diff --git a/scenes/level2.tscn b/scenes/level2.tscn new file mode 100644 index 0000000..56e409d --- /dev/null +++ b/scenes/level2.tscn @@ -0,0 +1,263 @@ +[gd_scene format=4 uid="uid://b14qjya7pedi1"] + +[ext_resource type="PackedScene" path="res://scenes/hud.tscn" id="1_g8vcy"] +[ext_resource type="PackedScene" path="res://scenes/death_screen.tscn" id="2_cqal4"] +[ext_resource type="PackedScene" path="res://scenes/level_clear.tscn" id="3_o3sye"] +[ext_resource type="Texture2D" uid="uid://djmk0srfgyafe" path="res://assets/game/backgrounds/cloud_left.png" id="4_24ks5"] +[ext_resource type="Texture2D" uid="uid://dptqmtay4plwp" path="res://assets/game/backgrounds/cloud_trees.png" id="5_s4es8"] +[ext_resource type="Texture2D" uid="uid://dys7320ghojh6" path="res://assets/game/backgrounds/cloud_hills.png" id="6_63e4f"] +[ext_resource type="Texture2D" uid="uid://1b8hp0rm864l" path="res://assets/game/backgrounds/cloud_right.png" id="7_y6lc1"] +[ext_resource type="Script" uid="uid://dxwa7fxghp3a2" path="res://scripts/hidden_passages.gd" id="8_ekhvm"] +[ext_resource type="TileSet" uid="uid://dkowcf1ljh41j" path="res://assets/game/tilesets/kenney_terrain_tileset.tres" id="9_nflru"] +[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"] + +[node name="Main" type="Node2D" unique_id=2061129075] + +[node name="HUD" parent="." unique_id=215179112 instance=ExtResource("1_g8vcy")] + +[node name="DeathScreen" parent="." unique_id=1952687359 instance=ExtResource("2_cqal4")] + +[node name="LevelClear" parent="." unique_id=1589634220 instance=ExtResource("3_o3sye")] + +[node name="Level" type="Node2D" parent="." unique_id=1678372922] + +[node name="Background" type="Node2D" parent="Level" unique_id=702011751] + +[node name="SkyColor" type="Polygon2D" parent="Level/Background" unique_id=22763597] +z_index = -30 +color = Color(0.8509804, 0.9411765, 0.9372549, 1) +polygon = PackedVector2Array(0, 0, 468, 0, 468, 130.0972, 468, 270, 0, 270) + +[node name="CloudBand_01" type="Sprite2D" parent="Level/Background" unique_id=589633713] +z_index = -20 +texture_filter = 1 +position = Vector2(12, 150) +texture = ExtResource("4_24ks5") + +[node name="CloudBand_02" type="Sprite2D" parent="Level/Background" unique_id=225493882] +z_index = -20 +texture_filter = 1 +position = Vector2(36, 150) +texture = ExtResource("5_s4es8") + +[node name="CloudBand_03" type="Sprite2D" parent="Level/Background" unique_id=646834403] +z_index = -20 +texture_filter = 1 +position = Vector2(60, 150) +texture = ExtResource("6_63e4f") + +[node name="CloudBand_04" type="Sprite2D" parent="Level/Background" unique_id=1012727532] +z_index = -20 +texture_filter = 1 +position = Vector2(84, 150) +texture = ExtResource("7_y6lc1") + +[node name="CloudBand_05" type="Sprite2D" parent="Level/Background" unique_id=1685434781] +z_index = -20 +texture_filter = 1 +position = Vector2(108, 150) +texture = ExtResource("4_24ks5") + +[node name="CloudBand_06" type="Sprite2D" parent="Level/Background" unique_id=1425986424] +z_index = -20 +texture_filter = 1 +position = Vector2(132, 150) +texture = ExtResource("5_s4es8") + +[node name="CloudBand_07" type="Sprite2D" parent="Level/Background" unique_id=1333305041] +z_index = -20 +texture_filter = 1 +position = Vector2(156, 150) +texture = ExtResource("6_63e4f") + +[node name="CloudBand_08" type="Sprite2D" parent="Level/Background" unique_id=55356860] +z_index = -20 +texture_filter = 1 +position = Vector2(180, 150) +texture = ExtResource("7_y6lc1") + +[node name="CloudBand_09" type="Sprite2D" parent="Level/Background" unique_id=379152848] +z_index = -20 +texture_filter = 1 +position = Vector2(204, 150) +texture = ExtResource("4_24ks5") + +[node name="CloudBand_10" type="Sprite2D" parent="Level/Background" unique_id=325990577] +z_index = -20 +texture_filter = 1 +position = Vector2(228, 150) +texture = ExtResource("5_s4es8") + +[node name="CloudBand_11" type="Sprite2D" parent="Level/Background" unique_id=1505438200] +z_index = -20 +texture_filter = 1 +position = Vector2(252, 150) +texture = ExtResource("6_63e4f") + +[node name="CloudBand_12" type="Sprite2D" parent="Level/Background" unique_id=190709163] +z_index = -20 +texture_filter = 1 +position = Vector2(276, 150) +texture = ExtResource("7_y6lc1") + +[node name="CloudBand_13" type="Sprite2D" parent="Level/Background" unique_id=349156114] +z_index = -20 +texture_filter = 1 +position = Vector2(300, 150) +texture = ExtResource("4_24ks5") + +[node name="CloudBand_14" type="Sprite2D" parent="Level/Background" unique_id=1838903106] +z_index = -20 +texture_filter = 1 +position = Vector2(324, 150) +texture = ExtResource("5_s4es8") + +[node name="CloudBand_15" type="Sprite2D" parent="Level/Background" unique_id=169474301] +z_index = -20 +texture_filter = 1 +position = Vector2(348, 150) +texture = ExtResource("6_63e4f") + +[node name="CloudBand_16" type="Sprite2D" parent="Level/Background" unique_id=156763289] +z_index = -20 +texture_filter = 1 +position = Vector2(372, 150) +texture = ExtResource("7_y6lc1") + +[node name="CloudBand_17" type="Sprite2D" parent="Level/Background" unique_id=161240142] +z_index = -20 +texture_filter = 1 +position = Vector2(396, 150) +texture = ExtResource("4_24ks5") + +[node name="CloudBand_18" type="Sprite2D" parent="Level/Background" unique_id=1823235224] +z_index = -20 +texture_filter = 1 +position = Vector2(420, 150) +texture = ExtResource("5_s4es8") + +[node name="CloudBand_19" type="Sprite2D" parent="Level/Background" unique_id=2092676382] +z_index = -20 +texture_filter = 1 +position = Vector2(444, 150) +texture = ExtResource("6_63e4f") + +[node name="CloudBand_20" type="Sprite2D" parent="Level/Background" unique_id=124375716] +z_index = -20 +texture_filter = 1 +position = Vector2(468, 150) +texture = ExtResource("7_y6lc1") + +[node name="TerrainTileMaps" type="Node2D" parent="Level" unique_id=652327492] +script = ExtResource("8_ekhvm") + +[node name="TerrainBase" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=91115499] +position = Vector2(9, 9) +tile_map_data = PackedByteArray("AAD//wkAAAACAAEAAAD//woAAAAEAAAAAAABAA0AAAACAAYAAAACAA0AAAAEAAUAAAACAA4AAAAEAAUAAAADAA0AAAACAAYAAAABAAoAAAACAAYAAAAAAAoAAAAEAAUAAAAAAAkAAAACAAEAAAACAAsAAAAEAAUAAAAAAA0AAAAEAAUAAAD//w0AAAAEAAEAAAAFAA0AAAAEAAUAAAAEAA4AAAAEAAUAAAADAA4AAAACAAYAAAAAAA4AAAACAAYAAAABAA4AAAACAAYAAAAHAAwAAAACAAEAAAALAAwAAAACAAEAAAAKAA0AAAAEAAUAAAAIAA4AAAAEAAUAAAALAA4AAAAEAAUAAAAMAA4AAAACAAYAAAANAA0AAAACAAYAAAAOAA0AAAAEAAUAAAAPAA0AAAAEAAUAAAAQAA0AAAAEAAUAAAARAAwAAAACAAUAAAATAAwAAAACAAUAAAAVAAsAAAACAAYAAAAWAAsAAAAEAAUAAAAUAAwAAAACAAYAAAAQAAwAAAACAAMAAAAKAA4AAAAEAAUAAAAJAA4AAAAEAAUAAAAFAA4AAAACAAYAAAAGAA4AAAAEAAUAAAAHAA4AAAAEAAUAAAANAA4AAAACAAYAAAAOAA4AAAACAAYAAAAPAA4AAAACAAYAAAASAA0AAAACAAYAAAATAA0AAAAEAAUAAAAUAA0AAAACAAYAAAAVAA0AAAACAAYAAAAWAA0AAAACAAYAAAAXAA0AAAAEAAUAAAALAA0AAAAEAAUAAAAMAA0AAAACAAYAAAAPAAwAAAACAAMAAAAXAAsAAAAEAAUAAAAYAAsAAAAEAAUAAAAZAAsAAAACAAYAAAAZAAwAAAACAAYAAAAYAAwAAAAEAAUAAAAZAA4AAAAEAAUAAAAXAA4AAAAEAAUAAAAWAA4AAAAEAAUAAAAVAA4AAAACAAYAAAAUAA4AAAACAAYAAAATAA4AAAACAAYAAAASAA4AAAACAAYAAAAYAA4AAAACAAYAAAARAA4AAAACAAYAAAAEAA0AAAACAAYAAAD//w4AAAAEAAEAAAABAAkAAAACAAEAAAAIAAwAAAACAAEAAAAOAAwAAAACAAMAAAANAAwAAAACAAMAAAAMAAwAAAACAAMAAAAUAAkAAAABAAUAAAAUAAoAAAABAAYAAAAPAAgAAAASAAQAABAWAAoAAAACAAYAAAAXAAcAAAACAAUAAAAYAAkAAAACAAYAAAAYAAoAAAACAAYAAAAXAAoAAAACAAYAAAAXAAkAAAACAAYAAAAZAAkAAAACAAYAAAAZAAoAAAACAAYAAAAQAA4AAAAEAAUAAAARAA0AAAACAAYAAAASAAwAAAACAAUAAAAVAAoAAAACAAYAAAAWAAkAAAACAAUAAAAXAAgAAAAEAAEAAAAUAAsAAAAFAAEAAAAVAAwAAAAEAAUAAAAWAAwAAAACAAYAAAAXAAwAAAAEAAUAAAAYAA0AAAACAAYAAAAZAA0AAAAEAAUAAAAAAAwAAAACAAYAAAACAAwAAAACAAYAAAADAAwAAAAEAAUAAAAEAAwAAAACAAYAAAAFAAwAAAAEAAUAAAAGAAwAAAAEAAUAAAAGAA0AAAACAAYAAAAHAA0AAAACAAYAAAAIAA0AAAAEAAUAAAAJAA0AAAACAAYAAAAJAAwAAAACAAEAAAAKAAwAAAACAAEAAAD//wwAAAAFAAAAAAD//wsAAAAEAAAAAAAAAAsAAAAEAAUAAAABAAsAAAACAAYAAAABAAwAAAACAAYAAAAYAAcAAAACAAUAAAAZAAcAAAADAAUAAAAYAAgAAAACAAYAAAAZAAgAAAACAAYAAAAVAAkAAAACAAUAAAADAAsAAAACAAYAAAAEAAsAAAACAAEAAAAFAAsAAAACAAEAAAAGAAsAAAACAAEAAAACAAoAAAACAAEAAAADAAoAAAACAAEAAAARAAcAAAAOAAcAAAASAAcAAAAOAAcAAAAQAAcAAAAOAAcAAAAPAAcAAAANAAcAAAAIAAYAAAANAAcAAAATAAcAAAAPAAcAAAAMAAYAAAAPAAcAAAALAAYAAAAOAAcAAAAKAAYAAAAOAAcAAAAJAAYAAAAOAAcAAAABAAgAAAARAAYAAAABAAcAAAAQAAUAAAABAAYAAAARAAUAAAABAAUAAAAQAAUAAAAAAAQAAAASAAIAAAABAAQAAAASAAIAAAACAAQAAAASAAIAAAD//wQAAAARAAIAAAAEAAQAAAATAAIAAAADAAQAAAASAAIAAAAAAAMAAAASAAEAAAABAAMAAAASAAEAAAACAAMAAAASAAEAAAADAAMAAAASAAAAAAAEAAMAAAATAAAAAAD//wMAAAARAAEAAAD//wIAAAARAAEAAAD//wEAAAARAAEAAAAAAAEAAAASAAEAAAAAAAIAAAASAAEAAAABAAEAAAASAAEAAAABAAIAAAASAAEAAAACAAEAAAASAAEAAAACAAIAAAASAAEAAAACAAYAAAATAAQAAAA=") +tile_set = ExtResource("9_nflru") + +[node name="TerrainDetailsA" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=1513560262] +z_index = 1 +position = Vector2(9, 9) +tile_map_data = PackedByteArray("AAADAA0AAAADAAYAAAABAAwAAAABAAYAAAABAA0AAAABAAYAAAACAAoAAAAIAAYAAAACAAsAAAACAAEAAAADAAsAAAADAAEAAAACAAwAAAACAAYAAAACAA4AAAACAAYAAAAXAAsAAAADAAUAAAAXAAwAAAADAAYAAAAXAA0AAAADAAYAAAAXAA4AAAADAAYAAAAWAAoAAAAEAAcAAAAWAAsAAAACAAUAAAAWAAwAAAAEAAUAAAAWAA0AAAACAAYAAAAWAA4AAAAEAAUAAAAVAAsAAAABAAUAAAAVAAwAAAABAAYAAAAVAA0AAAABAAYAAAAVAA4AAAABAAYAAAAQAA4AAAADAAYAAAAOAA4AAAAEAAUAAAAPAA4AAAACAAYAAAAQAA0AAAADAAMAAAANAA4AAAABAAYAAAAOAAwAAAAEAAYAAAAPAA0AAAACAAMAAAAOAA0AAAACAAMAAAANAA0AAAABAAMAAAAQAAQAAAATAAIAAAAQAAMAAAATAAEAAAAPAAQAAAASAAIAAAAKAAMAAAARAAAAAAAKAAQAAAARAAIAAAALAAMAAAASAAAAAAAMAAMAAAATAAAAAAAOAAIAAAARAAAAAAAPAAIAAAASAAAAAAAOAAMAAAARAAEAAAAMAAQAAAATAAIAAAALAAQAAAASAAIAAAADAAwAAAADAAYAAAAOAAQAAAARAAIAAAAPAAMAAAASAAEAAAAQAAIAAAATAAAAAAACAA0AAAAEAAUAAAABAA4AAAABAAYAAAADAA4AAAADAAYAAAABAAsAAAABAAEAAAAOAAsAAAANAAUAAAAOAAoAAAAPAAUAAAAPAAsAAAANAAYAAAAPAAkAAAANAAYAAAAOAAkAAAANAAQAAAAQAAkAAAAOAAQAAAAQAAoAAAAPAAUAAAAQAAsAAAAOAAUAAAAPAAoAAAASAAcAAAAPAAgAAAAIAAMAAAAUAPz/AAASAAcAAAA=") +tile_set = ExtResource("9_nflru") + +[node name="TerrainDetailsB" type="TileMapLayer" parent="Level/TerrainTileMaps" unique_id=478648603] +z_index = 2 +position = Vector2(9, 9) +tile_map_data = PackedByteArray("AAAGAAwAAAADAAEAAAAGAA0AAAADAAYAAAAFAA4AAAACAAYAAAAFAAsAAAAFAAYAAAAFAAwAAAACAAEAAAAFAA0AAAAEAAUAAAAGAA4AAAADAAYAAAADAAwAAAABAAEAAAADAA0AAAABAAYAAAADAA4AAAABAAYAAAAEAAwAAAACAAEAAAAEAA0AAAACAAYAAAAEAA4AAAAEAAUAAAA=") +tile_set = ExtResource("9_nflru") + +[node name="ActorsAndCharacters" type="Node2D" parent="Level" unique_id=2036761714] + +[node name="Player" parent="Level/ActorsAndCharacters" unique_id=1343528246 instance=ExtResource("10_ikw2v")] +z_index = 10 +position = Vector2(144, 215) +rotation = -3.1415927 +scale = Vector2(1, -1) + +[node name="PrefabInstances" type="Node2D" parent="Level" unique_id=2013556771] + +[node name="Structures" type="Node2D" parent="Level/PrefabInstances" unique_id=1811607442] + +[node name="Hazards" type="Node2D" parent="Level/PrefabInstances" unique_id=888595377] + +[node name="Spikes_01" parent="Level/PrefabInstances/Hazards" unique_id=1025977450 instance=ExtResource("11_cgqhq")] +z_index = 5 +position = Vector2(270, 216) + +[node name="Spikes_02" parent="Level/PrefabInstances/Hazards" unique_id=1262276584 instance=ExtResource("11_cgqhq")] +z_index = 5 +position = Vector2(335, 127) + +[node name="SpikesGrey_01" parent="Level/PrefabInstances/Hazards" unique_id=214833071 instance=ExtResource("12_ttvjw")] +z_index = 5 +position = Vector2(109, 199) + +[node name="SpikesGrey_02" parent="Level/PrefabInstances/Hazards" unique_id=458791480 instance=ExtResource("12_ttvjw")] +z_index = 5 +position = Vector2(331, 216) + +[node name="Enemies" type="Node2D" parent="Level/PrefabInstances"] + +[node name="Walker_01" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")] +position = Vector2(216, 216) + +[node name="Walker_02" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")] +position = Vector2(306, 216) +start_direction = 1 + +[node name="Walker_03" parent="Level/PrefabInstances/Enemies" instance=ExtResource("18_walker")] +position = Vector2(90, 198) +start_direction = 1 + +[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) + +[node name="Collectibles" type="Node2D" parent="Level/PrefabInstances" unique_id=2086540192] + +[node name="CoinGoldRound_01" parent="Level/PrefabInstances/Collectibles" unique_id=926105584 instance=ExtResource("15_odav0")] +z_index = 5 +position = Vector2(79, 56) + +[node name="CoinGoldRound_02" parent="Level/PrefabInstances/Collectibles" unique_id=1674416025 instance=ExtResource("15_odav0")] +z_index = 5 +position = Vector2(179, 111) + +[node name="CoinGoldRound_03" parent="Level/PrefabInstances/Collectibles" unique_id=1087706364 instance=ExtResource("15_odav0")] +z_index = 5 +position = Vector2(219, 54) + +[node name="KeyGold_01" parent="Level/PrefabInstances/Collectibles" unique_id=2060959680 instance=ExtResource("16_3xffc")] +z_index = 5 +position = Vector2(126, 144) + +[node name="Diamond_01" parent="Level/PrefabInstances/Collectibles" unique_id=909237898 instance=ExtResource("17_icuov")] +z_index = 5 +position = Vector2(399, 161) + +[node name="Diamond_02" parent="Level/PrefabInstances/Collectibles" unique_id=234727210 instance=ExtResource("17_icuov")] +z_index = 5 +position = Vector2(204, 217) + +[node name="Diamond_03" parent="Level/PrefabInstances/Collectibles" unique_id=1261326529 instance=ExtResource("17_icuov")] +z_index = 5 +position = Vector2(270, 144) + +[node name="Signs" type="Node2D" parent="Level/PrefabInstances" unique_id=113197076] diff --git a/scenes/main.tscn b/scenes/main.tscn index df84708..bfe28c0 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -25,6 +25,7 @@ [node name="DeathScreen" parent="." unique_id=1952687359 instance=ExtResource("22_death")] [node name="LevelClear" parent="." instance=ExtResource("26_clear")] +next_level_scene = "res://scenes/level2.tscn" [node name="Level" type="Node2D" parent="." unique_id=1678372922] diff --git a/scenes/prefabs/enemies/walker.tscn b/scenes/prefabs/enemies/walker.tscn new file mode 100644 index 0000000..35697dd --- /dev/null +++ b/scenes/prefabs/enemies/walker.tscn @@ -0,0 +1,35 @@ +[gd_scene load_steps=5 format=3] + +[ext_resource type="Texture2D" path="res://assets/game/vegetation/mushroom_red.png" id="1_tex"] +[ext_resource type="Script" path="res://scripts/walker.gd" id="2_walker"] + +[sub_resource type="RectangleShape2D" id="Shape_body"] +size = Vector2(12, 16) + +[sub_resource type="RectangleShape2D" id="Shape_touch"] +size = Vector2(16, 16) + +[node name="Walker" type="CharacterBody2D" groups=["enemy"]] +z_index = 5 +collision_layer = 4 +collision_mask = 1 +script = ExtResource("2_walker") + +[node name="Sprite" type="Sprite2D" parent="."] +texture_filter = 1 +texture = ExtResource("1_tex") + +[node name="Collision" type="CollisionShape2D" parent="."] +shape = SubResource("Shape_body") + +[node name="FloorProbe" type="RayCast2D" parent="."] +position = Vector2(-6, 7) +target_position = Vector2(0, 9) +collision_mask = 1 + +[node name="TouchArea" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 2 + +[node name="TouchShape" type="CollisionShape2D" parent="TouchArea"] +shape = SubResource("Shape_touch") diff --git a/scripts/walker.gd b/scripts/walker.gd new file mode 100644 index 0000000..3eb44fa --- /dev/null +++ b/scripts/walker.gd @@ -0,0 +1,87 @@ +extends CharacterBody2D + +## 小怪:在平台上左右巡逻,碰到玩家扣一颗心; +## 被玩家从上方踩到就死,并且把玩家弹起来。 +## 走到平台边缘会自动掉头,所以不会掉下去。 + +@export var speed: float = 28.0 +@export var damage: int = 1 +## 被踩死时把玩家往上弹的速度 +@export var stomp_bounce: float = -150.0 +## 巡逻方向:-1 向左,1 向右 +@export var start_direction: int = -1 +## 掉头后的冷却时间:防止贴着墙时每帧都掉头、结果原地抖动 +@export var turn_cooldown: float = 0.25 + +var direction: int = -1 +var dead: bool = false + +var _turn_timer: float = 0.0 + +@onready var sprite: Sprite2D = $Sprite +@onready var floor_probe: RayCast2D = $FloorProbe +@onready var touch_area: Area2D = $TouchArea + + +func _ready() -> void: + add_to_group("enemy") + direction = -1 if start_direction < 0 else 1 + _apply_direction() + touch_area.body_entered.connect(_on_touch) + + +func _physics_process(delta: float) -> void: + if dead: + return + + if _turn_timer > 0.0: + _turn_timer -= delta + + if not is_on_floor(): + velocity += get_gravity() * delta + velocity.x = float(direction) * speed + + # 撞到墙 或 前方脚下没有地板 -> 掉头(带冷却,掉头后先走一段再说) + if _turn_timer <= 0.0: + if is_on_wall() or (is_on_floor() and not floor_probe.is_colliding()): + direction = -direction + _turn_timer = turn_cooldown + _apply_direction() + + move_and_slide() + + +func _apply_direction() -> void: + if sprite != null: + sprite.flip_h = direction > 0 + if floor_probe != null: + floor_probe.position.x = float(direction) * 6.0 + + +func _on_touch(body: Node2D) -> void: + if dead or not body.has_method("hurt"): + return + + # 玩家从上往下踩到 -> 小怪死,玩家弹一下 + var p := body as CharacterBody2D + if p != null and p.velocity.y > 0.0 and p.global_position.y < global_position.y - 3.0: + p.velocity.y = stomp_bounce + _die() + return + + body.hurt(damage) + + +func _die() -> void: + dead = true + velocity = Vector2.ZERO + touch_area.set_deferred("monitoring", false) + set_deferred("collision_layer", 0) + set_deferred("collision_mask", 0) + + # 被踩扁 + 淡出 + var tw := create_tween() + tw.set_parallel(true) + tw.tween_property(sprite, "scale", Vector2(1.35, 0.2), 0.12) + tw.tween_property(sprite, "modulate:a", 0.0, 0.3) + tw.chain().tween_callback(queue_free)