Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
P
paopao
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
cocktail-party
paopao
Commits
2d65fd99
提交
2d65fd99
authored
3月 19, 2026
作者:
lidongxu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修复分数显示问题
上级
dbee07b8
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
48 行增加
和
17 行删除
+48
-17
gameinfo.js
big-screen/src/renderer/gameinfo.js
+10
-6
socket.js
big-screen/src/socket.js
+7
-4
roomHandler.js
server/src/socket/roomHandler.js
+31
-7
没有找到文件。
big-screen/src/renderer/gameinfo.js
浏览文件 @
2d65fd99
...
...
@@ -428,15 +428,19 @@ function drawTeamScoreBig(ctx, x, y, team, score, isWinner) {
ctx
.
fillStyle
=
color
ctx
.
fillText
(
`
${
team
}
队`
,
x
,
y
-
28
)
// 分数(胜利方更大更亮)
// 分数(胜利方更大更亮
,失败方暗淡
)
ctx
.
font
=
isWinner
?
'bold 56px Arial'
:
'bold 42px Arial'
ctx
.
shadowColor
=
glowColor
ctx
.
shadowBlur
=
isWinner
?
30
:
0
const
sg
=
ctx
.
createLinearGradient
(
x
-
50
,
0
,
x
+
50
,
0
)
sg
.
addColorStop
(
0
,
'#FDE68A'
)
sg
.
addColorStop
(
0.5
,
'#FCD34D'
)
sg
.
addColorStop
(
1
,
'#F59E0B'
)
ctx
.
fillStyle
=
sg
if
(
isWinner
)
{
const
sg
=
ctx
.
createLinearGradient
(
x
-
50
,
0
,
x
+
50
,
0
)
sg
.
addColorStop
(
0
,
'#FDE68A'
)
sg
.
addColorStop
(
0.5
,
'#FCD34D'
)
sg
.
addColorStop
(
1
,
'#F59E0B'
)
ctx
.
fillStyle
=
sg
}
else
{
ctx
.
fillStyle
=
'rgba(180,160,130,0.5)'
}
ctx
.
fillText
(
String
(
score
),
x
,
y
+
15
)
ctx
.
shadowBlur
=
0
...
...
big-screen/src/socket.js
浏览文件 @
2d65fd99
...
...
@@ -152,15 +152,18 @@ function _dispatch(event, data) {
*/
case
'room:gameOver'
:
{
console
.
log
(
'[Socket] room:gameOver'
,
data
)
// 处理所有玩家的分数
(新格式)
// 处理所有玩家的分数
和队伍信息
if
(
data
?.
scores
)
{
Object
.
entries
(
data
.
scores
).
forEach
(([
pid
,
score
])
=>
{
// 使用对应玩家的昵称,如果没有则使用广播中的昵称
const
numPid
=
Number
(
pid
)
const
playerNickname
=
data
.
nicknames
?.[
pid
]
||
data
.
nickname
setPlayerGameOver
(
Number
(
pid
),
score
,
playerNickname
)
// 更新队伍信息(确保结果页分组正确)
if
(
data
.
teams
?.[
pid
])
{
setPlayerTeam
(
numPid
,
data
.
teams
[
pid
])
}
setPlayerGameOver
(
numPid
,
score
,
playerNickname
)
})
}
else
if
(
data
?.
playerId
!==
undefined
)
{
// 兼容旧格式:单个玩家分数
setPlayerGameOver
(
data
.
playerId
,
data
.
score
,
data
.
nickname
)
}
break
...
...
server/src/socket/roomHandler.js
浏览文件 @
2d65fd99
...
...
@@ -156,6 +156,28 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, ro
return
;
}
// 服务端强制校验队伍人数,防止并发导致某队超员
const
perTeamSeats
=
Math
.
floor
(
waiting
.
totalSeats
/
2
);
let
finalTeam
=
team
||
'A'
;
const
teamACount
=
waiting
.
players
.
filter
(
p
=>
p
.
team
===
'A'
).
length
;
const
teamBCount
=
waiting
.
players
.
filter
(
p
=>
p
.
team
===
'B'
).
length
;
if
(
finalTeam
===
'A'
&&
teamACount
>=
perTeamSeats
)
{
// A队已满,自动分配到B队
if
(
teamBCount
>=
perTeamSeats
)
{
ws
.
sendEvent
(
'error'
,
{
message
:
'两队均已满员'
});
return
;
}
finalTeam
=
'B'
;
}
else
if
(
finalTeam
===
'B'
&&
teamBCount
>=
perTeamSeats
)
{
// B队已满,自动分配到A队
if
(
teamACount
>=
perTeamSeats
)
{
ws
.
sendEvent
(
'error'
,
{
message
:
'两队均已满员'
});
return
;
}
finalTeam
=
'A'
;
}
// 分配递增 playerId
const
nextId
=
(
roomPlayerCounter
.
get
(
rid
)
||
0
)
+
1
;
roomPlayerCounter
.
set
(
rid
,
nextId
);
...
...
@@ -164,7 +186,7 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, ro
const
playerInfo
=
{
playerId
:
nextId
,
nickname
:
nickname
||
`玩家
${
nextId
}
`
,
team
:
team
||
'A'
team
:
finalTeam
};
// 加入等待表
...
...
@@ -182,8 +204,8 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, ro
console
.
log
(
`[Room] 玩家加入房间
${
rid
}
,playerId=
${
nextId
}
,team=
${
playerInfo
.
team
}
,当前
${
joinedCount
}
/
${
totalSeats
}
`
);
// 通知自己加入成功
ws
.
sendEvent
(
'room:joined'
,
{
roomId
:
rid
,
joinedCount
,
totalSeats
,
playerId
:
nextId
,
players
,
myPlayerId
:
nextId
});
// 通知自己加入成功
(含最终分配的队伍,可能因满员被调整)
ws
.
sendEvent
(
'room:joined'
,
{
roomId
:
rid
,
joinedCount
,
totalSeats
,
playerId
:
nextId
,
players
,
myPlayerId
:
nextId
,
team
:
finalTeam
});
// 广播给房间内所有人(含房主,broadcastToRoom 排除自身,自己单独 send)
broadcastToRoom
(
rid
,
'room:playerJoined'
,
{
roomId
:
rid
,
joinedCount
,
totalSeats
,
players
});
...
...
@@ -243,12 +265,12 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, ro
data
:
{
status
:
'finished'
},
});
// 收集该玩家的分数
// 收集该玩家的分数
和队伍
if
(
!
gameOverScores
.
has
(
roomId
))
{
gameOverScores
.
set
(
roomId
,
new
Map
());
}
const
roomScores
=
gameOverScores
.
get
(
roomId
);
roomScores
.
set
(
playerId
,
{
score
:
score
??
0
,
nickname
});
roomScores
.
set
(
playerId
,
{
score
:
score
??
0
,
nickname
,
team
:
ws
.
ctx
.
team
});
// 获取房间内所有连接的 minigame 玩家数量
const
subs
=
roomSubscribers
.
get
(
roomId
);
...
...
@@ -258,14 +280,16 @@ function registerRoomHandlers(ws, { broadcastToRoom, joinRoom, leaveAllRooms, ro
console
.
log
(
`[Room] 游戏结束分数收集 roomId=
${
roomId
}
playerId=
${
playerId
}
score=
${
score
??
0
}
(
$
{
reportedPlayers
}
/${totalPlayers}
)
`
)
;
// 广播当前收集到的分数给所有人(
让客户端可以实时显示
)
// 广播当前收集到的分数给所有人(
含队伍信息,让客户端/大屏正确分组
)
const
scoresObj
=
{};
const
nicknamesObj
=
{};
const
teamsObj
=
{};
for
(
const
[
pid
,
data
]
of
roomScores
)
{
scoresObj
[
pid
]
=
data
.
score
;
nicknamesObj
[
pid
]
=
data
.
nickname
;
teamsObj
[
pid
]
=
data
.
team
;
}
broadcastToRoom
(
roomId
,
'room:gameOver'
,
{
roomId
,
scores
:
scoresObj
,
nicknames
:
nicknamesObj
,
playerId
,
nickname
});
broadcastToRoom
(
roomId
,
'room:gameOver'
,
{
roomId
,
scores
:
scoresObj
,
nicknames
:
nicknamesObj
,
teams
:
teamsObj
,
playerId
,
nickname
});
// 如果所有玩家都已上报分数,清理收集表
if
(
reportedPlayers
>=
totalPlayers
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论