mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-28 06:51:54 +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)
|
||||
needBB.count = refreshNeedBaseballCount
|
||||
func finish():
|
||||
Wave.next()
|
||||
WorldManager.rootNode.spawnWave()
|
||||
UIState.closeCurrentPanel()
|
||||
func regenerateCards():
|
||||
updateValue()
|
||||
|
||||
@@ -54,16 +54,16 @@ func rebuildAllPlayers(playerNames: Array[String]):
|
||||
@rpc("any_peer")
|
||||
func startMultiplayerGame():
|
||||
MultiplayerState.isMultiplayer = true
|
||||
WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection
|
||||
MultiplayerState.playerName = playerNameInput.text
|
||||
MultiplayerState.connection = multiplayer.multiplayer_peer
|
||||
WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer
|
||||
for i in getPlayerNames():
|
||||
EntityBase.generatePlayer(i)
|
||||
UIState.closeCurrentPanel()
|
||||
func startSingleplayerGame():
|
||||
MultiplayerState.isMultiplayer = false
|
||||
EntityBase.generatePlayer(playerNameInput.text)
|
||||
Wave.next()
|
||||
WorldManager.rootNode.spawnWave()
|
||||
UIState.closeCurrentPanel()
|
||||
|
||||
func _ready():
|
||||
|
||||
+24
-13
@@ -1,5 +1,6 @@
|
||||
class_name Wave
|
||||
|
||||
# 元数据
|
||||
var entity: String
|
||||
var minCount: int = 1
|
||||
var maxCount: int = 1
|
||||
@@ -7,6 +8,19 @@ var isBoss: bool = false
|
||||
var from: float = 0
|
||||
var to: float = 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 WAVE_NORMAL = [
|
||||
@@ -32,12 +46,6 @@ static var WAVE_TESTBOSS_CHICK = [
|
||||
static var WAVE_EMPTY = []
|
||||
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(
|
||||
entity_: String,
|
||||
minCount_: int = 1,
|
||||
@@ -63,15 +71,18 @@ static func entityCountOf(wave: Wave) -> int:
|
||||
else:
|
||||
return randi_range(ceil(wave.minCount), floor(wave.maxCount * (1 + GameRule.entityCountBoostPerWave * current)))
|
||||
return 0
|
||||
static func spawn():
|
||||
static func spawn() -> Array[Wave]:
|
||||
var result: Array[Wave] = []
|
||||
for i in range(len(data)):
|
||||
var wave = data[i]
|
||||
var wave: Wave = data[i]
|
||||
for j in range(entityCountOf(wave)):
|
||||
EntityBase.generate(ComponentManager.getCharacter(wave.entity), MathTool.randv2_range(500), true, wave.isBoss)
|
||||
static func next():
|
||||
if current == 0:
|
||||
customStart()
|
||||
spawn()
|
||||
var currentWave = wave.duplicate()
|
||||
currentWave.entityPosition = MathTool.randv2_range(500)
|
||||
result.append(currentWave)
|
||||
return result
|
||||
static func next(waves: Array[Wave]):
|
||||
for wave in waves:
|
||||
EntityBase.generate(ComponentManager.getCharacter(wave.entity), wave.entityPosition, true, wave.isBoss)
|
||||
current += 1
|
||||
static func startWith(wave: int):
|
||||
return wave - 1
|
||||
|
||||
@@ -445,7 +445,7 @@ func enterStage(_stage: int):
|
||||
func kill():
|
||||
pass
|
||||
|
||||
static func generatePlayer(playerName: String):
|
||||
static func generatePlayer(playerName: String) -> EntityBase:
|
||||
var player = generate(ComponentManager.getCharacter("Rooster"), Vector2.ZERO, false, false, true)
|
||||
player.displayName = playerName
|
||||
player.name = "Player_%s" % playerName
|
||||
|
||||
@@ -12,10 +12,18 @@ func _ready():
|
||||
ComponentManager.init()
|
||||
func _physics_process(delta):
|
||||
runningTime += delta * 1000
|
||||
if multiplayer.is_server() or not MultiplayerState.isMultiplayer:
|
||||
if EntityBase.mobCount() == 0 and runningTime > 3000:
|
||||
Wave.next()
|
||||
UIState.setPanel("MakeFeed")
|
||||
if EntityBase.mobCount() == 0 and runningTime > 1000:
|
||||
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():
|
||||
return runningTime
|
||||
|
||||
Reference in New Issue
Block a user