1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-06-12 22:57:13 +08:00

feat: 添加游戏控制和管理功能

- 新增GameControl节点用于统一处理游戏重启和退出
- 添加GameBusManager管理游戏重启时的资源清理
- 修改Pause和GameOver面板使用新的GameControl
- 为EffectController和ItemDropped添加分组管理
- 统一使用WorldManager管理游戏时间
This commit is contained in:
2026-05-05 06:51:48 +08:00
parent f6e71507ce
commit 30527a18a8
16 changed files with 89 additions and 53 deletions
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -19
View File
@@ -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()
+3 -6
View File
@@ -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()
+2 -2
View File
@@ -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():
+1
View File
@@ -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
+25
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
uid://b63fkg0waovo
+1
View File
@@ -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] = []
+5 -1
View File
@@ -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)
+14
View File
@@ -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
+2
View File
@@ -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):