diff --git a/components/Scenes/FullscreenPanels/GameOver.tscn b/components/Scenes/FullscreenPanels/GameOver.tscn index a803d77..6da8852 100644 --- a/components/Scenes/FullscreenPanels/GameOver.tscn +++ b/components/Scenes/FullscreenPanels/GameOver.tscn @@ -1,9 +1,10 @@ -[gd_scene format=3 uid="uid://beo6s1kudbbve"] +[gd_scene format=3 uid="uid://b14x2fai2bagp"] [ext_resource type="PackedScene" uid="uid://d3qojeqa3difn" path="res://components/Abstracts/FullscreenPanelBase.tscn" id="1_u2ynr"] [ext_resource type="Script" uid="uid://bub7ku5qf2tpo" path="res://scripts/Contents/Panels/GameOver.gd" id="2_6cd45"] [ext_resource type="FontFile" uid="uid://v3frxpuvtj5o" path="res://resources/fonts/syht-bold.ttf" id="3_2arur"] [ext_resource type="AudioStream" uid="uid://dbso1w8hvgilg" path="res://resources/sounds/effect/Lose.wav" id="3_n4aax"] +[ext_resource type="PackedScene" uid="uid://braggv3vafd83" path="res://components/UI/GameControl.tscn" id="4_idc4g"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_7gbuu"] bg_color = Color(1, 0, 0, 0.3) @@ -48,21 +49,9 @@ text = "[color=gray]死亡原因[/color]" fit_content = true autowrap_mode = 0 -[node name="gameControl" type="HBoxContainer" parent="content/wrapper/container/wrapper" index="1" unique_id=2129714003] -layout_mode = 2 -alignment = 1 - -[node name="returnBtn" type="Button" parent="content/wrapper/container/wrapper/gameControl" index="0" unique_id=1955688444] +[node name="gameControl" parent="content/wrapper/container/wrapper/death" index="2" unique_id=1187018703 instance=ExtResource("4_idc4g")] unique_name_in_owner = true layout_mode = 2 -size_flags_horizontal = 4 -text = "重新开始游戏" - -[node name="exitBtn" type="Button" parent="content/wrapper/container/wrapper/gameControl" index="1" unique_id=1303303813] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 4 -text = "退出游戏" [node name="audio" type="AudioStreamPlayer2D" parent="." index="2" unique_id=2020590816] unique_name_in_owner = true diff --git a/components/Scenes/FullscreenPanels/Pause.tscn b/components/Scenes/FullscreenPanels/Pause.tscn index e9e89bb..59839b0 100644 --- a/components/Scenes/FullscreenPanels/Pause.tscn +++ b/components/Scenes/FullscreenPanels/Pause.tscn @@ -1,14 +1,15 @@ -[gd_scene load_steps=5 format=3 uid="uid://cksonrrx38k36"] +[gd_scene format=3 uid="uid://cksonrrx38k36"] [ext_resource type="PackedScene" uid="uid://d3qojeqa3difn" path="res://components/Abstracts/FullscreenPanelBase.tscn" id="1_q0gd0"] -[ext_resource type="Script" path="res://scripts/Contents/Panels/Pause.gd" id="2_lg6qs"] +[ext_resource type="Script" uid="uid://ba0tgtpjp34k8" path="res://scripts/Contents/Panels/Pause.gd" id="2_lg6qs"] [ext_resource type="FontFile" uid="uid://v3frxpuvtj5o" path="res://resources/fonts/syht-bold.ttf" id="3_jxeor"] +[ext_resource type="PackedScene" uid="uid://braggv3vafd83" path="res://components/UI/GameControl.tscn" id="4_tij4f"] [sub_resource type="LabelSettings" id="LabelSettings_hsvpc"] font = ExtResource("3_jxeor") font_size = 50 -[node name="Pause" instance=ExtResource("1_q0gd0")] +[node name="Pause" unique_id=518412591 instance=ExtResource("1_q0gd0")] offset_top = 0.0 offset_bottom = 0.0 script = ExtResource("2_lg6qs") @@ -16,14 +17,12 @@ script = ExtResource("2_lg6qs") [node name="wrapper" parent="content" index="1"] theme_override_constants/separation = 10 -[node name="text" type="Label" parent="content/wrapper" index="0"] +[node name="text" type="Label" parent="content/wrapper" index="0" unique_id=884780519] layout_mode = 2 size_flags_horizontal = 4 text = "已暂停" label_settings = SubResource("LabelSettings_hsvpc") -[node name="aboutBtn" type="Button" parent="content/wrapper" index="1"] +[node name="gameControl" parent="content/wrapper" index="1" unique_id=1187018703 instance=ExtResource("4_tij4f")] unique_name_in_owner = true layout_mode = 2 -size_flags_horizontal = 4 -text = "关于↗" diff --git a/components/UI/GameControl.tscn b/components/UI/GameControl.tscn new file mode 100644 index 0000000..7345b53 --- /dev/null +++ b/components/UI/GameControl.tscn @@ -0,0 +1,19 @@ +[gd_scene format=3 uid="uid://braggv3vafd83"] + +[ext_resource type="Script" uid="uid://b63fkg0waovo" path="res://scripts/Statemachine/GameControl.gd" id="1_t5a04"] + +[node name="GameControl" type="HBoxContainer" unique_id=1187018703] +size_flags_horizontal = 4 +script = ExtResource("1_t5a04") + +[node name="returnBtn" type="Button" parent="." unique_id=2089710932] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "重新开始游戏" + +[node name="exitBtn" type="Button" parent="." unique_id=100260653] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 4 +text = "退出游戏" diff --git a/scripts/Contents/Characters/PlayerBase.gd b/scripts/Contents/Characters/PlayerBase.gd index de08a00..446c8d6 100644 --- a/scripts/Contents/Characters/PlayerBase.gd +++ b/scripts/Contents/Characters/PlayerBase.gd @@ -52,7 +52,7 @@ func tryLaunch(action: String, weaponIndex: int): var weapon = weapons[weaponIndex] if weapon.emitType == Weapon.EmitType.CHARGE: if weapon.canAttackBy(self ): - chargeStartTime[weaponIndex] = Time.get_ticks_msec() + chargeStartTime[weaponIndex] = WorldManager.getTime() chargeParticle.emitting = true chargeParticle.speed_scale = 1 elif weapon.emitType == Weapon.EmitType.CLICK_SHOOT || weapon.emitType == Weapon.EmitType.HOLD_LOOP: @@ -70,7 +70,7 @@ func tryLaunch(action: String, weaponIndex: int): if weapon.emitType == Weapon.EmitType.CHARGE: if chargeStartTime.has(weaponIndex): var startTime = chargeStartTime[weaponIndex] - var endTime = Time.get_ticks_msec() + var endTime = WorldManager.getTime() var chargedTime = endTime - startTime chargeStartTime.erase(weaponIndex) weapon.chargedTime = chargedTime * self.fields.get(FieldStore.Entity.CHARGE_SPEED) diff --git a/scripts/Contents/Characters/Rooster.gd b/scripts/Contents/Characters/Rooster.gd index 0289754..3d34fde 100644 --- a/scripts/Contents/Characters/Rooster.gd +++ b/scripts/Contents/Characters/Rooster.gd @@ -52,7 +52,7 @@ func tryLaunch(action: String, weaponIndex: int): var weapon = weapons[weaponIndex] if weapon.emitType == Weapon.EmitType.CHARGE: if weapon.canAttackBy(self ): - chargeStartTime[weaponIndex] = Time.get_ticks_msec() + chargeStartTime[weaponIndex] = WorldManager.getTime() chargeParticle.emitting = true chargeParticle.speed_scale = 1 elif weapon.emitType == Weapon.EmitType.CLICK_SHOOT || weapon.emitType == Weapon.EmitType.HOLD_LOOP: @@ -70,7 +70,7 @@ func tryLaunch(action: String, weaponIndex: int): if weapon.emitType == Weapon.EmitType.CHARGE: if chargeStartTime.has(weaponIndex): var startTime = chargeStartTime[weaponIndex] - var endTime = Time.get_ticks_msec() + var endTime = WorldManager.getTime() var chargedTime = endTime - startTime chargeStartTime.erase(weaponIndex) weapon.chargedTime = chargedTime * self.fields.get(FieldStore.Entity.CHARGE_SPEED) diff --git a/scripts/Contents/Panels/GameOver.gd b/scripts/Contents/Panels/GameOver.gd index bef42bc..5c9fc9f 100644 --- a/scripts/Contents/Panels/GameOver.gd +++ b/scripts/Contents/Panels/GameOver.gd @@ -3,23 +3,7 @@ extends FullscreenPanelBase @onready var audio: AudioStreamPlayer2D = $%audio @onready var deadreason: RichTextLabel = $%deadreason -@onready var returnBtn: Button = $%returnBtn -@onready var exitBtn: Button = $%exitBtn - -func _ready(): - returnBtn.pressed.connect( - func(): - returnBtn.disabled = true - for bullet in get_tree().get_nodes_in_group("bullets"): - bullet.queue_free() - for entity in get_tree().get_nodes_in_group("entities"): - entity.queue_free() - UIState.setPanel("Starter") - ) - exitBtn.pressed.connect( - func(): - get_tree().quit() - ) +@onready var gameControl: GameControl = $%gameControl func beforeOpen(args: Array = []): audio.play() @@ -28,5 +12,4 @@ func beforeOpen(args: Array = []): for item in OutGameStorage.inventory: OutGameStorage.inventory[item] += UIState.player.inventory[item] func afterOpen(_args: Array = []): - returnBtn.disabled = false - exitBtn.disabled = false + gameControl.enable() diff --git a/scripts/Contents/Panels/Pause.gd b/scripts/Contents/Panels/Pause.gd index f8cd5d0..540f868 100644 --- a/scripts/Contents/Panels/Pause.gd +++ b/scripts/Contents/Panels/Pause.gd @@ -1,10 +1,7 @@ @tool extends FullscreenPanelBase -@onready var aboutBtn: Button = $"%aboutBtn" +@onready var gameControl: GameControl = $%gameControl -func _ready(): - aboutBtn.pressed.connect( - func(): - UIState.setPanel("Thanks") - ) +func afterOpen(_args: Array = []): + gameControl.enable() diff --git a/scripts/Statemachine/CycleTimer.gd b/scripts/Statemachine/CycleTimer.gd index f7f50b0..14f43d8 100644 --- a/scripts/Statemachine/CycleTimer.gd +++ b/scripts/Statemachine/CycleTimer.gd @@ -8,10 +8,10 @@ var distance: float = 200 var bullets: Array[BulletBase] = [] func start(): - startTime = Time.get_ticks_msec() + startTime = WorldManager.getTime() running = true func lifetime(): - return Time.get_ticks_msec() - startTime + return WorldManager.getTime() - startTime func getStateAngle(index: int): return lifetime() / period * deg_to_rad(360) - deg_to_rad(360.0 * index / len(bullets)) func forceFilter(): diff --git a/scripts/Statemachine/EffectController.gd b/scripts/Statemachine/EffectController.gd index 14efb3f..73537d6 100644 --- a/scripts/Statemachine/EffectController.gd +++ b/scripts/Statemachine/EffectController.gd @@ -59,4 +59,5 @@ static func create(scene: PackedScene, spawnPosition: Vector2, parent: Node = nu parent.add_child(cloned) else: WorldManager.rootNode.add_child(cloned) + cloned.add_to_group("effects") return cloned diff --git a/scripts/Statemachine/GameControl.gd b/scripts/Statemachine/GameControl.gd new file mode 100644 index 0000000..b6530b9 --- /dev/null +++ b/scripts/Statemachine/GameControl.gd @@ -0,0 +1,25 @@ +extends Control +class_name GameControl + +@onready var returnBtn: Button = $%returnBtn +@onready var exitBtn: Button = $%exitBtn + +func _ready(): + returnBtn.pressed.connect( + func(): + disable() + GameBusManager.restart(get_tree()) + ) + exitBtn.pressed.connect( + func(): + disable() + get_tree().quit() + ) + enable() + +func enable(): + returnBtn.disabled = false + exitBtn.disabled = false +func disable(): + returnBtn.disabled = true + exitBtn.disabled = true diff --git a/scripts/Statemachine/GameControl.gd.uid b/scripts/Statemachine/GameControl.gd.uid new file mode 100644 index 0000000..2479160 --- /dev/null +++ b/scripts/Statemachine/GameControl.gd.uid @@ -0,0 +1 @@ +uid://b63fkg0waovo diff --git a/scripts/Statemachine/ItemDropped.gd b/scripts/Statemachine/ItemDropped.gd index b1a3143..cf2f500 100644 --- a/scripts/Statemachine/ItemDropped.gd +++ b/scripts/Statemachine/ItemDropped.gd @@ -64,6 +64,7 @@ static func generate( WorldManager.rootNode.call_deferred("add_child", instance) instance.add_to_group("drops") instance.refindPlayer(WorldManager.tree) + instance.add_to_group("items") return instance static func getDrops() -> Array[ItemDropped]: var result: Array[ItemDropped] = [] diff --git a/scripts/Tools/Managers/CameraManager.gd b/scripts/Tools/Managers/CameraManager.gd index c4e9c53..8f09821 100644 --- a/scripts/Tools/Managers/CameraManager.gd +++ b/scripts/Tools/Managers/CameraManager.gd @@ -7,6 +7,7 @@ class_name CameraManager @onready var animator: AnimationPlayer = $"%animator" var shakeIntensity: float = 0 +var shaking: bool = false static var instance: CameraManager = null @@ -25,8 +26,11 @@ static func shake(millseconds: float, intensity: float = 10, steper: Callable = await TickTool.until( func(): instance.shakeIntensity = steper.call(instance.shakeIntensity, intensity, 1 - (WorldManager.getTime() - startTime) / millseconds) - return WorldManager.getTime() - startTime >= millseconds + return WorldManager.getTime() - startTime >= millseconds || !instance.shaking ) instance.shakeIntensity = 0 +static func shakeStop(): + instance.shaking = false + instance.shakeIntensity = 0 static func playAnimation(animation: String): instance.animator.play(animation) diff --git a/scripts/Tools/Managers/GameBusManager.gd b/scripts/Tools/Managers/GameBusManager.gd new file mode 100644 index 0000000..c7e0049 --- /dev/null +++ b/scripts/Tools/Managers/GameBusManager.gd @@ -0,0 +1,14 @@ +class_name GameBusManager + +static func restart(tree: SceneTree): + for bullet in tree.get_nodes_in_group("bullets"): + bullet.queue_free() + for entity in tree.get_nodes_in_group("entities"): + entity.queue_free() + for effect in tree.get_nodes_in_group("effects"): + effect.queue_free() + for item in tree.get_nodes_in_group("items"): + item.queue_free() + CameraManager.shakeStop() + WorldManager.timeRestart() + UIState.setPanel("Starter") diff --git a/scripts/Tools/Managers/GameBusManager.gd.uid b/scripts/Tools/Managers/GameBusManager.gd.uid new file mode 100644 index 0000000..712d0e5 --- /dev/null +++ b/scripts/Tools/Managers/GameBusManager.gd.uid @@ -0,0 +1 @@ +uid://cf1agt55tt4pu diff --git a/scripts/Tools/Managers/WorldManager.gd b/scripts/Tools/Managers/WorldManager.gd index 918b887..3c4f3a2 100644 --- a/scripts/Tools/Managers/WorldManager.gd +++ b/scripts/Tools/Managers/WorldManager.gd @@ -38,6 +38,8 @@ func spawn(node: Node): func justReturn(data): return ArrayTool.parseEncodedObject(data)[0] +static func timeRestart(): + runningTime = 0 static func getTime(): return runningTime static func spawnNode(node: Node):