mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-06-29 15:02:29 +08:00
feat(多人游戏): 实现多人游戏状态同步和单机/多人模式切换
添加多人游戏状态管理,包括连接状态和玩家名称同步 修改WorldManager和EntityBase以支持多人游戏逻辑 在Starter面板中实现单机和多人游戏启动功能
This commit is contained in:
@@ -19,7 +19,6 @@ config/icon="res://icon.svg"
|
|||||||
|
|
||||||
window/size/viewport_width=1280
|
window/size/viewport_width=1280
|
||||||
window/size/viewport_height=720
|
window/size/viewport_height=720
|
||||||
window/size/mode=2
|
|
||||||
|
|
||||||
[dotnet]
|
[dotnet]
|
||||||
|
|
||||||
|
|||||||
@@ -53,9 +53,16 @@ func rebuildAllPlayers(playerNames: Array[String]):
|
|||||||
addPlayerName(i)
|
addPlayerName(i)
|
||||||
@rpc("any_peer")
|
@rpc("any_peer")
|
||||||
func startMultiplayerGame():
|
func startMultiplayerGame():
|
||||||
|
MultiplayerState.isMultiplayer = true
|
||||||
|
WorldManager.rootNode.multiplayer.multiplayer_peer = MultiplayerState.connection
|
||||||
MultiplayerState.playerName = playerNameInput.text
|
MultiplayerState.playerName = playerNameInput.text
|
||||||
|
MultiplayerState.connection = multiplayer.multiplayer_peer
|
||||||
for i in getPlayerNames():
|
for i in getPlayerNames():
|
||||||
EntityBase.generatePlayer(i)
|
EntityBase.generatePlayer(i)
|
||||||
|
UIState.closeCurrentPanel()
|
||||||
|
func startSingleplayerGame():
|
||||||
|
MultiplayerState.isMultiplayer = false
|
||||||
|
EntityBase.generatePlayer(playerNameInput.text)
|
||||||
Wave.next()
|
Wave.next()
|
||||||
UIState.closeCurrentPanel()
|
UIState.closeCurrentPanel()
|
||||||
|
|
||||||
@@ -74,9 +81,7 @@ func _ready():
|
|||||||
)
|
)
|
||||||
startSingleplayerBtn.pressed.connect(
|
startSingleplayerBtn.pressed.connect(
|
||||||
func():
|
func():
|
||||||
EntityBase.generatePlayer(playerNameInput.text)
|
startSingleplayerGame()
|
||||||
Wave.next()
|
|
||||||
UIState.closeCurrentPanel()
|
|
||||||
)
|
)
|
||||||
startMultiplayerBtn.pressed.connect(
|
startMultiplayerBtn.pressed.connect(
|
||||||
func():
|
func():
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ var currentStage: int = 0
|
|||||||
var spawnTime: float = 0
|
var spawnTime: float = 0
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
multiplayer.multiplayer_peer = MultiplayerState.connection
|
||||||
if useStatic:
|
if useStatic:
|
||||||
texture = texture.get_node("staticAnimation")
|
texture = texture.get_node("staticAnimation")
|
||||||
spawnTime = WorldManager.getTime()
|
spawnTime = WorldManager.getTime()
|
||||||
@@ -170,7 +171,7 @@ func _physics_process(_delta: float) -> void:
|
|||||||
velocity = Vector2.ZERO
|
velocity = Vector2.ZERO
|
||||||
if (isPlayer() or is_instance_valid(currentFocusedBoss)) and not charginup and canRunAi:
|
if (isPlayer() or is_instance_valid(currentFocusedBoss)) and not charginup and canRunAi:
|
||||||
if isPlayer():
|
if isPlayer():
|
||||||
if MultiplayerState.playerName == displayName:
|
if MultiplayerState.playerName == displayName or not MultiplayerState.isMultiplayer:
|
||||||
ai()
|
ai()
|
||||||
else:
|
else:
|
||||||
ai()
|
ai()
|
||||||
@@ -180,6 +181,13 @@ func _physics_process(_delta: float) -> void:
|
|||||||
storeEnergy(randf_range(0.01, 0.05 + fields.get(FieldStore.Entity.ENERGY_REGENERATION) - 1), true)
|
storeEnergy(randf_range(0.01, 0.05 + fields.get(FieldStore.Entity.ENERGY_REGENERATION) - 1), true)
|
||||||
trailParticle.emitting = trailing
|
trailParticle.emitting = trailing
|
||||||
|
|
||||||
|
# 同步状态
|
||||||
|
@rpc("any_peer")
|
||||||
|
func syncPosition(player: String, newPosition: Vector2, newVelocity: Vector2):
|
||||||
|
if player != displayName: return
|
||||||
|
position = newPosition
|
||||||
|
velocity = newVelocity
|
||||||
|
|
||||||
# 通用方法
|
# 通用方法
|
||||||
func rebuildWeaponIcons():
|
func rebuildWeaponIcons():
|
||||||
if isPlayer():
|
if isPlayer():
|
||||||
@@ -216,6 +224,9 @@ func move(direction: Vector2, isSprinting: bool = false):
|
|||||||
var currentDirection = sign(direction.x)
|
var currentDirection = sign(direction.x)
|
||||||
if currentDirection != 0:
|
if currentDirection != 0:
|
||||||
lastDirection = currentDirection
|
lastDirection = currentDirection
|
||||||
|
if MultiplayerState.isMultiplayer:
|
||||||
|
print("test")
|
||||||
|
syncPosition.rpc(displayName, position, velocity)
|
||||||
func getSprintInitialDisplace():
|
func getSprintInitialDisplace():
|
||||||
return displace(velocity) * sprintMultiplier
|
return displace(velocity) * sprintMultiplier
|
||||||
func getSprintProgress():
|
func getSprintProgress():
|
||||||
@@ -437,6 +448,7 @@ func kill():
|
|||||||
static func generatePlayer(playerName: String):
|
static func generatePlayer(playerName: String):
|
||||||
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
|
||||||
return player
|
return player
|
||||||
static func generate(
|
static func generate(
|
||||||
entity: PackedScene,
|
entity: PackedScene,
|
||||||
|
|||||||
@@ -20,9 +20,12 @@ static var stateColorMap = {
|
|||||||
ConnectionState.CONNECTED_CLIENT: Color.GREEN,
|
ConnectionState.CONNECTED_CLIENT: Color.GREEN,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static var isMultiplayer: bool = false
|
||||||
static var state: ConnectionState = ConnectionState.DISCONNECTED
|
static var state: ConnectionState = ConnectionState.DISCONNECTED
|
||||||
static var playerName: String
|
static var playerName: String
|
||||||
|
|
||||||
|
static var connection: ENetMultiplayerPeer
|
||||||
|
|
||||||
static var maxPlayer: int = 10
|
static var maxPlayer: int = 10
|
||||||
|
|
||||||
static func isConnected():
|
static func isConnected():
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
class_name WorldManager
|
class_name WorldManager
|
||||||
|
|
||||||
static var rootNode: Node2D
|
static var rootNode: WorldManager
|
||||||
static var tree: SceneTree
|
static var tree: SceneTree
|
||||||
static var runningTime: int = 0
|
static var runningTime: int = 0
|
||||||
static var peer: ENetMultiplayerPeer
|
static var peer: ENetMultiplayerPeer
|
||||||
@@ -10,11 +10,12 @@ func _ready():
|
|||||||
tree = get_tree()
|
tree = get_tree()
|
||||||
rootNode = self
|
rootNode = self
|
||||||
ComponentManager.init()
|
ComponentManager.init()
|
||||||
peer = ENetMultiplayerPeer.new()
|
|
||||||
func _physics_process(delta):
|
func _physics_process(delta):
|
||||||
runningTime += delta * 1000
|
runningTime += delta * 1000
|
||||||
if EntityBase.mobCount() == 0 and runningTime > 3000:
|
if multiplayer.is_server() or not MultiplayerState.isMultiplayer:
|
||||||
UIState.setPanel("MakeFeed")
|
if EntityBase.mobCount() == 0 and runningTime > 3000:
|
||||||
|
Wave.next()
|
||||||
|
UIState.setPanel("MakeFeed")
|
||||||
|
|
||||||
static func getTime():
|
static func getTime():
|
||||||
return runningTime
|
return runningTime
|
||||||
|
|||||||
Reference in New Issue
Block a user