微信3D小游戏系列一:在微信小游戏中使用threejs
创始人
2025-05-30 21:22:44
0

文章目录

  • 环境配置
    • 下载开发者工具
    • 目录结构
    • 引入Three.js
  • 在小程序中运行 threejs
    • 目标效果
    • 小程序代码


环境配置

下载开发者工具

下载地址: https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html

微信小程序/小游戏的开发需要在专门的开发者工具中,可下载最近更新的稳定版,若之前没有使用过微信开发的话,进入 小游戏开发指南填写和提交相关的注册信息。

如图新建一个空目录,选择该目录建立自己的项目。
在这里插入图片描述
选择小游戏打开后会默认进入一个示例小游戏,在模拟器中可以将声音关闭:
在这里插入图片描述

目录结构

在这里插入图片描述
以上为小游戏的目录,红色方框里的为小程序的常规配置,具体内容见文档:微信配置文档。其它目录:

  • audio :存放音频文件
  • images: 图片资源
  • js: 游戏逻辑的具体实现,需要的工具类库等
  • databus.js:管控游戏状态
  • game.js:打包入口
  • game.json:微信小游戏配置,参考文档:小游戏配置

./js中内容如下,里面基本所有的代码我们都可以舍弃,但是有一个依赖包很重要:weapp-adapter.js这个包为微信小程序环境创建了类似与WEB浏览器的一系列 API 与 DOM,其中就包括了 canvas

./js
├── base                                   // 定义游戏开发基础类
│   ├── animatoin.js                       // 帧动画的简易实现
│   ├── pool.js                            // 对象池的简易实现
│   └── sprite.js                          // 游戏基本元素精灵类
├── libs
│   ├── symbol.js                          // ES6 Symbol简易兼容
│   └── weapp-adapter.js                   // 小游戏适配器
├── npc
│   └── enemy.js                           // 敌机类
├── player
│   ├── bullet.js                          // 子弹类
│   └── index.js                           // 玩家类
├── runtime
│   ├── background.js                      // 背景类
│   ├── gameinfo.js                        // 用于展示分数和结算界面
│   └── music.js                           // 全局音效管理器
├── databus.js                             // 管控游戏状态
└── main.js                                // 游戏入口主函数

引入Three.js

现在我们还缺少Three.js,因为我在其它项目中使用过 three ,从node_modules找到three,把编译后的文件放到libs目录下即可。
在这里插入图片描述
在这里插入图片描述

在小程序中运行 threejs

目标效果

我们的目标是把博文threejs-场景创建中的效果搬到小屏幕上,在web端运行效果如下。

在这里插入图片描述

小程序代码

代码逻辑和在web端是完全一样的,唯一的区别就是在小程序中无法使用框架(react),需要使用原生JS写法,不过问题不大。

import * as THREE from './js/libs/three.js'
import './js/libs/weapp-adapter.js'// 创建渲染器
const renderer = new THREE.WebGLRenderer({canvas: canvas
})
renderer.setClearColor(new THREE.Color(0x000000)); // 设置背景颜色和透明度
renderer.shadowMap.enabled = true; // 渲染器允许渲染阴影⭐
renderer.setSize(window.innerWidth, window.innerHeight)// 创建场景
const scene = new THREE.Scene()// 创建相机并设置属性
const camera = new THREE.PerspectiveCamera()
camera.aspect = (window.innerWidth / window.innerHeight) // 摄像机设置屏幕宽高比
camera.fov = 45; // 摄像机的视角
camera.near = 0.01; // 近面距离
camera.far = 1001; // 远面距离
camera.position.set(30, 40, 30) // 设置摄像机在threejs坐标系中的位置
camera.lookAt(0, 0, 0) // 摄像机的指向// 添加一个坐标轴
const axes = new THREE.AxesHelper(20);
scene.add(axes);// 添加一个地板
const planeGeometry = new THREE.PlaneGeometry(60, 20); // 创建平面几何体
const planeMaterial = new THREE.MeshBasicMaterial({ // 一种非光泽表面的材质,没有镜面高光color: 0xAAAAAA
});
const plane = new THREE.Mesh(planeGeometry, planeMaterial); // 创建地板模型
plane.rotation.x = -0.5 * Math.PI; // 默认平行于xoy面,沿着X轴旋转-90°至xoz面
plane.receiveShadow = true;
scene.add(plane); // 向场景中添加创建的地板// 添加一个球体
const sphereGeometry = new THREE.SphereGeometry(4, 20, 20); // 球状几何体
const sphereMaterial = new THREE.MeshBasicMaterial({ color: 0x7777FF, side: THREE.DoubleSide });
const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);
sphere.castShadow = true; // 允许接受阴影
sphere.position.set(20, 4, 2); // 球模型在坐标系中位置
scene.add(sphere); // 向场景中添加光源// 添加一个立方体
const cubeGeometry = new THREE.BoxGeometry(5, 5, 5);
const cubeMaterial = new THREE.MeshBasicMaterial({ color: 'blue' })
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
cube.castShadow = true;
cube.position.set(-20, 2.5, 0);
scene.add(cube)let step = 0;
const cubrRoatetSpeed = 0.03;
const sphereRotateSpeed = 0.03const animate = function () {step += sphereRotateSpeedsphere.position.x = 20 + (10 * Math.cos(step)); //水平方向为余弦曲线sphere.position.y = 4 + (10 * Math.abs(Math.sin(step))); // 竖直方向为正弦曲线// // 立方体添加旋转效果cube.rotation.x += cubrRoatetSpeed;cube.rotation.y += cubrRoatetSpeed;cube.rotation.z += cubrRoatetSpeed;
}const render = function () {animate()renderer.render(scene, camera)requestAnimationFrame(render)
}render()

