news 2026/10/29 11:06:01

微信小程序实战:基于 Skyline 渲染引擎开发“摇一摇变脸”游戏

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序实战:基于 Skyline 渲染引擎开发“摇一摇变脸”游戏

项目结构

先来看一下项目的整体结构:

text

复制

下载

├── components/ │ └── navigation-bar/ # 自定义导航栏组件 ├── images/ # 脸谱素材图片 (01.png ~ 14.png) ├── pages/ │ └── index/ # 首页 ├── app.js ├── app.json ├── app.wxss └── project.config.json

1. 核心配置:开启 Skyline 渲染

在app.json中,我们开启了 Skyline 渲染引擎和 Glass-Easel 组件框架。这是微信小程序较新的渲染方案,性能更好,但也需要特定的配置。

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" }

注意点:

  • navigationStyle: "custom":因为 Skyline 下原生导航栏表现可能不一致,通常建议自定义导航栏。

  • renderer: "skyline":指定使用 Skyline 渲染。

  • componentFramework: "glass-easel":Skyline 推荐的组件框架。

2. 自定义导航栏组件

由于开启了自定义导航,我们需要自己写一个导航栏组件navigation-bar。这个组件不仅要显示标题,还要处理刘海屏安全区域(Safe Area)和胶囊按钮的对齐问题。

组件逻辑 (navigation-bar.js)

组件的核心在于attached生命周期中,通过wx.getMenuButtonBoundingClientRect()和wx.getWindowInfo()计算出左右两侧的留白,确保标题居中且不被胶囊按钮遮挡。

javascript

复制

下载

