feat(game): 添加成都麻将游戏页面和大厅功能
- 实现 ChengduGamePage.vue 组件,包含完整的麻将游戏界面 - 实现 HallPage.vue 组件,支持房间列表展示、创建和加入功能 - 添加 mahjong API 接口用于房间管理操作 - 集成 store 状态管理和本地存储功能 - 实现 ChengduBottomActions 等游戏控制组件 - 添加 websocket 连接和游戏会话管理逻辑 - 实现游戏倒计时、结算等功能模块
This commit is contained in:
73
src/components/chengdu/ChengduSettlementOverlay.vue
Normal file
73
src/components/chengdu/ChengduSettlementOverlay.vue
Normal file
@@ -0,0 +1,73 @@
|
||||
<script setup lang="ts">
|
||||
defineProps<{
|
||||
show: boolean
|
||||
isLastRound: boolean
|
||||
currentRound: number
|
||||
totalRounds: number
|
||||
settlementPlayers: Array<{
|
||||
playerId: string
|
||||
displayName: string
|
||||
score: number
|
||||
isWinner: boolean
|
||||
seatIndex: number
|
||||
}>
|
||||
loggedInUserId: string
|
||||
nextRoundPending: boolean
|
||||
settlementCountdown: number | null
|
||||
}>()
|
||||
|
||||
const emit = defineEmits<{
|
||||
nextRound: []
|
||||
backHall: []
|
||||
}>()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="show" class="settlement-overlay">
|
||||
<div class="settlement-panel">
|
||||
<h2 class="settlement-title">
|
||||
{{ isLastRound ? '最终结算' : `第 ${currentRound} 局结算` }}
|
||||
</h2>
|
||||
<p v-if="totalRounds > 0" class="settlement-round-info">{{ currentRound }} / {{ totalRounds }} 局</p>
|
||||
<div class="settlement-list">
|
||||
<div
|
||||
v-for="(item, index) in settlementPlayers"
|
||||
:key="item.playerId"
|
||||
class="settlement-row"
|
||||
:class="{ 'is-winner': item.isWinner, 'is-self': item.playerId === loggedInUserId }"
|
||||
>
|
||||
<span class="settlement-rank">{{ index + 1 }}</span>
|
||||
<span class="settlement-name">
|
||||
{{ item.displayName }}
|
||||
<span v-if="item.isWinner" class="settlement-winner-badge">胡</span>
|
||||
</span>
|
||||
<span class="settlement-score" :class="{ 'is-positive': item.score > 0, 'is-negative': item.score < 0 }">
|
||||
{{ item.score > 0 ? '+' : '' }}{{ item.score }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="settlement-actions">
|
||||
<button
|
||||
v-if="!isLastRound"
|
||||
class="ready-toggle ready-toggle-inline settlement-btn"
|
||||
type="button"
|
||||
:disabled="nextRoundPending"
|
||||
@click="emit('nextRound')"
|
||||
>
|
||||
<span class="ready-toggle-label">
|
||||
{{
|
||||
nextRoundPending
|
||||
? '准备中...'
|
||||
: settlementCountdown != null && settlementCountdown > 0
|
||||
? `下一局 (${settlementCountdown}s)`
|
||||
: '下一局'
|
||||
}}
|
||||
</span>
|
||||
</button>
|
||||
<button v-else class="ready-toggle ready-toggle-inline settlement-btn" type="button" @click="emit('backHall')">
|
||||
<span class="ready-toggle-label">返回大厅</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
Reference in New Issue
Block a user