From 2a9a3737437a316698d1d046f94c3f687909f8cd Mon Sep 17 00:00:00 2001 From: kron Date: Thu, 14 Aug 2025 15:24:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8A=A0=E5=85=A5=EF=BC=8C?= =?UTF-8?q?=E9=80=80=E5=87=BA=E6=88=BF=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis.js | 6 +- src/components/CreateRoom.vue | 9 +- src/components/ShootProgress2.vue | 2 +- src/components/TeamAvatars.vue | 13 ++- src/constants.js | 1 + src/pages/battle-room.vue | 155 ++++++++++++++++++++++-------- src/pages/team-battle.vue | 7 +- src/websocket.js | 2 +- 8 files changed, 138 insertions(+), 57 deletions(-) diff --git a/src/apis.js b/src/apis.js index 5ce8a20..d3ae0af 100644 --- a/src/apis.js +++ b/src/apis.js @@ -6,7 +6,7 @@ try { switch (envVersion) { case "develop": // 开发版 - BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; + BASE_URL = "http://192.168.1.242:8000/api/shoot"; break; case "trial": // 体验版 BASE_URL = "https://apitest.shelingxingqiu.com/api/shoot"; @@ -444,3 +444,7 @@ export const getPractiseDataAPI = async () => { export const getBattleDataAPI = async () => { return request("GET", "/user/fight/statistics"); }; + +export const chooseTeamAPI = async (number, group) => { + return request("POST", "/user/room/group", { number, group }); +}; diff --git a/src/components/CreateRoom.vue b/src/components/CreateRoom.vue index 96cc25a..ed7f821 100644 --- a/src/components/CreateRoom.vue +++ b/src/components/CreateRoom.vue @@ -23,10 +23,11 @@ const createRoom = async () => { } if (loading.value === true) return; loading.value = true; - const result = await createRoomAPI( - battleMode.value, - battleMode.value === 1 ? 2 : 10 - ); + let size = 2; + if (battleMode.value === 2) size = 10; + if (battleMode.value === 3) size = 4; + if (battleMode.value === 4) size = 6; + const result = await createRoomAPI(battleMode.value === 2 ? 2 : 1, size); if (result.number) roomNumber.value = result.number; step.value = 2; loading.value = false; diff --git a/src/components/ShootProgress2.vue b/src/components/ShootProgress2.vue index e118202..205689c 100644 --- a/src/components/ShootProgress2.vue +++ b/src/components/ShootProgress2.vue @@ -17,7 +17,7 @@ const props = defineProps({ }); const barColor = ref("linear-gradient( 180deg, #FFA0A0 0%, #FF6060 100%)"); -const remain = ref(10); +const remain = ref(15); const timer = ref(null); watch( diff --git a/src/components/TeamAvatars.vue b/src/components/TeamAvatars.vue index ffd7edd..66fb7c5 100644 --- a/src/components/TeamAvatars.vue +++ b/src/components/TeamAvatars.vue @@ -9,17 +9,24 @@ const props = defineProps({ type: Array, default: () => [], }, + currentShooterId: { + type: Number, + default: "", + }, youTurn: { type: Boolean, default: false, }, }); const players = ref(props.team); +const youTurn = ref(false); watch( - () => props.youTurn, + () => props.currentShooterId, (newVal) => { - players.value = props.team; - } + const exit = props.team.some((p) => p.id === newVal); + youTurn.value = !!exit; + }, + { immediate: true } ); diff --git a/src/constants.js b/src/constants.js index 23705de..fd10836 100644 --- a/src/constants.js +++ b/src/constants.js @@ -22,6 +22,7 @@ export const MESSAGETYPES = { PaySuccess: 3793388244, RankUpdate: 1121669910, LvlUpdate: 3958625354, + TeamUpdate: 4168086616, }; export const topThreeColors = ["#FFD947", "#D2D2D2", "#FFA515"]; diff --git a/src/pages/battle-room.vue b/src/pages/battle-room.vue index 8bc65c3..1e27832 100644 --- a/src/pages/battle-room.vue +++ b/src/pages/battle-room.vue @@ -7,7 +7,13 @@ import Guide from "@/components/Guide.vue"; import SButton from "@/components/SButton.vue"; import SModal from "@/components/SModal.vue"; import Avatar from "@/components/Avatar.vue"; -import { getRoomAPI, destroyRoomAPI, exitRoomAPI, startRoomAPI } from "@/apis"; +import { + getRoomAPI, + destroyRoomAPI, + exitRoomAPI, + startRoomAPI, + chooseTeamAPI, +} from "@/apis"; import { MESSAGETYPES } from "@/constants"; import useStore from "@/store"; import { storeToRefs } from "pinia"; @@ -17,12 +23,9 @@ const room = ref({}); const roomNumber = ref(""); const owner = ref({}); const opponent = ref({}); -const players = ref([ - { name: "player1", team: 1 }, - { name: "player2", team: 0 }, - { name: "player3", team: 2 }, - { name: "player4", team: 1 }, -]); +const players = ref([]); +const blueTeam = ref([]); +const redTeam = ref([]); const showModal = ref(false); const battleType = ref(0); @@ -44,7 +47,7 @@ async function refreshRoomData() { } return false; }); - if (result.battleType === 1) { + if (result.battleType === 1 && result.count === 1) { if (user.value.id !== owner.value.id) { opponent.value = { id: user.value.id, @@ -77,6 +80,9 @@ async function refreshRoomData() { result.members.forEach((m, index) => { if (ownerIndex !== index) players.value.push(m.userInfo); }); + } else { + players.value = new Array(result.count).fill({}); + refreshMembers(result.members); } } @@ -84,6 +90,23 @@ const startGame = async () => { const result = await startRoomAPI(room.value.number); }; +const refreshMembers = (members) => { + blueTeam.value = []; + redTeam.value = []; + members.forEach((m, index) => { + players.value[index] = { ...m.userInfo, groupType: m.groupType }; + if (m.groupType === 1) { + blueTeam.value.push({ ...m.userInfo, groupType: 1 }); + } else if (m.groupType === 0) { + redTeam.value.push({ ...m.userInfo, groupType: 0 }); + } + }); + for (let i = 0; i < room.value.count / 2; i++) { + if (!blueTeam.value[i]) blueTeam.value[i] = {}; + if (!redTeam.value[i]) redTeam.value[i] = {}; + } +}; + async function onReceiveMessage(messages = []) { messages.forEach((msg) => { if (msg.roomNumber === roomNumber.value) { @@ -134,6 +157,14 @@ async function onReceiveMessage(messages = []) { if (battleType.value === 2) { players.value = players.value.filter((p) => p.id !== msg.userId); } + if (msg.room && msg.room.members) { + refreshMembers(msg.room.members); + } + } + if (msg.constructor === MESSAGETYPES.TeamUpdate) { + if (msg.room && msg.room.members) { + refreshMembers(msg.room.members); + } } if (msg.constructor === MESSAGETYPES.RoomDestroy) { uni.showToast({ @@ -169,6 +200,17 @@ async function onReceiveMessage(messages = []) { }); } +const chooseTeam = async (team) => { + if (team !== 2) { + const notInTeam = room.value.members.some( + (m) => m.userInfo.id === user.value.id && m.groupType === 2 + ); + if (!notInTeam) return; + } + const result = await chooseTeamAPI(roomNumber.value, team); + refreshMembers(result.members); +}; + const destroyRoom = async () => { if (roomNumber.value) await destroyRoomAPI(roomNumber.value); }; @@ -237,7 +279,7 @@ onHide(() => {}); 复制房间号 - + {}); :total="room.count || 10" :players="players" /> - - - - - - - 创建者 + + + + + + + + 创建者 + - - - - - - 23232323232 - + + + + + {{ item.name || "我要加入" }} + + + + + + + + + {{ item.name || "我要加入" }} + + - - - - 22222 - - - - + 进入对战 {}); :onClick="startGame" >进入大乱斗 + 开启对局 等待房主开启对战 创建者点击下一步,所有人即可进入游戏。 @@ -559,6 +631,7 @@ onHide(() => {}); .choose-side-right-item > text { margin: 10px; max-width: 100px; + font-size: 14px; } .choose-side-left-item > button:first-child, .choose-side-right-item > button:last-child { diff --git a/src/pages/team-battle.vue b/src/pages/team-battle.vue index 60f88a2..b6d7bbe 100644 --- a/src/pages/team-battle.vue +++ b/src/pages/team-battle.vue @@ -315,14 +315,9 @@ onHide(() => { :team="blueTeam" :isRed="false" :currentShooterId="currentShooterId" - :youTurn="true" /> - +