Component({ properties: { title: { type: String, value: '' }, back: { type: Boolean, value: true }, // ... 其他属性 }, data: { displayStyle: '' }, lifetimes: { attached() { const rect = wx.getMenuButtonBoundingClientRect() const platform = (wx.getDeviceInfo() || wx.getSystemInfoSync()).platform const isAndroid = platform === 'android' const isDevtools = platform === 'devtools' const { windowWidth, safeArea: { top = 0, bottom = 0 } = {} } = wx.getWindowInfo() || wx.getSystemInfoSync() this.setData({ ios: !isAndroid, innerPaddingRight: `padding-right: ${windowWidth - rect.left}px`, leftWidth: `width: ${windowWidth - rect.left}px`, safeAreaTop: isDevtools || isAndroid ? `height: calc(var(--height) + ${top}px); padding-top: ${top}px` : `` }) }, }, methods: { back() { // 返回逻辑 } } })

组件样式 (navigation-bar.wxss)

样式部分使用了 CSS 变量--height来区分 iOS (44px) 和 Android (48px) 的高度,并利用env(safe-area-inset-top)适配刘海屏。

css

复制

下载

.weui-navigation-bar { --height: 44px; --left: 16px; } .weui-navigation-bar .android { --height: 48px; } .weui-navigation-bar__inner { height: calc(var(--height) + env(safe-area-inset-top)); padding-top: env(safe-area-inset-top); display: flex; /* ... */ }

3. 核心玩法:随机变脸与摇一摇

页面的主要逻辑在index.js中。这里有两个触发变脸的方式:

  1. 点击图片:通过bind:tap绑定changeFace方法。

  2. 摇一摇:通过wx.onAccelerometerChange监听加速度变化。

数据与随机逻辑

我们准备了 14 张脸谱图片,通过Math.random()生成随机索引。

javascript

复制

下载

Page({ data: { index: 0, count: 0, // 累计变脸次数 faces: [ '/images/01.png', '/images/02.png', // ... 共14张 '/images/14.png' ] }, // 产生 [0, n) 的随机整数 createRandomIndex(n) { return Math.floor(Math.random() * n) }, changeFace() { let newCount = this.data.count + 1 this.setData({ index: this.createRandomIndex(this.data.faces.length), count: newCount }) } })

摇一摇监听

在onShow中开启加速度监听。为了灵敏度,这里简单判断了x、y、z任一轴大于 0.5 即触发变脸。

javascript

复制

下载

onShow() { wx.onAccelerometerChange((res) => { // 简单阈值判断,实际项目中建议做防抖处理 if (res.x > 0.5 || res.y > 0.5 || res.z > 0.5) { this.changeFace() wx.showToast({ title: '摇一摇成功', icon: 'success', duration: 5000 }) } }) }

优化提示:实际开发中,加速度计回调触发频率很高,直接调用setData可能会导致性能问题。建议加入节流(Throttle)或防抖(Debounce)逻辑。

4. 页面布局 (index.wxml)

页面结构非常简洁:顶部是自定义导航栏,下面是一个滚动区域,包含标题、脸谱图片和计数器。

xml

复制

下载

运行

<!--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" /> <view class="count-text">累计变脸总次数:{{count}}</view> </view> </scroll-view>

5. 样式美化 (WXSS)

利用 Flex 布局让内容居中,并给图片添加了一些简单的边距。

app.wxss (全局样式):

css

复制

下载

.box { margin: 20rpx; padding: 20rpx; border: 2rpx solid purple; /* 紫色边框 */ } .title { font-size: 40rpx; font-weight: bolder; text-align: center; margin-bottom: 30rpx; color: rebeccapurple; }

index.wxss (页面样式):

css

复制

下载

page { height: 100vh; display: flex; flex-direction: column; } .scrollarea { flex: 1; overflow-y: hidden; } image { margin: 20rpx; width: 100%; /* 配合 mode="widthFix" 使用 */ }

6. 最终效果预览

当你运行这个项目时:

  1. 顶部会显示一个黑色的“变脸游戏”导航栏。

  2. 中间显示一张京剧脸谱。

  3. 点击脸谱,图片会随机切换。

  4. 摇晃手机,图片也会切换,并弹出“摇一摇成功”的提示。

  5. 底部的计数器会实时增加。

总结

这个 Demo 虽然简单,但涵盖了微信小程序开发的几个重要知识点:

  • Skyline 渲染引擎的配置与使用。

  • 自定义导航栏的编写,特别是安全区域的适配。

  • 设备 API(onAccelerometerChange) 的调用。

  • 交互逻辑:点击与摇一摇的双重触发。

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

带你上手高通跃龙 QCS8550 (2): QNN底座与QAI AppBuilder完整安装指南

QNN 驱动与 QAI AppBuilder 的关系 原厂纯净的 Linux 系统&#xff08;如 Ubuntu 22.04 LTS&#xff09;并未内置高通 AI 驱动生态。要在这块芯片上运行 AI 应用&#xff0c;我们需要自底向上搭建两层核心软件栈&#xff1a; 底层驱动&#xff1a;Qualcomm AI Runtime (QAIRT…

作者头像 李华
网站建设 2026/10/29 11:05:10

为什么网上到处都是网盘资源链接?聊聊免费资源背后的商业逻辑

为什么网上到处都是网盘资源链接&#xff1f;聊聊免费资源背后的商业逻辑 不知道大家有没有发现&#xff0c;现在上网找资料&#xff0c;越来越容易遇到各种网盘链接。 比如搜索一个 Python 学习教程&#xff0c;打开文章&#xff0c;最后附着一个网盘链接&#xff1b;想下载一…

作者头像 李华
网站建设 2026/10/29 11:03:32

AI智能体批量涌入V模型:多智能体协作实现需求到测试全链路自动化

1. 从V模型说起&#xff1a;为什么AI智能体开始批量涌入这条赛道第一次听到“AI智能体批量进入V模型”这个说法&#xff0c;我脑子里蹦出来的画面是&#xff1a;一群数字员工排着队&#xff0c;走进一条叫V模型的流水线&#xff0c;然后各自领了工位开始干活。这个比喻不算严谨…

作者头像 李华
网站建设 2026/10/29 11:02:22

600 人排考场:Excel 排序后 560 对相邻同单位,换 40 行代码降到 0

我做了什么 600 名虚构考生、30 个报考单位、5 个岗位、20 个考场 30 座。我用 Excel 里最常见的两种排法各排了一遍&#xff0c;再用 40 行 Python 排了一遍&#xff0c;三份座位表按同一套规则校验。结论就在标题里&#xff1a;Excel 那版 580 对相邻座位里有 560 对是同一个…

作者头像 李华