
说到微信小游戏,大家首先想到的可能是《跳一跳》或《羊了个羊》。它们的共同点是即点即玩、轻量级,依托微信生态实现病毒式传播。
很多人以为开发小游戏必须学Cocos或Unity,但对于极简原型,微信官方提供的原生JavaScript + Canvas方案才是“少量代码”的最优解。它不需要任何第三方引擎,一个game.js文件就能跑起一个完整的游戏循环。
本文将带你从零拆解微信小游戏的核心架构,并用不到30行核心JS代码,实现一款具备“跳跃障碍物”核心玩法的迷你小游戏。
在写代码前,必须厘清一个关键概念:
对比项 | 微信小程序 | 微信小游戏 |
|---|---|---|
渲染层 | WXML + CSS(DOM树) | Canvas(画布绘制) |
逻辑层 | 禁止 eval,严格隔离 | 支持完整的window模拟,更接近浏览器 |
入口文件 | app.js + 页面配置 | game.js(唯一入口) |
交互方式 | 点击、滑动、表单 | 帧循环 + 触摸事件 |
小游戏没有复杂的页面跳转,一切都在画布(Canvas)上用代码“画”出来。这意味着,只要你会JavaScript的Canvas绘图,你就已经掌握了小游戏开发的80%。
game.js 文件(其余game.json和project.config.json用默认配置即可)。下面这段代码就是游戏的全部。它包含:游戏主循环(帧动画)、物理跳跃、障碍物生成与移动、碰撞检测、实时计分。
在game.js中粘贴以下代码:
// 1. 获取画布与上下文(微信专用API)
const canvas = wx.createCanvas();
const ctx = canvas.getContext('2d');
const W = canvas.width, H = canvas.height;
// 2. 游戏状态变量
let player = { x: 80, y: 300, w: 30, h: 30, vy: 0 }; // 玩家方块
let obstacles = []; // 障碍物数组
let score = 0, frame = 0;
const GRAVITY = 0.7, JUMP = -12, SPEED = 5;
// 3. 触摸跳跃(微信触摸事件)
wx.onTouchStart(() => {
if (player.y >= 300) player.vy = JUMP; // 只有在地面才能跳
});
// 4. 核心游戏循环(仅25行)
function loop() {
frame++;
// ---- 物理更新 ----
player.vy += GRAVITY;
player.y += player.vy;
if (player.y > 300) { player.y = 300; player.vy = 0; } // 地面限位
// ---- 障碍物生成与移动 ----
if (frame % 60 === 0) { // 每秒生成1个(60帧)
obstacles.push({ x: W, y: 320, w: 25, h: 25 });
}
for (let i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].x -= SPEED;
if (obstacles[i].x < -30) { obstacles.splice(i, 1); score++; } // 通过加分
}
// ---- 碰撞检测(核心算法) ----
for (let obs of obstacles) {
if (player.x < obs.x + obs.w && player.x + player.w > obs.x &&
player.y < obs.y + obs.h && player.y + player.h > obs.y) {
score = 0; // 撞到重置分数(游戏结束的简易表现)
obstacles = []; // 清空障碍重置游戏
player.y = 300; // 复位
}
}
// ---- 绘制画面 ----
ctx.clearRect(0, 0, W, H);
ctx.fillStyle = '#07c160'; // 微信绿
ctx.fillRect(player.x, player.y, player.w, player.h); // 玩家
ctx.fillStyle = '#ff4d4f';
for (let obs of obstacles) ctx.fillRect(obs.x, obs.y, obs.w, obs.h); // 障碍
ctx.fillStyle = '#333';
ctx.font = '20px Arial';
ctx.fillText('🏆 ' + score, 20, 50);
// 5. 请求下一帧(微信专用RAF)
wx.requestAnimationFrame(loop);
}
loop();运行效果:屏幕左侧绿色方块代表你,右侧红色方块从右向左移动。点击屏幕(或按空格模拟)让绿色方块跳跃躲避,每躲过一个,左上角分数+1,撞到则分数清零重置。
这段代码虽短,却涵盖了游戏开发的 “铁三角”:
wx.requestAnimationFrame):它替代了浏览器的requestAnimationFrame,是微信小游戏的“心跳”。每秒60帧,所有逻辑(移动、碰撞、绘制)都在这里不断迭代。vy(垂直速度)加上GRAVITY(重力),实现了抛物线跳跃。这是《跳一跳》类游戏的物理基础。if (A.x < B.x + B.w ...) 这四行判断,是游戏交互的底层命脉,无论多复杂的游戏,最终都归约到这组不等式。如果想让这个小Demo变成可上架的微信小游戏,只需在这个代码框架上做三个加法,无需重构:
wx.createImage()加载PNG图片,用ctx.drawImage()替代fillRect(),瞬间提升颜值。wx.createInnerAudioContext(),在跳跃和得分时播放短音效。wx.getUserInfo()和wx.setStorageSync()保存最高分,再搭配wx.shareAppMessage()引导分享。wx.onTouchStart灵敏度的最佳方式。obstacles数组长度(例如限制最大数量100个)。当你用这30行代码在自己手机上跑出一个可玩的跳跃游戏时,你会深刻感受到:微信小游戏开发,本质是“受限环境下的Canvas绘画艺术”。它去掉了浏览器的兼容性包袱,去掉了复杂的UI框架,让你回归到代码与图形交互最纯粹的状态。
💡 建议:把这段代码中的
SPEED(移动速度)从5改成8,把GRAVITY从0.7改成1.2,你会发现游戏难度瞬间变大——这就是游戏策划口中的“调手感”。你现在就是策划兼开发。
不要纠结于引擎选型,打开你的微信开发者工具,把这30行代码贴进去,点击编译。当那个绿色小方块在你的手机上跳起来的瞬间,你就已经叩开了微信生态11亿用户的大门。🚀
下一步挑战:试着把障碍物改成上下移动的“飞行怪物”,或者把跳跃改成左右滑动控制——只需要修改不到10行代码,你就能创造出一款属于自己的全新玩法。去试试吧!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。