打开微信开发者工具,查看效果:

在这里插入图片描述
这里发现两个问题:

  • 使用 MeshLambertMaterial 材质时颜色没有生效,只能换成 MeshBasicMaterial
  • 原生threejs 的阴影没有生效,可能需要书写webgl来解决这个问题。

看来threejs在小程序上的适配还是有很大问题,不过也可以理解,毕竟小程序的运行环境与浏览器是完全不同的。但是目标已经完成,工程代码可下载。

相关内容

热门资讯

JavaScript【链表】 一、单向链表 1.链表和数组的缺点 2.链表的优势 3.单向链表简介 链表和数组一样࿰...
50岁生日祝福语 五十岁生日... 50岁生日祝福语 五十岁生日贺词人生感叹,10岁时,无忧无虑,天真无邪,20岁时,忙碌奔波,辛苦工作...
<Linux开发> linux... <Linux开发> linux开发工具-之-CMake简单例程[再见] Cmake相关文章如下: 1...
国庆节简单祝福语 2022年国庆节简单祝福语(精选155句)  在现实生活或工作学习中,大家都不可避免地会接触到祝福语...
母亲节丈母娘祝福语 母亲节丈母娘祝福语(精选175句)  在学习、工作或生活中,许多人都有过写祝福语的经历,对祝福语都不...
同事离职祝福语 同事离职祝福语15篇  在平平淡淡的学习、工作、生活中,大家都用到过祝福语吧,祝福语是指对人们的美好...
JAVASE(3.18) 目录 ​编辑 1.抽象类和抽象方法 2.接口 3.比较自定义类型 学习不要眼高手低,...
教师节优美祝福语短信 教师节优美祝福语短信55条  因为有了您,世界才会如此美丽,因为有了您,我的生命才会如此多彩!医生治...
去除Spire.Doc导出字样... //去除Spire.Doc导出字样信息try (FileInputStream in = n...
给老师的春节贺卡祝福语 给老师的春节贺卡祝福语170句  在我们平凡的日常里,要用到祝福语的情况还是蛮多的,祝福语可以起到增...
父亲节暖心祝福语 父亲节暖心祝福语  在日复一日的学习、工作或生活中,大家都用到过祝福语吧,祝福语有助于促进交流,拉近...
温馨教师节祝福语 2020年温馨教师节祝福语集锦45条  您辛劳了,教师节到了,您也该歇一歇了,坐着接接电话看看短信吧...
《RabbitMQ高阶知识》—... 《RabbitMQ高阶知识》— 消息可靠性 文章目录《RabbitMQ高阶知识》— 消息可靠性&#x...
Kubernetes(5):P... 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程: pod创建...
学校领导新年元旦祝福语 学校领导新年元旦祝福语校师生员工们:  新年的钟声Ji荡着神州大地,岁月的航船开启着新的征程,我们即...
hugginface相关数据集... swaption2009/20k-en-zh-translation-pinyin-hsk 翻译 S...
孙子满月酒贺词 孙子满月酒贺词  宝宝降生,我前来贺喜,愿新生的小宝贝给你们带来数不尽的`快乐,祝小宝贝身体健康,茁...
温馨端午节祝福语句 常用温馨端午节祝福语句70句  端午快乐,幸福甜蜜!下文是小编特意为各位读者准备的温馨端午节祝福语句...
SQL常用语法语句 文章目录1. 什么是sql语句?1.1 DDL(数据定义语言)用法2. 什么是数据库对...
暖心重阳节祝福语短信 2020年暖心重阳节祝福语短信大汇总77句  九九重阳节日到,我的短信首先到,登高望远先敬老,赏菊插...