news 2026/10/30 4:53:10

微信小程序设备 API 实战:变脸游戏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序设备 API 实战:变脸游戏

一、前言

微信小程序提供丰富的设备能力 API,wx.onAccelerometerChange加速计监听,可以感知手机摇晃动作。本次案例实现变脸小游戏:点击图片切换脸谱,摇晃手机同样切换脸谱,作业扩展实现累计变脸次数统计。

开发环境:微信开发者工具,skyline 渲染模式,不使用云开发。

二、实现效果

  1. 页面展示脸谱图片,点击图片,随机更换一张脸谱,变脸计数 + 1;
  2. 摇晃手机,触发加速计,弹出摇一摇成功提示框,同时变脸,计数 + 1;
  3. 页面实时展示累计变脸总次数,点击和摇晃两种变脸方式都会累加。

加速计属于手机硬件能力,模拟器无法模拟摇晃,必须真机预览测试。

三、项目目录结构

变脸游戏
├─ 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 知识点解析

  1. wx.onAccelerometerChange(callback)加速计监听监听手机加速度传感器,手机移动、摇晃时持续执行回调函数。回调参数res包含x、y、z三个轴加速度值;数值超过阈值,就判定用户摇晃手机。
  2. wx.stopAccelerometer()停止监听加速计。页面离开必须调用,否则监听不会销毁,多次进入页面会重复注册事件,导致变脸疯狂触发。
  3. wx.showToast(Object object)显示消息提示框,本案例用来弹出 “摇一摇成功” 提示。
  4. 随机数生成Math.random()+Math.floor()Math.random()生成[0,1)浮点数;Math.floor()向下取整,生成合法数组下标,实现随机切换脸谱。
  5. 作业扩展计数逻辑点击图片、摇晃变脸都调用同一个changeFace()函数,只需要在此函数内部执行count+1,两种操作都可以正确累计变脸次数,代码复用。

六、踩坑记录

坑 1:摇晃手机没有反应

原因:wx.onAccelerometerChange读取手机硬件传感器,微信开发者工具模拟器不支持模拟摇晃。 解决:点击预览,微信扫码,真机调试。

坑 2:页面多次跳转,摇晃时疯狂变脸

原因:onShow每次页面显示都会注册加速计监听,旧监听没有销毁,多个监听同时生效。 解决:onHide生命周期调用wx.stopAccelerometer()关闭传感器监听。

坑 3:图片显示空白

原因:图片路径错误,没有写开头斜杠,或者图片文件名大小写不匹配。 解决:路径必须写/images/01.png,图片放在项目根目录 images 文件夹。

坑 4:计数不增加

不要分别在点击、摇晃两处写 count++,统一写在公共函数changeFace里面,避免漏写、逻辑不一致。

七、拓展思考

  1. 可以修改加速度阈值,调整摇晃灵敏度;数值调小,轻微晃动就触发变脸;数值调大,需要用力摇晃。
  2. 可以增加重置按钮,一键把变脸总次数清零。
  3. 结合本地存储wx.setStorageSync,关闭小程序再打开,也可以保留历史变脸次数。

八、总结

这个案例学习小程序设备传感器 API,加速计监听实现摇一摇交互。重点注意传感器监听用完要关闭,防止内存泄漏、事件重复触发。把变脸逻辑封装为公共函数,点击、摇晃复用同一套变脸与计数逻辑,代码简洁便于维护

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 4:52:39

天地图数据下载全流程:从注册申请到影像与矢量数据获取

软件获取地址: 点击下载https://pan.baidu.com/s/1uRmRqhGASK1BurfyK3e2uQ?pwdb84u 天地图&#xff08;Tianditu&#xff09;是国家地理信息公共服务平台&#xff0c;提供在线地图浏览、地名搜索、路径规划等服务&#xff0c;同时也开放了多种地理数据下载能力。对于做 GIS 分…

作者头像 李华
网站建设 2026/10/30 4:51:33

ponytail插件与技能实战:轻量级任务编排与自动化入门

1. 从“ponytail”这个标题说起&#xff1a;它到底是什么第一次看到“ponytail”这个词&#xff0c;大多数人脑子里蹦出来的画面是扎在脑后的那束马尾辫。但在技术圈和工具链语境里&#xff0c;ponytail 早就不是发型那么简单了。最近一段时间&#xff0c;ponytail skill、pony…

作者头像 李华
网站建设 2026/10/30 4:49:30

换窗到底值不值?先按居住情形算清这笔账

不少人选窗第一句就是“到底值不值”。这问题没有统一答案&#xff0c;但可以按居住情形拆开看&#xff0c;避免在销售话术里绕圈。值不值得&#xff0c;先看两件事&#xff1a;你住多久、你住哪儿。自住且长住、又临街或处在供暖区老房&#xff0c;长期舒适与节能的收益最实在…

作者头像 李华
网站建设 2026/10/30 4:49:05

切片 字符串格式化 运算符

#切片是截取目标对象中一部分的操作&#xff0c;语法格式如下&#xff1a; #strname[start&#x1f51a;step] #注意&#xff1a;切片选取的区间属于左闭右开型&#xff0c;切下的子串包含起始位&#xff0c;但不包含结束位。 #字符串格式化三种方式 #需求&#xff1a;打印输出…

作者头像 李华