Vue3 + TS + Leafletjs 打造企业级原神大地图

133 阅读3分钟

Vue3 + TS + Leafletjs 打造企业级原神大地图

Vue3 + TS + Leafletjs 打造企业级原神大地图

获取ZY↑↑方打开链接↑↑

在开发涉及地图的应用或游戏时,实现大地图的控制功能(如缩放和平移)以及在地图上展示地名和标点是非常常见的需求。下面我将分别介绍这些功能的实现方法。

1. 大地图控制实现

缩放

缩放通常涉及到改变地图的比例尺,即地图显示的详细程度。在Web环境中,这通常是通过改变地图的缩放级别(zoom level)来实现的。对于原生应用或游戏,这可能涉及到改变地图纹理的细节层次(LOD, Level of Detail)。

示例代码(JavaScript + HTML5 Canvas) :

javascript浅色版本1// 假设我们有一个Canvas元素2let canvas = document.getElementById('mapCanvas');3let context = canvas.getContext('2d');45let zoomLevel = 1; // 初始缩放级别6let scale = 1; // 当前缩放比例78function zoomIn() {9    zoomLevel++;10    scale *= 1.2;11    renderMap();12}1314function zoomOut() {15    if (zoomLevel > 0) {16        zoomLevel--;17        scale /= 1.2;18        renderMap();19    }20}2122function renderMap() {23    // 这里假设drawMap函数会根据scale绘制地图24    drawMap(context, scale);25}

拖拽

拖拽功能允许用户通过鼠标或触摸屏移动地图的位置。这通常涉及到记录用户交互的起始位置,并根据用户的移动来更新地图的显示位置。

示例代码(JavaScript + HTML5 Canvas) :

javascript浅色版本1let isDragging = false;2let lastX = 0;3let lastY = 0;45canvas.addEventListener('mousedown', function(e) {6    isDragging = true;7    lastX = e.clientX;8    lastY = e.clientY;9}, false);1011canvas.addEventListener('mousemove', function(e) {12    if (isDragging) {13        let dx = e.clientX - lastX;14        let dy = e.clientY - lastY;15        // 更新地图的位置16        translateMap(dx, dy);17        lastX = e.clientX;18        lastY = e.clientY;19    }20}, false);2122canvas.addEventListener('mouseup', function() {23    isDragging = false;24}, false);2526function translateMap(dx, dy) {27    // 这里假设translateMap函数会根据dx, dy来平移地图28    // 可能需要计算新的坐标并重新绘制29}

边界限制

为了避免地图超出显示范围,需要检测地图的位置是否超出了预定义的最大和最小边界,并在必要时阻止进一步的移动。

示例代码:

javascript浅色版本1function checkBounds(x, y) {2    let maxX = /* 最大x坐标 */;3    let minX = /* 最小x坐标 */;4    let maxY = /* 最大y坐标 */;5    let minY = /* 最小y坐标 */;67    if (x < minX) x = minX;8    if (x > maxX) x = maxX;9    if (y < minY) y = minY;10    if (y > maxY) y = maxY;1112    return { x: x, y: y };13}

2. 地名展示

地名可以在地图上以文本标签的形式展示出来。通常,这些标签会放置在对应地点的附近,避免与其他标签重叠。

示例代码:

javascript浅色版本1function drawLabels() {2    let labels = [3        { name: '北京', position: { x: 100, y: 100 } },4        { name: '上海', position: { x: 200, y: 200 } }5    ];67    labels.forEach(label => {8        context.fillText(label.name, label.position.x, label.position.y);9    });10}

3. 标点展示

标点(例如兴趣点POI)可以通过图标或者特殊符号来表示。通常,每个标点都有自己的坐标,并且可能包含额外的信息(如名称、描述等)。

示例代码:

javascript浅色版本1function drawMarkers() {2    let markers = [3        { image: 'marker.png', position: { x: 150, y: 150 } },4        { image: 'marker2.png', position: { x: 250, y: 250 } }5    ];67    markers.forEach(marker => {8        context.drawImage(marker.image, marker.position.x, marker.position.y);9    });10}

以上是基本的实现思路,具体实现细节会根据实际的技术栈和框架有所变化。