微信小程序设备 API 实战:变脸游戏
一、前言
微信小程序提供丰富的设备能力 API,wx.onAccelerometerChange加速计监听,可以感知手机摇晃动作。本次案例实现变脸小游戏:点击图片切换脸谱,摇晃手机同样切换脸谱,作业扩展实现累计变脸次数统计。
开发环境:微信开发者工具,skyline 渲染模式,不使用云开发。
二、实现效果
- 页面展示脸谱图片,点击图片,随机更换一张脸谱,变脸计数 + 1;
- 摇晃手机,触发加速计,弹出
摇一摇成功提示框,同时变脸,计数 + 1; - 页面实时展示累计变脸总次数,点击和摇晃两种变脸方式都会累加。
加速计属于手机硬件能力,模拟器无法模拟摇晃,必须真机预览测试。
三、项目目录结构
变脸游戏
├─ app.js
├─ app.json
├─ app.wxss
├─ images #存放脸谱图片01.png~14.png
│ ├─ 01.png
│ ├─ 02.png
│ └─ ...
└─ pages
└─ index
├─ index.js
├─ index.json
├─ index.wxml
└─ index.wxss
四、完整源码
1.app.json
{
"pages": [
"pages/index/index"
],
"window": {
"navigationBarTextStyle": "black",
"navigationStyle": "custom"
},
"style": "v2",
"renderer": "skyline",
"rendererOptions": {
"skyline": {
"defaultDisplayBlock": true,
"defaultContentBox": true,
"tagNameStyleIsolation": "legacy",
"disableABTest": true,
"sdkVersionBegin": "3.0.0",
"sdkVersionEnd": "15.255.255"
}
},
"componentFramework": "glass‑easel",
"sitemapLocation": "sitemap.json",
"lazyCodeLoading": "requiredComponents"
}
2.pages/index/index.wxml
<!--index.wxml-->
<navigation-bar title="变脸游戏" back="{{false}}" color="black" background="#FFF"></navigation-bar>
<scroll-view class="scrollarea" scroll-y type="list">
<view class="box">
<view class="title">wx.onAccelerometerChange示例</view>
<image src="{{faces[index]}}" mode="widthFix" bind:tap="changeFace"></image>
<view class="count-text">累计变脸总次数:{{count}}</view>
</view>
</scroll-view>
3.pages/index/index.wxss
/**index.wxss**/
page {
height: 100vh;
display: flex;
flex-direction: column;
}
.scrollarea {
flex: 1;
overflow-y: hidden;
}
image {
margin: 20rpx;
}
.count-text {
font-size: 40rpx;
font-weight: bold;
text-align: center;
color: rebeccapurple;
margin-top: 20rpx;
}
4.app.wxss
/**app.wxss**/
.box {
margin: 20rpx;
padding: 20rpx;
border: 2rpx solid purple;
}
.title {
font-size: 40rpx;
font-weight: bolder;
text-align: center;
margin-bottom: 30rpx;
color: rebeccapurple;
}
5.pages/index/index.js(核心逻辑)
Page({
data: {
index: 0, // 当前脸谱数组下标
count: 0, // 作业扩展:变脸总次数,初始0
faces: [ // 脸谱图片路径数组
'/images/01.png',
'/images/02.png',
'/images/03.png',
'/images/04.png',
'/images/05.png',
'/images/06.png',
'/images/07.png',
'/images/08.png',
'/images/09.png',
'/images/10.png',
'/images/11.png',
'/images/12.png',
'/images/13.png',
'/images/14.png'
]
},
/**
* 生成 [0 , n‑1] 的随机整数
* @param {Number} n 数组长度
*/
createRandomIndex(n) {
return Math.floor(Math.random() * n)
},
/**
* 变脸函数:点击图片、摇晃手机都会调用该函数
*/
changeFace() {
const newIdx = this.createRandomIndex(this.data.faces.length)
this.setData({
index: newIdx,
count: this.data.count + 1 // 每变脸一次,计数自增1
})
},
//页面显示:开启加速计监听
onShow() {
wx.onAccelerometerChange((res) => {
// x/y/z三轴加速度,达到阈值判定为摇晃手机
if (res.x > 0.5 || res.y > 0.5 || res.z > 0.5) {
this.changeFace()
wx.showToast({
title: '摇一摇成功',
icon: 'success',
duration: 5000
})
}
})
},
//页面隐藏,关闭加速计监听,防止事件重复注册
onHide() {
wx.stopAccelerometer()
}
})
五、核心 API 知识点解析
wx.onAccelerometerChange(callback)加速计监听监听手机加速度传感器,手机移动、摇晃时持续执行回调函数。回调参数res包含x、y、z三个轴加速度值;数值超过阈值,就判定用户摇晃手机。wx.stopAccelerometer()停止监听加速计。页面离开必须调用,否则监听不会销毁,多次进入页面会重复注册事件,导致变脸疯狂触发。wx.showToast(Object object)显示消息提示框,本案例用来弹出 “摇一摇成功” 提示。- 随机数生成
Math.random()+Math.floor()Math.random()生成[0,1)浮点数;Math.floor()向下取整,生成合法数组下标,实现随机切换脸谱。 - 作业扩展计数逻辑点击图片、摇晃变脸都调用同一个
changeFace()函数,只需要在此函数内部执行count+1,两种操作都可以正确累计变脸次数,代码复用。
六、踩坑记录
坑 1:摇晃手机没有反应
原因:
wx.onAccelerometerChange读取手机硬件传感器,微信开发者工具模拟器不支持模拟摇晃。 解决:点击预览,微信扫码,真机调试。
坑 2:页面多次跳转,摇晃时疯狂变脸
原因:
onShow每次页面显示都会注册加速计监听,旧监听没有销毁,多个监听同时生效。 解决:onHide生命周期调用wx.stopAccelerometer()关闭传感器监听。
坑 3:图片显示空白
原因:图片路径错误,没有写开头斜杠,或者图片文件名大小写不匹配。 解决:路径必须写
/images/01.png,图片放在项目根目录 images 文件夹。
坑 4:计数不增加
不要分别在点击、摇晃两处写 count++,统一写在公共函数
changeFace里面,避免漏写、逻辑不一致。
七、拓展思考
- 可以修改加速度阈值,调整摇晃灵敏度;数值调小,轻微晃动就触发变脸;数值调大,需要用力摇晃。
- 可以增加重置按钮,一键把变脸总次数清零。
- 结合本地存储
wx.setStorageSync,关闭小程序再打开,也可以保留历史变脸次数。
八、总结
这个案例学习小程序设备传感器 API,加速计监听实现摇一摇交互。重点注意传感器监听用完要关闭,防止内存泄漏、事件重复触发。把变脸逻辑封装为公共函数,点击、摇晃复用同一套变脸与计数逻辑,代码简洁便于维护