Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
F
fc-minigame
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈冲
fc-minigame
Commits
82ea5e29
Commit
82ea5e29
authored
Jun 17, 2026
by
董政锦
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 注释 PC game2-5的本地模式模拟数据;
parent
d82cb786
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
157 additions
and
168 deletions
+157
-168
Game.vue
frontend-large/src/pages/game2/Game.vue
+14
-12
Rank1View.vue
frontend-large/src/pages/game2/views/Rank1View.vue
+44
-40
Game3.vue
frontend-large/src/pages/game3/Game3.vue
+5
-5
Rank1View.vue
frontend-large/src/pages/game3/views/Rank1View.vue
+48
-51
Game4.vue
frontend-large/src/pages/game4/Game4.vue
+17
-15
Rank1View.vue
frontend-large/src/pages/game4/views/Rank1View.vue
+16
-14
Game5.vue
frontend-large/src/pages/game5/Game5.vue
+3
-22
Rank1View.vue
frontend-large/src/pages/game5/views/Rank1View.vue
+10
-9
No files found.
frontend-large/src/pages/game2/Game.vue
View file @
82ea5e29
...
@@ -47,11 +47,7 @@ const mockPlayers = [
...
@@ -47,11 +47,7 @@ const mockPlayers = [
{
userid
:
'local-10'
,
nickname
:
'踏雪无痕'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger'
,
score
:
18
},
{
userid
:
'local-10'
,
nickname
:
'踏雪无痕'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger'
,
score
:
18
},
];
];
const
loadingPlayers
=
ref
<
any
[]
>
(
const
loadingPlayers
=
ref
<
any
[]
>
(
Array
.
from
({
length
:
PLAYER_LIMIT
},
emptyLoadingPlayer
))
$is_local_mode
()
?
mockPlayers
:
Array
.
from
({
length
:
PLAYER_LIMIT
},
emptyLoadingPlayer
)
)
const
playerCount
=
ref
(
0
)
const
playerCount
=
ref
(
0
)
const
rankPlayers
=
ref
<
Player
[]
>
(
Array
.
from
({
length
:
RANK_LIMIT
},
(
_
,
index
)
=>
emptyRankPlayer
(
index
)))
const
rankPlayers
=
ref
<
Player
[]
>
(
Array
.
from
({
length
:
RANK_LIMIT
},
(
_
,
index
)
=>
emptyRankPlayer
(
index
)))
const
rank1Ref
=
ref
<
InstanceType
<
typeof
Rank1
>
|
null
>
(
null
)
const
rank1Ref
=
ref
<
InstanceType
<
typeof
Rank1
>
|
null
>
(
null
)
...
@@ -65,20 +61,27 @@ const confirmRefresh = (event: BeforeUnloadEvent) => {
...
@@ -65,20 +61,27 @@ const confirmRefresh = (event: BeforeUnloadEvent) => {
const
renderPlayers
=
(
data
:
any
)
=>
{
const
renderPlayers
=
(
data
:
any
)
=>
{
const
players
=
Array
.
isArray
(
data
?.
list
)
?
data
.
list
:
[]
const
players
=
Array
.
isArray
(
data
?.
list
)
?
data
.
list
:
[]
console
.
log
(
'[game2] renderPlayers 收到数据:'
,
JSON
.
stringify
(
data
),
'玩家数:'
,
players
.
length
)
playerCount
.
value
=
Number
(
data
?.
count
??
players
.
length
)
playerCount
.
value
=
Number
(
data
?.
count
??
players
.
length
)
loadingPlayers
.
value
=
Array
.
from
(
loadingPlayers
.
value
=
Array
.
from
(
{
length
:
PLAYER_LIMIT
},
{
length
:
PLAYER_LIMIT
},
(
_
,
index
)
=>
players
[
index
]
??
emptyLoadingPlayer
(),
(
_
,
index
)
=>
players
[
index
]
??
emptyLoadingPlayer
(),
)
)
console
.
log
(
'[game2] renderPlayers 更新后 loadingPlayers:'
,
loadingPlayers
.
value
.
slice
(
0
,
3
).
map
(
p
=>
({
nickname
:
p
.
nickname
,
userid
:
p
.
userid
})))
}
}
const
updateRankPlayers
=
(
data
:
any
)
=>
{
const
updateRankPlayers
=
(
data
:
any
)
=>
{
if
(
!
Array
.
isArray
(
data
))
return
console
.
log
(
'[game2] updateRankPlayers 收到数据:'
,
JSON
.
stringify
(
data
))
if
(
!
Array
.
isArray
(
data
))
{
console
.
warn
(
'[game2] updateRankPlayers: 数据不是数组'
)
return
}
rankPlayers
.
value
=
Array
.
from
(
rankPlayers
.
value
=
Array
.
from
(
{
length
:
RANK_LIMIT
},
{
length
:
RANK_LIMIT
},
(
_
,
index
)
=>
data
[
index
]
??
emptyRankPlayer
(
index
),
(
_
,
index
)
=>
data
[
index
]
??
emptyRankPlayer
(
index
),
)
)
console
.
log
(
'[game2] updateRankPlayers 更新后 rankPlayers:'
,
JSON
.
stringify
(
rankPlayers
.
value
.
map
(
p
=>
({
nickname
:
p
.
nickname
,
userid
:
p
.
userid
}))))
}
}
const
playerToRankPlayer
=
(
player
:
any
,
index
:
number
):
Player
=>
({
const
playerToRankPlayer
=
(
player
:
any
,
index
:
number
):
Player
=>
({
...
@@ -152,11 +155,9 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
...
@@ -152,11 +155,9 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
break
break
case
2
:
case
2
:
seedRankPlayersFromLoading
()
seedRankPlayersFromLoading
()
debugger
screen
.
value
=
'rank1'
screen
.
value
=
'rank1'
break
break
case
3
:
case
3
:
debugger
screen
.
value
=
'rank2'
screen
.
value
=
'rank2'
break
break
}
}
...
@@ -174,10 +175,11 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
...
@@ -174,10 +175,11 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
})
})
const
startGameWithMusic
=
()
=>
{
const
startGameWithMusic
=
()
=>
{
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
gotoRank1WithIntro
()
// if ($is_local_mode()) {
return
// gotoRank1WithIntro()
}
// return
// }
if
(
playerCount
.
value
==
0
)
{
if
(
playerCount
.
value
==
0
)
{
$toast
(
'房间中没有玩家'
);
$toast
(
'房间中没有玩家'
);
return
;
return
;
...
...
frontend-large/src/pages/game2/views/Rank1View.vue
View file @
82ea5e29
...
@@ -161,7 +161,9 @@ const createRandomLanesByRank = () => {
...
@@ -161,7 +161,9 @@ const createRandomLanesByRank = () => {
let
lanesByRank
=
createRandomLanesByRank
();
let
lanesByRank
=
createRandomLanesByRank
();
const
syncRacers
=
(
rankList
:
Player
[])
=>
{
const
syncRacers
=
(
rankList
:
Player
[])
=>
{
console
.
log
(
'[game2 Rank1View] syncRacers 收到 rankList:'
,
rankList
.
length
,
'条'
,
rankList
.
slice
(
0
,
3
).
map
(
p
=>
({
nickname
:
p
.
nickname
,
userid
:
p
.
userid
,
wechat_id
:
p
.
wechat_id
})));
const
topPlayers
=
rankList
.
filter
(
isRealPlayer
).
slice
(
0
,
HORSE_COUNT
);
const
topPlayers
=
rankList
.
filter
(
isRealPlayer
).
slice
(
0
,
HORSE_COUNT
);
console
.
log
(
'[game2 Rank1View] syncRacers 过滤后 topPlayers:'
,
topPlayers
.
length
,
'条'
,
topPlayers
.
map
(
p
=>
p
.
nickname
));
const
rankedEntries
=
topPlayers
.
map
((
player
,
index
)
=>
({
const
rankedEntries
=
topPlayers
.
map
((
player
,
index
)
=>
({
key
:
playerKey
(
player
,
index
),
key
:
playerKey
(
player
,
index
),
player
,
player
,
...
@@ -202,6 +204,7 @@ const syncRacers = (rankList: Player[]) => {
...
@@ -202,6 +204,7 @@ const syncRacers = (rankList: Player[]) => {
racers
.
value
=
[...
retained
,
...
newcomers
]
racers
.
value
=
[...
retained
,
...
newcomers
]
.
sort
((
a
,
b
)
=>
a
.
lane
-
b
.
lane
);
.
sort
((
a
,
b
)
=>
a
.
lane
-
b
.
lane
);
rankedPlayerKeys
.
value
=
topKeys
;
rankedPlayerKeys
.
value
=
topKeys
;
console
.
log
(
'[game2 Rank1View] syncRacers 最终 racers:'
,
racers
.
value
.
length
,
'匹马'
);
};
};
const
updateRacePositions
=
(
tickScale
=
1
)
=>
{
const
updateRacePositions
=
(
tickScale
=
1
)
=>
{
...
@@ -327,46 +330,47 @@ onMounted(() => {
...
@@ -327,46 +330,47 @@ onMounted(() => {
preloadHorseSprites
();
preloadHorseSprites
();
raceAnimationFrame
=
window
.
requestAnimationFrame
(
animateRace
);
raceAnimationFrame
=
window
.
requestAnimationFrame
(
animateRace
);
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
const
mockAvatars
=
[
// if ($is_local_mode()) {
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
// const mockAvatars = [
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Salem'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Midnight'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Salem',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Lucky'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Midnight',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Bandit'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Lucky',
];
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Bandit',
const
mockData
:
Player
[]
=
[
// ];
{
userid
:
'local-1'
,
nickname
:
'疾风骑士'
,
avatar
:
mockAvatars
[
0
],
score
:
45
},
// const mockData: Player[] = [
{
userid
:
'local-2'
,
nickname
:
'闪电侠'
,
avatar
:
mockAvatars
[
1
],
score
:
38
},
// { userid: 'local-1', nickname: '疾风骑士', avatar: mockAvatars[0], score: 45 },
{
userid
:
'local-3'
,
nickname
:
'追风者'
,
avatar
:
mockAvatars
[
2
],
score
:
30
},
// { userid: 'local-2', nickname: '闪电侠', avatar: mockAvatars[1], score: 38 },
{
userid
:
'local-4'
,
nickname
:
'千里马'
,
avatar
:
mockAvatars
[
3
],
score
:
22
},
// { userid: 'local-3', nickname: '追风者', avatar: mockAvatars[2], score: 30 },
{
userid
:
'local-5'
,
nickname
:
'飞毛腿'
,
avatar
:
mockAvatars
[
4
],
score
:
15
},
// { userid: 'local-4', nickname: '千里马', avatar: mockAvatars[3], score: 22 },
{
userid
:
'local-6'
,
nickname
:
'烈焰驹'
,
avatar
:
mockAvatars
[
5
],
score
:
52
},
// { userid: 'local-5', nickname: '飞毛腿', avatar: mockAvatars[4], score: 15 },
];
// { userid: 'local-6', nickname: '烈焰驹', avatar: mockAvatars[5], score: 52 },
syncRacers
(
mockData
);
// ];
// syncRacers(mockData);
const
growthRates
:
Record
<
string
,
number
>
=
{};
//
mockData
.
forEach
((
p
,
i
)
=>
{
// const growthRates: Record
<
string
,
number
>
=
{};
growthRates
[
p
.
userid
!
]
=
0.4
+
(
i
/
(
mockData
.
length
-
1
))
*
1.4
;
// mockData.forEach((p, i) => {
});
// growthRates[p.userid!] = 0.4 + (i / (mockData.length - 1)) * 1.4;
// });
let
simInterval
:
ReturnType
<
typeof
setInterval
>
|
undefined
;
//
watch
(
raceStarted
,
(
running
)
=>
{
// let simInterval: ReturnType
<
typeof
setInterval
>
|
undefined
;
if
(
simInterval
)
{
clearInterval
(
simInterval
);
simInterval
=
undefined
;
}
// watch(raceStarted, (running) => {
if
(
running
)
{
// if (simInterval) { clearInterval(simInterval); simInterval = undefined; }
simInterval
=
setInterval
(()
=>
{
// if (running) {
if
(
!
raceStarted
.
value
)
{
clearInterval
(
simInterval
);
simInterval
=
undefined
;
return
;
}
// simInterval = setInterval(() => {
const
updatedPlayers
=
racers
.
value
.
map
(
r
=>
({
// if (!raceStarted.value) { clearInterval(simInterval); simInterval = undefined; return; }
...
r
.
player
,
// const updatedPlayers = racers.value.map(r => ({
score
:
Number
(
r
.
player
.
score
||
0
)
+
Math
.
floor
(
Math
.
random
()
*
10
+
5
),
// ...r.player,
}));
// score: Number(r.player.score || 0) + Math.floor(Math.random() * 10 + 5),
updatedPlayers
.
sort
((
a
,
b
)
=>
Number
(
b
.
score
)
-
Number
(
a
.
score
));
// }));
syncRacers
(
updatedPlayers
);
// updatedPlayers.sort((a, b) => Number(b.score) - Number(a.score));
},
1500
);
// syncRacers(updatedPlayers);
}
// }, 1500);
},
{
immediate
:
true
});
// }
}
// }, { immediate: true });
// }
});
});
onBeforeUnmount
(()
=>
{
onBeforeUnmount
(()
=>
{
...
...
frontend-large/src/pages/game3/Game3.vue
View file @
82ea5e29
...
@@ -231,11 +231,11 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
...
@@ -231,11 +231,11 @@ const { startGame, createRoom, backRoom, closeRoom } = useAdminGameSocket({
})
})
const
startGameWithMusic
=
()
=>
{
const
startGameWithMusic
=
()
=>
{
// 本地调试模式
:跳过 WebSocket,直接进入赛马画面
// 本地调试模式
已关闭,如需开启请取消以下注释
if
(
$is_local_mode
())
{
//
if ($is_local_mode()) {
gotoRank1WithIntro
()
//
gotoRank1WithIntro()
return
//
return
}
//
}
if
(
playerCount
.
value
==
0
)
{
if
(
playerCount
.
value
==
0
)
{
$toast
(
'房间中没有玩家'
);
$toast
(
'房间中没有玩家'
);
return
;
return
;
...
...
frontend-large/src/pages/game3/views/Rank1View.vue
View file @
82ea5e29
...
@@ -422,57 +422,54 @@ const renderAvatar = (item: any | null) => {
...
@@ -422,57 +422,54 @@ const renderAvatar = (item: any | null) => {
onMounted
(()
=>
{
onMounted
(()
=>
{
preloadHorseFrames
();
preloadHorseFrames
();
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
// 本地模式:预填10个模拟玩家数据,由 startIntro 流程驱动赛马
// if ($is_local_mode()) {
const
mockAvatars
=
[
// const mockAvatars = [
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Salem'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Salem',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Midnight'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Midnight',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Lucky'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Lucky',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Bandit'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Bandit',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Misty'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Misty',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Pepper'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Pepper',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Oreo'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Oreo',
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger'
,
// 'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger',
];
// ];
list
.
value
=
[
// list.value = [
{
userid
:
'local-1'
,
nickname
:
'疾风骑士'
,
avatar
:
mockAvatars
[
0
],
score
:
45
},
// { userid: 'local-1', nickname: '疾风骑士', avatar: mockAvatars[0], score: 45 },
{
userid
:
'local-2'
,
nickname
:
'闪电侠'
,
avatar
:
mockAvatars
[
1
],
score
:
38
},
// { userid: 'local-2', nickname: '闪电侠', avatar: mockAvatars[1], score: 38 },
{
userid
:
'local-3'
,
nickname
:
'追风者'
,
avatar
:
mockAvatars
[
2
],
score
:
30
},
// { userid: 'local-3', nickname: '追风者', avatar: mockAvatars[2], score: 30 },
{
userid
:
'local-4'
,
nickname
:
'千里马'
,
avatar
:
mockAvatars
[
3
],
score
:
22
},
// { userid: 'local-4', nickname: '千里马', avatar: mockAvatars[3], score: 22 },
{
userid
:
'local-5'
,
nickname
:
'飞毛腿'
,
avatar
:
mockAvatars
[
4
],
score
:
15
},
// { userid: 'local-5', nickname: '飞毛腿', avatar: mockAvatars[4], score: 15 },
{
userid
:
'local-6'
,
nickname
:
'烈焰驹'
,
avatar
:
mockAvatars
[
5
],
score
:
52
},
// { userid: 'local-6', nickname: '烈焰驹', avatar: mockAvatars[5], score: 52 },
{
userid
:
'local-7'
,
nickname
:
'暴风战士'
,
avatar
:
mockAvatars
[
6
],
score
:
41
},
// { userid: 'local-7', nickname: '暴风战士', avatar: mockAvatars[6], score: 41 },
{
userid
:
'local-8'
,
nickname
:
'神行者'
,
avatar
:
mockAvatars
[
7
],
score
:
35
},
// { userid: 'local-8', nickname: '神行者', avatar: mockAvatars[7], score: 35 },
{
userid
:
'local-9'
,
nickname
:
'银鞍客'
,
avatar
:
mockAvatars
[
8
],
score
:
28
},
// { userid: 'local-9', nickname: '银鞍客', avatar: mockAvatars[8], score: 28 },
{
userid
:
'local-10'
,
nickname
:
'踏雪无痕'
,
avatar
:
mockAvatars
[
9
],
score
:
18
},
// { userid: 'local-10', nickname: '踏雪无痕', avatar: mockAvatars[9], score: 18 },
];
// ];
// 每匹马不同的基础增速:领先者(高分)增速更高,自然拉开差距
// const growthRates: Record
<
string
,
number
>
=
{};
const
growthRates
:
Record
<
string
,
number
>
=
{};
// list.value.forEach((p, i) => {
list
.
value
.
forEach
((
p
,
i
)
=>
{
// growthRates[p.userid!] = 0.4 + (i / (list.value.length - 1)) * 1.4;
// 高分马增速 1.4~1.8x,低分马 0.6~1.0x,制造持久速度差异
// });
growthRates
[
p
.
userid
!
]
=
0.4
+
(
i
/
(
list
.
value
.
length
-
1
))
*
1.4
;
// let simInterval: ReturnType
<
typeof
setInterval
>
|
undefined
;
});
// watch(isGameRunning, (running) => {
// 跟随 isGameRunning 自动管理模拟分数组件
// if (simInterval) { clearInterval(simInterval); simInterval = undefined; }
let
simInterval
:
ReturnType
<
typeof
setInterval
>
|
undefined
;
// if (running) {
watch
(
isGameRunning
,
(
running
)
=>
{
// simInterval = setInterval(() => {
if
(
simInterval
)
{
clearInterval
(
simInterval
);
simInterval
=
undefined
;
}
// if (!isGameRunning.value) { clearInterval(simInterval); simInterval = undefined; return; }
if
(
running
)
{
// for (const p of list.value) {
simInterval
=
setInterval
(()
=>
{
// if (typeof p.score === 'number' && p.score
<
120
&&
p
.
userid
)
{
if
(
!
isGameRunning
.
value
)
{
clearInterval
(
simInterval
);
simInterval
=
undefined
;
return
;
}
// const rate = growthRates[p.userid] || 1.0;
for
(
const
p
of
list
.
value
)
{
// const growth = Math.max(1, Math.floor((Math.random() * 3 + 1) * rate));
if
(
typeof
p
.
score
===
'number'
&&
p
.
score
<
120
&&
p
.
userid
)
{
// p.score += growth;
const
rate
=
growthRates
[
p
.
userid
]
||
1.0
;
// }
const
growth
=
Math
.
max
(
1
,
Math
.
floor
((
Math
.
random
()
*
3
+
1
)
*
rate
));
// }
p
.
score
+=
growth
;
// detectScoreChanges(list.value);
}
// }, 1500);
}
// }
detectScoreChanges
(
list
.
value
);
// }, { immediate: true });
},
1500
);
// }
}
},
{
immediate
:
true
});
}
});
});
onUnmounted
(()
=>
{
onUnmounted
(()
=>
{
...
...
frontend-large/src/pages/game4/Game4.vue
View file @
82ea5e29
...
@@ -197,11 +197,12 @@ const startGameWithMusic = () => {
...
@@ -197,11 +197,12 @@ const startGameWithMusic = () => {
console
.
log
(
'[Game4] startGameWithMusic called, local mode:'
,
$is_local_mode
(),
'playerCount:'
,
playerCount
.
value
)
console
.
log
(
'[Game4] startGameWithMusic called, local mode:'
,
$is_local_mode
(),
'playerCount:'
,
playerCount
.
value
)
// 确保背景音乐播放(参考 game2 的 watch 模式,但直接在点击时调用更可靠)
// 确保背景音乐播放(参考 game2 的 watch 模式,但直接在点击时调用更可靠)
playGame4Music
()
playGame4Music
()
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
console
.
log
(
'[Game4] 本地模式,直接进入赛马画面'
)
// if ($is_local_mode()) {
gotoRank1WithIntro
()
// console.log('[Game4] 本地模式,直接进入赛马画面')
return
// gotoRank1WithIntro()
}
// return
// }
if
(
playerCount
.
value
==
0
)
{
if
(
playerCount
.
value
==
0
)
{
$toast
(
'房间中没有玩家'
);
$toast
(
'房间中没有玩家'
);
return
;
return
;
...
@@ -213,11 +214,11 @@ const startGameWithMusic = () => {
...
@@ -213,11 +214,11 @@ const startGameWithMusic = () => {
const
nextRound
=
()
=>
{
const
nextRound
=
()
=>
{
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
stopApplauseMusic
()
stopApplauseMusic
()
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
// 本地模式:回到 loading 页,用户点击"开始挑战"后再进入赛马(对齐 game3)
// if ($is_local_mode()) {
gotoLoading
(
true
)
//
gotoLoading(true)
return
//
return
}
//
}
gotoLoading
(
true
)
gotoLoading
(
true
)
// 等待 Rank1View 卸载完成后再确保 BGM 播放(对齐 game3 的 watch 模式)
// 等待 Rank1View 卸载完成后再确保 BGM 播放(对齐 game3 的 watch 模式)
// 用 nextTick 确保在组件卸载、watch 触发的 BGM 之后再次保证
// 用 nextTick 确保在组件卸载、watch 触发的 BGM 之后再次保证
...
@@ -233,11 +234,12 @@ const nextRoundWithMusic = () => {
...
@@ -233,11 +234,12 @@ const nextRoundWithMusic = () => {
const
backHandler
=
async
()
=>
{
const
backHandler
=
async
()
=>
{
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
stopApplauseMusic
()
stopApplauseMusic
()
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
stopAllMusic
()
// if ($is_local_mode()) {
router
.
replace
(
'/main'
)
// stopAllMusic()
return
// router.replace('/main')
}
// return
// }
const
ok
=
await
$confirm
({
const
ok
=
await
$confirm
({
title
:
'提示'
,
title
:
'提示'
,
message
:
'是否关闭当前房间回到首页'
,
message
:
'是否关闭当前房间回到首页'
,
...
...
frontend-large/src/pages/game4/views/Rank1View.vue
View file @
82ea5e29
...
@@ -409,9 +409,10 @@ const stopGame = () => {
...
@@ -409,9 +409,10 @@ const stopGame = () => {
};
};
const
startIntro
=
async
()
=>
{
const
startIntro
=
async
()
=>
{
if
(
$is_local_mode
())
{
// 本地模拟已关闭,如需开启请取消以下注释
mockHorses
();
// if ($is_local_mode()) {
}
// mockHorses();
// }
showResult
.
value
=
false
;
showResult
.
value
=
false
;
finalRankList
.
value
=
[];
finalRankList
.
value
=
[];
gameStarted
.
value
=
false
;
gameStarted
.
value
=
false
;
...
@@ -426,17 +427,18 @@ const startIntro = async () => {
...
@@ -426,17 +427,18 @@ const startIntro = async () => {
gameStarted
.
value
=
true
;
gameStarted
.
value
=
true
;
isGameRunning
.
value
=
true
;
isGameRunning
.
value
=
true
;
if
(
horses
.
value
.
length
===
0
)
{
// 本地模拟已关闭,如需开启请取消以下注释
const
count
=
8
+
Math
.
floor
(
Math
.
random
()
*
3
);
// if (horses.value.length === 0) {
const
mockPlayers
:
Player
[]
=
Array
.
from
({
length
:
count
},
(
_
,
i
)
=>
({
// const count = 8 + Math.floor(Math.random() * 3);
userid
:
`auto-
${
i
}
`
,
// const mockPlayers: Player[] = Array.from({ length: count }, (_, i) => ({
nickname
:
mockNicknames
[
i
]
||
`马匹
${
i
+
1
}
`
,
// userid: `auto-${i}`,
avatar
:
mockAvatars
[
i
]
||
''
,
// nickname: mockNicknames[i] || `马匹${i + 1}`,
score
:
Math
.
floor
(
Math
.
random
()
*
60
)
+
10
,
// avatar: mockAvatars[i] || '',
}));
// score: Math.floor(Math.random() * 60) + 10,
updateHorses
(
mockPlayers
);
// }));
console
.
log
(
'[game4 Rank1View] 生成'
,
count
,
'匹默认马'
);
// updateHorses(mockPlayers);
}
// console.log('[game4 Rank1View] 生成', count, '匹默认马');
// }
startGameLoop
();
startGameLoop
();
if
(
$is_local_mode
())
{
if
(
$is_local_mode
())
{
...
...
frontend-large/src/pages/game5/Game5.vue
View file @
82ea5e29
...
@@ -33,7 +33,8 @@ const emptyRankPlayer = (index: number): Player => ({
...
@@ -33,7 +33,8 @@ const emptyRankPlayer = (index: number): Player => ({
})
})
const
screen
=
ref
<
GameScreen
>
(
'loading'
)
const
screen
=
ref
<
GameScreen
>
(
'loading'
)
// 本地模式下使用模拟玩家数据
// 本地模式下使用模拟玩家数据(已关闭)
const
mockPlayers
=
[
const
mockPlayers
=
[
{
userid
:
'local-1'
,
nickname
:
'疾风骑士'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
score
:
45
},
{
userid
:
'local-1'
,
nickname
:
'疾风骑士'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
score
:
45
},
{
userid
:
'local-2'
,
nickname
:
'闪电侠'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
score
:
38
},
{
userid
:
'local-2'
,
nickname
:
'闪电侠'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
score
:
38
},
...
@@ -47,11 +48,7 @@ const mockPlayers = [
...
@@ -47,11 +48,7 @@ const mockPlayers = [
{
userid
:
'local-10'
,
nickname
:
'踏雪无痕'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger'
,
score
:
18
},
{
userid
:
'local-10'
,
nickname
:
'踏雪无痕'
,
avatar
:
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Tiger'
,
score
:
18
},
];
];
const
loadingPlayers
=
ref
<
any
[]
>
(
const
loadingPlayers
=
ref
<
any
[]
>
(
Array
.
from
({
length
:
PLAYER_LIMIT
},
emptyLoadingPlayer
))
$is_local_mode
()
?
mockPlayers
:
Array
.
from
({
length
:
PLAYER_LIMIT
},
emptyLoadingPlayer
)
)
const
playerCount
=
ref
(
0
)
const
playerCount
=
ref
(
0
)
const
rankPlayers
=
ref
<
Player
[]
>
(
Array
.
from
({
length
:
RANK_LIMIT
},
(
_
,
index
)
=>
emptyRankPlayer
(
index
)))
const
rankPlayers
=
ref
<
Player
[]
>
(
Array
.
from
({
length
:
RANK_LIMIT
},
(
_
,
index
)
=>
emptyRankPlayer
(
index
)))
const
rank1Ref
=
ref
<
InstanceType
<
typeof
Rank1
>
|
null
>
(
null
)
const
rank1Ref
=
ref
<
InstanceType
<
typeof
Rank1
>
|
null
>
(
null
)
...
@@ -185,12 +182,6 @@ const startGameWithMusic = () => {
...
@@ -185,12 +182,6 @@ const startGameWithMusic = () => {
// 确保背景音乐播放
// 确保背景音乐播放
playGame5Music
()
playGame5Music
()
// 本地调试模式:跳过 WebSocket,直接进入游戏画面
if
(
$is_local_mode
())
{
console
.
log
(
'[Game5] 本地模式,直接进入游戏画面'
)
gotoRank1WithIntro
()
return
}
if
(
playerCount
.
value
==
0
)
{
if
(
playerCount
.
value
==
0
)
{
$toast
(
'房间中没有玩家'
);
$toast
(
'房间中没有玩家'
);
...
@@ -203,11 +194,6 @@ const nextRound = () => {
...
@@ -203,11 +194,6 @@ const nextRound = () => {
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
stopApplauseMusic
()
stopApplauseMusic
()
if
(
$is_local_mode
())
{
// 本地模式:回到 loading 页,用户点击"开始挑战"后再进入游戏
gotoLoading
(
true
)
return
}
gotoLoading
(
true
)
gotoLoading
(
true
)
// 等待组件卸载完成后再确保 BGM 播放
// 等待组件卸载完成后再确保 BGM 播放
...
@@ -234,11 +220,6 @@ const backHandler = async() => {
...
@@ -234,11 +220,6 @@ const backHandler = async() => {
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
// 立刻停止喝彩音乐并移除指针事件监听,防止点击按钮时重新触发 playApplauseMusic
stopApplauseMusic
()
stopApplauseMusic
()
if
(
$is_local_mode
())
{
stopAllMusic
()
router
.
replace
(
'/main'
)
return
}
const
ok
=
await
$confirm
({
const
ok
=
await
$confirm
({
title
:
'提示'
,
title
:
'提示'
,
...
...
frontend-large/src/pages/game5/views/Rank1View.vue
View file @
82ea5e29
...
@@ -227,7 +227,8 @@ const generateRandomHorses = () => {
...
@@ -227,7 +227,8 @@ const generateRandomHorses = () => {
horses
.
value
=
newHorses
;
horses
.
value
=
newHorses
;
};
};
// ========== 本地模拟数据(参考 game3)==========
// ========== 本地模拟数据(已关闭)==========
const
mockAvatars
=
[
const
mockAvatars
=
[
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Felix'
,
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
'https://api.dicebear.com/9.x/fun-emoji/svg?seed=Aneka'
,
...
@@ -266,14 +267,14 @@ const preloadHorseFrames = () => {
...
@@ -266,14 +267,14 @@ const preloadHorseFrames = () => {
onMounted
(()
=>
{
onMounted
(()
=>
{
preloadHorseFrames
();
preloadHorseFrames
();
if
(
$is_run_local
())
{
// 本地模拟已关闭,如需开启请取消以下注释
// 使用模拟玩家数据更新排名列表
// if ($is_run_local()) {
updateRankList
(
mockPlayers
);
//
updateRankList(mockPlayers);
gameStarted
.
value
=
true
;
//
gameStarted.value = true;
isGameRunning
.
value
=
true
;
//
isGameRunning.value = true;
generateRandomHorses
();
//
generateRandomHorses();
startHorseLoop
();
//
startHorseLoop();
}
//
}
});
});
onUnmounted
(()
=>
{
onUnmounted
(()
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment