From 3687485d472786d22a48c3d78e0db6e62fcf036a Mon Sep 17 00:00:00 2001 From: lovezhangchuangxin <2911331070@qq.com> Date: Fri, 6 Dec 2024 00:05:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(game,=20backend):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=B0=E7=8E=A9=E5=AE=B6=E6=B3=A8=E5=86=8C=E6=98=9F=E7=90=83?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/backend/src/service/map/index.ts | 24 ++++++ .../backend/src/socket/event/game/index.ts | 1 - .../backend/src/socket/event/map/index.ts | 21 ++++- .../game/src/components/game-map/index.vue | 83 +++++++++++++++++++ packages/game/src/utils/message.ts | 9 ++ 5 files changed, 135 insertions(+), 3 deletions(-) diff --git a/packages/backend/src/service/map/index.ts b/packages/backend/src/service/map/index.ts index dae480b..51b4979 100644 --- a/packages/backend/src/service/map/index.ts +++ b/packages/backend/src/service/map/index.ts @@ -58,6 +58,30 @@ export default class MapService { planet.position = [x, y] userData.planets[planetId] = planet initPlanetData(planet, userDataMap) + if (!MapService.objectCache[originChunkId]) { + MapService.objectCache[originChunkId] = [] + } + MapService.objectCache[originChunkId].push({ + userId, + userName: data.user.find((user) => user.id === userId)?.username || '', + planet, + }) + if (!MapService.originalPlanetIds[originChunkId]) { + MapService.originalPlanetIds[originChunkId] = new Set() + } + MapService.originalPlanetIds[originChunkId].add(+planetId) + } + + /** + * 获取我的所有星球 + */ + static async getMyPlanets(userId: string) { + const data = await GameDB.getDB().getData() + const userData = data.userDataMap[userId] + if (!userData) { + throw new GameError(ErrorCode.USER_NOT_EXIST) + } + return userData.planets } /** diff --git a/packages/backend/src/socket/event/game/index.ts b/packages/backend/src/socket/event/game/index.ts index b701732..f2eb4ac 100644 --- a/packages/backend/src/socket/event/game/index.ts +++ b/packages/backend/src/socket/event/game/index.ts @@ -18,7 +18,6 @@ export const gameEventHandler = (socket: Socket, io: Server) => { UserService.onlineUser(userId) return callback(Result.success(data)) } catch (error: unknown) { - console.error(error) if (error instanceof GameError) { return callback(Result.error(error.errorCode)) } diff --git a/packages/backend/src/socket/event/map/index.ts b/packages/backend/src/socket/event/map/index.ts index 76e5a29..9c70f4a 100644 --- a/packages/backend/src/socket/event/map/index.ts +++ b/packages/backend/src/socket/event/map/index.ts @@ -18,7 +18,6 @@ export const mapEventHandler = (socket: Socket, io: Server) => { await MapService.registerPlanet(userId, planetId) return callback(Result.success({})) } catch (error: unknown) { - console.error(error) if (error instanceof GameError) { return callback(Result.error(error.errorCode)) } @@ -40,7 +39,25 @@ export const mapEventHandler = (socket: Socket, io: Server) => { }), ) } catch (error: unknown) { - console.error(error) + if (error instanceof GameError) { + return callback(Result.error(error.errorCode)) + } + } + }) + + /** + * 获取我的所有星球 + */ + socket.on('getMyPlanets', async (callback) => { + const userId = socket.userId + if (!userId) { + return callback(Result.error(ErrorCode.PARAM_ERROR)) + } + + try { + const data = await MapService.getMyPlanets(userId) + return callback(Result.success(data)) + } catch (error: unknown) { if (error instanceof GameError) { return callback(Result.error(error.errorCode)) } diff --git a/packages/game/src/components/game-map/index.vue b/packages/game/src/components/game-map/index.vue index 9d096f3..d7e74c7 100644 --- a/packages/game/src/components/game-map/index.vue +++ b/packages/game/src/components/game-map/index.vue @@ -9,6 +9,7 @@ import { Socket } from 'socket.io-client' import { message as toast } from '@/utils/message' import { PlanetData, UniverseMap } from '@star-angry/core' import { debounce } from '@star-angry/shared' +import { ElMessageBox } from 'element-plus' interface MapObjectData { seed: number @@ -24,10 +25,13 @@ interface MapObjectData { const socket = inject>('socket') const mapObjectData = ref() +const myPlanets = ref>() // 仅用于提供一些操作方法,不用于真实的地图渲染 const blankMap = new UniverseMap(0) onMounted(() => { + getMyPlanets() + const stage = new Konva.Stage({ container: 'universe', width: window.innerWidth, @@ -47,6 +51,35 @@ onMounted(() => { render(stage, layer) }) + layer.on('mouseenter', function (evt) { + const target = evt.target + if (target.id().startsWith('planet') && target instanceof Konva.Circle) { + stage.container().style.cursor = 'pointer' + } + }) + + layer.on('mouseleave', function (evt) { + const target = evt.target + if (target.id().startsWith('planet') && target instanceof Konva.Circle) { + stage.container().style.cursor = 'default' + } + }) + + layer.on('dblclick', function (evt) { + const target = evt.target + if (target.id().startsWith('planet') && target instanceof Konva.Circle) { + if (!myPlanets.value) { + toast.warn('正在获取我的星球数据,请稍后再试') + return + } + if (Object.keys(myPlanets.value).length) { + return + } + const planetId = +target.id().split('-')[1] + registerPlanet(planetId.toString()) + } + }) + window.addEventListener('resize', () => { stage.width(window.innerWidth) stage.height(window.innerHeight) @@ -108,6 +141,56 @@ const getMapObject = ( }) } +/** + * 获取我的星球 + */ +const getMyPlanets = () => { + if (!socket?.value) { + return + } + + socket.value.timeout(5000).emit('getMyPlanets', (err: any, response: any) => { + if (err) { + toast.error('获取我的星球失败') + } else if (response.code === 0) { + myPlanets.value = response.data + if (!Object.keys(myPlanets.value || {}).length) { + ElMessageBox.alert( + '您暂无星球,请在地图上挑选星球,双击该星球即可确认', + '', + { + autofocus: false, + confirmButtonText: '确认', + }, + ) + } + } else { + toast.error(response.msg) + } + }) +} + +/** + * 注册星球 + */ +const registerPlanet = (planetId: string) => { + if (!socket?.value) { + return + } + + socket.value + .timeout(5000) + .emit('registerPlanet', planetId, (err: any, response: any) => { + if (err) { + toast.error('注册星球失败') + } else if (response.code === 0) { + toast.success('注册星球成功') + } else { + toast.error(response.msg) + } + }) +} + /** * 渲染可视区的物体 */ diff --git a/packages/game/src/utils/message.ts b/packages/game/src/utils/message.ts index 0c70424..10ca163 100644 --- a/packages/game/src/utils/message.ts +++ b/packages/game/src/utils/message.ts @@ -7,6 +7,8 @@ type Message = ((config: MessageParams) => void) & { error: (msg: string) => void } & { success: (msg: string) => void +} & { + warn: (msg: string) => void } export const message: Message = (config: MessageParams) => { @@ -35,3 +37,10 @@ message.success = function (msg: string) { type: 'success', }) } + +message.warn = function (msg: string) { + message({ + message: msg, + type: 'warning', + }) +}