Vue3 + TS + Leafletjs 打造企业级原神大地图【完结】
使用 Vue3、TypeScript(TS)以及 Leaflet.js 来创建一个类似《原神》游戏中的交互式大地图是一个有趣且具有挑战性的项目。下面我会提供一些步骤来帮助你开始这个项目。
点我获课


  1. 初始化项目
    首先你需要创建一个 Vue3 项目。你可以使用 create-vue 脚手架来快速搭建基础环境,并选择 TypeScript 作为你的开发语言。

bash
浅色版本
npm create vue@latest

或者

yarn create vue

选择 Vue3 和 TypeScript 模板

  1. 安装 Leaflet.js
    接着安装 Leaflet.js 和对应的 TypeScript 类型定义文件。

bash
浅色版本
npm install leaflet
npm install @types/leaflet

  1. 创建地图组件
    接下来,你需要创建一个 Vue 组件来展示你的地图。在这个组件中,你会使用 Leaflet.js 来初始化地图,并且可以添加标记、路径等。

Vue 组件示例代码 (Map.vue)
vue
浅色版本
<template>
<div ref="mapRef" class="map"></div>
</template>

<script lang="ts">
import { defineComponent, onMounted, ref } from 'vue';
import L from 'leaflet';

export default defineComponent({
setup() {

const mapRef = ref<HTMLElement | null>(null);

// 在组件挂载后初始化地图
onMounted(() => {
  if (mapRef.value) {
    const map = L.map(mapRef.value).setView([37.7749, -122.4194], 13); // 设置默认坐标和缩放级别

    // 添加底图
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
      attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
    }).addTo(map);

    // 示例:添加标记
    L.marker([37.7749, -122.4194]).addTo(map)
      .bindPopup('A pretty CSS3 popup.')
      .openPopup();
  }
});

return { mapRef };

},
});
</script>

<style scoped>
.map {
height: 500px;
}
</style>

  1. 数据集成
    为了使地图更具《原神》特色,你需要收集或创建与游戏世界相关的数据,例如地标位置、任务点等。这些数据可以通过 API 获取或者手动创建。
  2. 优化与扩展
    性能优化:对于大型地图,考虑使用懒加载技术来提高性能。
    用户交互:增加更多的交互功能,如点击事件、拖拽等。
    样式定制:可以使用自定义图层来替换默认的 OpenStreetMap 图层,使地图更符合《原神》的风格。
  3. 测试与部署
    最后,确保在不同设备上进行充分测试,包括不同的屏幕尺寸和浏览器。当一切准备就绪时,可以使用 Vite 或者 Webpack 进行构建并部署到服务器上。
  4. 地图数据管理
    为了更好地管理和展示游戏中的地点信息,你可以创建一个专门的数据模型来存储每个地点的信息,比如名称、描述、类型、图片等。这些数据可以通过 JSON 文件或者数据库来存储。

示例:地点数据模型 (location.ts)
typescript
浅色版本
export interface Location {
id: number;
name: string;
description: string;
type: string;
iconUrl: string;
coordinates: [number, number];
}

// 示例数据
const locations: Location[] = [
{

id: 1,
name: "蒙德城",
description: "提瓦特大陆上的自由之城。",
type: "city",
iconUrl: "/icons/mondstadt.png",
coordinates: [37.7749, -122.4194],

},
// 更多地点...
];
然后,在地图组件中动态添加这些地点,并显示图标和弹出框。

typescript
浅色版本
locations.forEach((loc) => {
L.marker(loc.coordinates).addTo(map)

.bindPopup(`<b>${loc.name}</b><br>${loc.description}<br><img src="${loc.iconUrl}" />`);

});

  1. 用户交互功能
    为了让用户体验更加丰富,可以增加一些互动功能,比如搜索地点、保存喜欢的地点、查看地点详情页等。

地点搜索功能 (SearchBar.vue)
vue
浅色版本
<template>
<input v-model="searchTerm" placeholder="搜索地点..." @input="onSearch" />
</template>

<script lang="ts">
import { defineComponent, ref, onMounted } from 'vue';
import { locations } from './location'; // 引入地点数据

export default defineComponent({
setup() {

const searchTerm = ref('');
const results = ref<Location[]>([]);

const onSearch = () => {
  results.value = locations.filter(loc => loc.name.includes(searchTerm.value));
  // 可以在这里调用其他逻辑,比如高亮搜索结果
};

return { searchTerm, results, onSearch };

},
});
</script>

  1. 响应式设计
    为了保证在移动设备上的良好体验,需要确保地图组件是响应式的,并且在小屏幕上也能正常工作。
  2. 社区功能
    如果想要创建一个社区,让用户可以分享自己的发现或者上传自己的地标信息,可以考虑加入用户认证系统和后端服务来存储用户提交的数据。
  3. 文档和维护
    编写详细的文档说明如何使用这个应用,以及如何贡献新的地标或修复错误。维护好版本控制和持续集成也很重要,确保每次更新都不会引入新的错误。
  4. 法律与版权注意事项
    确保所有使用的资源(图片、数据等)都是合法的,并且尊重《原神》游戏的知识产权。如果有使用第三方服务(如地图服务),确保遵守其使用条款。

通过上述步骤,你可以逐步完善这个项目,使其成为一个功能丰富的企业级应用。如果你有任何具体的技术问题,或者需要进一步的帮助,请随时告诉我!


贪玩的饺子
1 声望0 粉丝