mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-27 22:41:56 +08:00
feat: 添加游戏控制和管理功能
- 新增GameControl节点用于统一处理游戏重启和退出 - 添加GameBusManager管理游戏重启时的资源清理 - 修改Pause和GameOver面板使用新的GameControl - 为EffectController和ItemDropped添加分组管理 - 统一使用WorldManager管理游戏时间
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 = "关于↗"
|
||||
|
||||
@@ -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 = "退出游戏"
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
uid://b63fkg0waovo
|
||||
@@ -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] = []
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
@@ -0,0 +1 @@
|
||||
uid://cf1agt55tt4pu
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user