mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-07-07 10:42:13 +08:00
refactor(wave): 重构波次生成逻辑以支持多人游戏
将波次生成逻辑拆分为数据准备和实体生成两个阶段,便于多人游戏同步 修改 Wave 类以支持实例数据复制 更新相关调用点使用新的波次生成方式
This commit is contained in:
@@ -50,7 +50,7 @@ func updateValue():
|
|||||||
countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount)
|
countLabel.text = str(UIState.player.fields[FieldStore.Entity.FEED_COUNT_CAN_MADE] - selectedCount)
|
||||||
needBB.count = refreshNeedBaseballCount
|
needBB.count = refreshNeedBaseballCount
|
||||||
func finish():
|
func finish():
|
||||||
Wave.next()
|
WorldManager.rootNode.spawnWave()
|
||||||
UIState.closeCurrentPanel()
|
UIState.closeCurrentPanel()
|
||||||
func regenerateCards():
|
func regenerateCards():
|
||||||
updateValue()
|
updateValue()
|
||||||
|
|||||||
@@ -54,16 +54,16 @@ func rebuildAllPlayers(playerNames: Array[String]):
|
|||||||
@rpc("any_peer")
|
@rpc("any_peer")
|
||||||
func startMultiplayerGame():
|
func startMultiplayerGame():
|
||||||
MultiplayerState.isMultiplayer = true
|
MultiplayerState.isMultiplayer = true
|
||||||
WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection
|
|
||||||
MultiplayerState.playerName = playerNameInput.text
|
MultiplayerState.playerName = playerNameInput.text
|
||||||
MultiplayerState.connection = multiplayer.multiplayer_peer
|
MultiplayerState.connection = multiplayer.multiplayer_peer
|
||||||
|
WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer
|
||||||
for i in getPlayerNames():
|
for i in getPlayerNames():
|
||||||
EntityBase.generatePlayer(i)
|
EntityBase.generatePlayer(i)
|
||||||
UIState.closeCurrentPanel()
|
UIState.closeCurrentPanel()
|
||||||
func startSingleplayerGame():
|
func startSingleplayerGame():
|
||||||
MultiplayerState.isMultiplayer = false
|
MultiplayerState.isMultiplayer = false
|
||||||
EntityBase.generatePlayer(playerNameInput.text)
|
EntityBase.generatePlayer(playerNameInput.text)
|
||||||
Wave.next()
|
WorldManager.rootNode.spawnWave()
|
||||||
UIState.closeCurrentPanel()
|
UIState.closeCurrentPanel()
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
|||||||
+24
-13
@@ -1,5 +1,6 @@
|
|||||||
class_name Wave
|
class_name Wave
|
||||||
|
|
||||||
|
# 元数据
|
||||||
var entity: String
|
var entity: String
|
||||||
var minCount: int = 1
|
var minCount: int = 1
|
||||||
var maxCount: int = 1
|
var maxCount: int = 1
|
||||||
@@ -7,6 +8,19 @@ var isBoss: bool = false
|
|||||||
var from: float = 0
|
var from: float = 0
|
||||||
var to: float = 0
|
var to: float = 0
|
||||||
var per: int = 0
|
var per: int = 0
|
||||||
|
# 实例数据
|
||||||
|
var entityPosition: Vector2
|
||||||
|
|
||||||
|
func duplicate() -> Wave:
|
||||||
|
var wave = Wave.new()
|
||||||
|
wave.entity = entity
|
||||||
|
wave.minCount = minCount
|
||||||
|
wave.maxCount = maxCount
|
||||||
|
wave.isBoss = isBoss
|
||||||
|
wave.from = from
|
||||||
|
wave.to = to
|
||||||
|
wave.per = per
|
||||||
|
return wave
|
||||||
|
|
||||||
static var current: int = startWith(1)
|
static var current: int = startWith(1)
|
||||||
static var WAVE_NORMAL = [
|
static var WAVE_NORMAL = [
|
||||||
@@ -32,12 +46,6 @@ static var WAVE_TESTBOSS_CHICK = [
|
|||||||
static var WAVE_EMPTY = []
|
static var WAVE_EMPTY = []
|
||||||
static var data = WAVE_NORMAL
|
static var data = WAVE_NORMAL
|
||||||
|
|
||||||
static func customStart():
|
|
||||||
if false:
|
|
||||||
var furryr = EntityBase.generate(ComponentManager.getCharacter("Bear"), MathTool.randv2_range(500), true, false)
|
|
||||||
var kukemc = EntityBase.generate(ComponentManager.getCharacter("KukeMC"), MathTool.randv2_range(500), true, false)
|
|
||||||
furryr.currentFocusedBoss = kukemc
|
|
||||||
kukemc.currentFocusedBoss = furryr
|
|
||||||
static func create(
|
static func create(
|
||||||
entity_: String,
|
entity_: String,
|
||||||
minCount_: int = 1,
|
minCount_: int = 1,
|
||||||
@@ -63,15 +71,18 @@ static func entityCountOf(wave: Wave) -> int:
|
|||||||
else:
|
else:
|
||||||
return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current)))
|
return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current)))
|
||||||
return 0
|
return 0
|
||||||
static func spawn():
|
static func spawn() -> Array[Wave]:
|
||||||
|
var result: Array[Wave] = []
|
||||||
for i in range(len(data)):
|
for i in range(len(data)):
|
||||||
var wave = data[i]
|
var wave: Wave = data[i]
|
||||||
for j in range(entityCountOf(wave)):
|
for j in range(entityCountOf(wave)):
|
||||||
EntityBase.generate(ComponentManager.getCharacter(wave.entity), MathTool.randv2_range(500), true, wave.isBoss)
|
var currentWave = wave.duplicate()
|
||||||
static func next():
|
currentWave.entityPosition = MathTool.randv2_range(500)
|
||||||
if current == 0:
|
result.append(currentWave)
|
||||||
customStart()
|
return result
|
||||||
spawn()
|
static func next(waves: Array[Wave]):
|
||||||
|
for wave in waves:
|
||||||
|
EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss)
|
||||||
current += 1
|
current += 1
|
||||||
static func startWith(wave: int):
|
static func startWith(wave: int):
|
||||||
return wave - 1
|
return wave - 1
|
||||||
|
|||||||
@@ -445,7 +445,7 @@ func enterStage(_stage: int):
|
|||||||
func kill():
|
func kill():
|
||||||
pass
|
pass
|
||||||
|
|
||||||
static func generatePlayer(playerName: String):
|
static func generatePlayer(playerName: String) -> EntityBase:
|
||||||
var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true)
|
var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true)
|
||||||
player.displayName = playerName
|
player.displayName = playerName
|
||||||
player.name = "Player_%s" % playerName
|
player.name = "Player_%s" % playerName
|
||||||
|
|||||||
@@ -12,10 +12,18 @@ func _ready():
|
|||||||
ComponentManager.init()
|
ComponentManager.init()
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
runningTime += delta * 1000
|
runningTime += delta * 1000
|
||||||
if multiplayer.is_server() or not MultiplayerState.isMultiplayer:
|
if EntityBase.mobCount() == 0 and runningTime > 1000:
|
||||||
if EntityBase.mobCount() == 0 and runningTime > 3000:
|
UIState.setPanel("MakeFeed")
|
||||||
Wave.next()
|
|
||||||
UIState.setPanel("MakeFeed")
|
@rpc("authority")
|
||||||
|
func nextWave(waves: Array[Wave]):
|
||||||
|
Wave.next(waves)
|
||||||
|
|
||||||
|
func spawnWave():
|
||||||
|
var waves = Wave.spawn()
|
||||||
|
nextWave(waves)
|
||||||
|
if MultiplayerState.isMultiplayer and multiplayer.is_server():
|
||||||
|
nextWave.rpc(waves)
|
||||||
|
|
||||||
static func getTime():
|
static func getTime():
|
||||||
return runningTime
|
return runningTime
|
||||||
|
|||||||
Reference in New Issue
Block a user