threejs——开发一款塔防游戏


theme: fancy

前言

完成效果

全局效果.gif

gif 图较大,耐心等待,源码见文末

为了上班摸鱼合理的玩游戏,我写了一个3d塔防游戏,其中功能包含动画、敌人运动、放置武器、升级武器、销毁武器、动态检测等功能。请动动小手,点赞收藏,这就发车~

目录结构

文件结构.jpg

思维导图

具体功能和思路如下

Snipaste_2024-04-07_15-43-02.jpg

有了这个思维导图,就可以按部就班,一步一步的实现游戏功能

技术栈

  • typescript
  • vite
  • threejs
  • astarjs

由于项目体系较大,内容覆盖较广,下面挑几个关键内容介绍一下

地图

首先要加载一个地图,地图功能包含可放置模块,不可放置模块(敌人路线,装饰元素),大概思路就是根据floorSize生成一个长和宽相等的地图,每个地图都是一个plane。

```ts const createPlane = (texture: THREE.Texture): THREE.Mesh => { const geometry = new THREE.PlaneGeometry(1, 1); const material = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide }); let plane = new THREE.Mesh(geometry, material); plane.rotation.x = Math.PI * 0.5;

plane.material.map = texture;
plane.material.needsUpdate = true;
castShadow(plane)
return plane

} ```

生成轨迹

第一步用for循环,生成一个二维数组存放在mapUseV2中,设定一个起点const startPoint = new THREE.Vector2(0, 0)和终点const endPoint = new THREE.Vector2(floorSize - 1, floorSize - 1),用于生成敌人运动轨迹。

生成轨迹的代码

```ts const maps = new (window as any).Graph(mapUseV2); // 夸过阻碍的随机点位,生成怪物的路线图 var starPosition = maps.grid[startPoint.x][startPoint.y]; var endPosition = maps.grid[endPoint.x][endPoint.y];

// 计算路线图 let trailPoints = (window as any).astar.search(maps, starPosition, endPosition, { closest: false });

``` 寻路生成后的数据结构如下

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙华鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值