当前位置: 首页 > article >正文

从零打造一个“跳一跳”:在HarmonyOS模拟器上用Canvas复刻经典

前言2017年底一款叫“跳一跳”的小游戏突然刷爆了朋友圈。玩法简单得不可思议按屏幕蓄力松手跳出去跳到下一个台子上。但就是这么个规则简单到一行字就能说完的游戏让几亿人上瘾了好一阵子。我好奇的不是它为什么火而是——这么个玩意儿自己能不能做出来正好手边装着DevEco Studio 6.0.2 Release华为的PC模拟器也跑得挺顺。于是有了接下来这篇文章用Canvas画个小球通过触摸按压来蓄力再套个抛物线的物理公式让它飞起来。整个过程不调用任何游戏引擎纯手写从零搭。写完之后才发现原来高中物理老师说的“学物理有用”是这么个意思。核心原理重力和抛物线这事得从牛顿老爷子说起。你把一个东西扔出去它会怎么飞忽略空气阻力的话它在水平方向上是匀速直线运动没什么阻力让它停下来垂直方向上却有一个恒定的向下的加速度——重力加速度。在游戏里模拟这个说白了就是每帧更新速度和位置。水平速度基本不变垂直速度每帧减去一个固定值模拟重力。位置再根据速度累加——小球就这么画出一条抛物线。真实的物理引擎会考虑质量、阻尼、碰撞、摩擦这些参数但我们这个简易版本只需要水平速度根据蓄力大小和方向决定垂直速度同样来自蓄力但每帧减去重力常量着陆检测当小球Y坐标碰到“地面”时停下来就这么简单。用不着sin和cos也能搞定——因为小球只能往一个固定的方向跳角度是死的蓄力大小只影响速度的绝对值。Canvas是怎么画出来的HarmonyOS的Canvas组件用的是CanvasRenderingContext2D对象来绘制图形。每帧清空画布、重绘所有元素连起来就是动画。这和翻页动画是一个道理。但Canvas在HarmonyOS里有个小“坑”——它自己不会自动刷新。状态变了画布不会自己动。得主动调用重绘系统才会在下一帧帮你更新。所以我们需要一个定时器每帧去触发重绘。实现过程环境准备我的DevEco Studio版本信息如下DevEco Studio 6.0.2 Release Build Version: 6.0.2.642, built on March 5, 2026 Runtime version: 21.0.81-b1038.71 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 10.0这套工具支持的API范围是4.0.0到6.0.2默认compileSdkVersion是6.0.2(22)。创建新工程的时候选Empty Ability模板就行语言选ArkTS。核心数据结构需要维护这几个关键变量// 小球状态 State ballX: number 100; State ballY: number 500; State ballVX: number 0; State ballVY: number 0; // 物理参数 readonly GRAVITY: number 0.5; readonly GROUND_Y: number 550; readonly BALL_RADIUS: number 20; readonly MAX_POWER: number 15; // 蓄力状态 State isPressing: boolean false; State pressStartTime: number 0; State currentPower: number 0;地面高度是550像素重力常量设成0.5——这个值可以自己调太大了小球掉得快太小了飞得飘。触摸事件处理在模拟器上鼠标操作和触屏有对应关系左键单击是轻触按住左键拖动就是滑动按住不放就是长按。我们的蓄力逻辑需要长按在模拟器上按住鼠标左键就行。触摸回调里需要处理三种事件.onTouch((event: TouchEvent) { if (event.type TouchType.Down) { this.isPressing true; this.pressStartTime Date.now(); } else if (event.type TouchType.Move) { if (this.isPressing) { const elapsed (Date.now() - this.pressStartTime) / 1000; this.currentPower Math.min(elapsed * 10, this.MAX_POWER); } } else if (event.type TouchType.Up) { if (this.isPressing) { this.isPressing false; this.jump(this.currentPower); } } })蓄力时间乘10得到力度上限设成15。这里有一个细节模拟器和真机的触摸事件行为不太一样真机上即使手指不动也可能不断触发Move事件。不过在这个简易场景下影响不大我们只看时间差。物理更新jump(power: number) { if (this.isJumping) return; this.ballVX power * 0.8; this.ballVY -power * 1.2; this.isJumping true; clearInterval(this.timerId); this.timerId setInterval(() { this.updatePhysics(); }, 16); } updatePhysics() { this.ballVY this.GRAVITY; this.ballX this.ballVX; this.ballY this.ballVY; if (this.ballY this.BALL_RADIUS this.GROUND_Y) { this.ballY this.GROUND_Y - this.BALL_RADIUS; this.ballVX 0; this.ballVY 0; this.isJumping false; clearInterval(this.timerId); } this.drawCanvas(); }水平速度是power * 0.8垂直向上是-power * 1.2负值表示向上重力每帧把垂直速度往下拉。这组系数是反复调出来的——跳得太矮没感觉太高飞出屏幕也不行。每帧检测小球是否落地。ballY BALL_RADIUS GROUND_Y的时候说明小球底部碰到地面了把它固定在地面高度清空速度结束跳跃。Canvas绘制drawCanvas() { const ctx this.canvasRenderingContext; const width 1080; const height 720; ctx.clearRect(0, 0, width, height); // 地面 ctx.fillStyle #8B6914; ctx.fillRect(0, this.GROUND_Y, width, 10); // 小球 ctx.beginPath(); ctx.arc(this.ballX, this.ballY, this.BALL_RADIUS, 0, 2 * Math.PI); ctx.fillStyle #FF4500; ctx.fill(); ctx.shadowColor rgba(0,0,0,0.3); ctx.shadowBlur 10; ctx.strokeStyle #CC3700; ctx.lineWidth 2; ctx.stroke(); ctx.shadowBlur 0; // 蓄力条 if (this.isPressing) { ctx.fillStyle #666666; ctx.fillRect(50, 50, 200, 20); ctx.fillStyle #FF4500; ctx.fillRect(50, 50, (this.currentPower / this.MAX_POWER) * 200, 20); } }clearRect先清空画布然后画地面、画小球、画蓄力条。每次调用drawCanvas都是完整重绘一帧。让Canvas在初始化时正确获取上下文Canvas组件有个onReady回调画布初始化完成后会触发。在这里获取上下文并做首次绘制Canvas(this.canvasRenderingContext) .onReady(() { this.drawCanvas(); }) .width(100%) .height(100%) .onTouch(/* ... */)运行展示在PC模拟器上跑起来之后效果是符合预期的按住鼠标左键顶部蓄力条开始涨松手后小球沿着抛物线飞出去落在“地面”上停止。模拟器的鼠标操作完全够用左键按住就是长按蓄力松开就是释放。物理感还不错——蓄力越久跳得越远小球在空中的弧线也确实是抛物线的样子。总结这个项目麻雀虽小五脏俱全。触摸事件、物理模拟、Canvas动画——三个核心模块串起来就是一个能玩的简易游戏。感触最深的是物理公式从课本走进代码的那一瞬间。以前觉得公式就是用来考试的现在发现它们真能让屏幕上的小球“活”起来。如果还想继续玩可以考虑加上多个平台、不同高度的跳跃目标、碰撞检测、分数统计。这些功能的核心思路和本文介绍的一样——物理更新加Canvas绘制只是逻辑复杂度上去了而已。HarmonyOS的Canvas和触摸事件API设计得挺顺手PC模拟器跑起来也没什么障碍。如果你想自己动手参考这份代码很快就能搭起来。

相关文章:

从零打造一个“跳一跳”:在HarmonyOS模拟器上用Canvas复刻经典

前言2017年底,一款叫“跳一跳”的小游戏突然刷爆了朋友圈。玩法简单得不可思议:按屏幕蓄力,松手跳出去,跳到下一个台子上。但就是这么个规则简单到一行字就能说完的游戏,让几亿人上瘾了好一阵子。我好奇的不是它为什么…...

ai辅助开发:让快马平台智能生成wsl ubuntu配置方案,自适应不同开发者需求

最近在折腾WSL环境配置时,发现不同技术栈对Ubuntu版本和软件包的要求差异很大。作为全栈开发者,经常需要在Python、Node.js和Docker之间切换,传统的手动配置方式效率太低。好在发现了AI辅助开发的新思路,用InsCode(快马)平台的智能…...

Agent 火到离谱,但真正让它跑起来的不是热搜,而是向量引擎这种 API 中转底座

先别急着造“AI 员工” 最近 AI 圈最容易让人上头的词,就是 Agent。 有人说 Agent 是下一个超级应用入口。 有人说以后每家公司都有一堆 AI 员工。 还有人说,未来老板只要发一句话,Agent 就能写方案、查资料、画图、发邮件、做汇报。 听起来很…...

效率提升:快马生成jdk17全平台自动化安装与校验脚本

最近在团队协作时遇到了一个经典问题:新同事加入后,花了大半天时间折腾JDK环境配置,结果因为版本不一致导致本地编译失败。这让我意识到,统一开发环境是提升团队效率的关键一环。于是我用InsCode(快马)平台快速搭建了一套JDK17全平…...

为团队项目统一配置Taotoken以管理大模型调用成本

为团队项目统一配置Taotoken以管理大模型调用成本 1. 团队大模型成本管理的挑战 在团队协作开发中,多个项目可能同时调用不同的大模型API。传统模式下,每个开发者单独申请API密钥会导致以下问题:密钥分散难以追踪、用量统计不透明、成本分摊…...

基于安卓的应急联系人自动通知系统毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓操作系统的应急联系人自动通知系统,以提升个人在突发状况下的安全防护能力与应急响应效率。随着移动设备在日常生活…...

基于安卓的低功耗蓝牙设备管理平台毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一个面向安卓平台的低功耗蓝牙(Low Energy Bluetooth, BLE)设备管理平台,以解决当前物联网环境中BLE设备…...

3分钟掌握eqMac:macOS系统级音频均衡器的完全指南

3分钟掌握eqMac:macOS系统级音频均衡器的完全指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer 🎧 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac eqMac是一款开源的macOS系统级音频均衡器和音量混合器&a…...

到底什么是智能体?一篇文章带你真正搞明白

作者:智能体架构师卢成 | Agent Architect | 意图工程卢成 很多人天天聊智能体、做智能体,我也自称为智能体架构师,但相当一部分人,哪怕是正在做这个行业的人,对这两个词的认知其实都是模糊的。 我先把话放在前面&…...

solidworks新手福音:用快马ai生成互动学习工具,轻松掌握基础操作

作为一个刚接触SolidWorks的纯小白,第一次打开软件时简直被满屏的图标和参数吓懵了。直到发现用InsCode(快马)平台可以快速生成互动学习工具,才终于找到适合新手的入门方式。今天分享这个自己折腾出来的学习方案,特别适合零基础的朋友边玩边学…...

3分钟打造你的专属数字大脑:Obsidian智能主页完整指南

3分钟打造你的专属数字大脑:Obsidian智能主页完整指南 【免费下载链接】obsidian-homepage Obsidian homepage - Minimal and aesthetic template (with my unique features) 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian-homepage 还在为知识碎片…...

雷达序列编码器优化提升气象预测准确率30%

1. 雷达序列编码器在气象预测中的性能优化研究 气象预测一直是人类社会发展的重要课题,而雷达技术作为其中的关键一环,其数据质量和处理效率直接影响着预测的准确性。作为一名在气象数据处理领域深耕多年的工程师,我见证了传统雷达数据处理方…...

神经网络优化器:从原理到实战,提升模型性能的关键秘籍

在深度学习领域,神经网络的训练过程犹如一位雕塑家塑造艺术品,而优化器便是雕塑家手中的刻刀。它的作用至关重要,直接决定了模型最终的性能表现。然而,实际应用中,选择合适的优化器往往面临诸多挑战。例如,…...

AI辅助开发:为寻亲动画注入智能对话与剧情续写能力

最近在尝试用AI技术给经典动画《母をたずねて三千里》开发互动功能时,发现InsCode(快马)平台的多模型支持特别适合这类创意开发。分享下实现三个核心功能的思路和踩坑经验: 角色对话模块设计 要让AI模拟马可或母亲说话,关键是通过提示词约束语…...

命令行数据分析利器:analytics-cli 流式处理与插件化架构实战

1. 项目概述:一个被低估的数据分析利器如果你经常和数据打交道,无论是处理服务器日志、分析用户行为,还是监控业务指标,大概率都经历过这样的场景:面对一堆CSV、JSON或者直接从数据库导出的原始数据,你需要…...

LLM模型蒸馏技术:π-Distill与OPSD的创新实践

1. 技术背景与核心价值大型语言模型(LLM)在自然语言处理领域展现出惊人能力的同时,也面临着部署成本高、推理延迟大等实际问题。模型蒸馏技术通过将大模型的知识迁移到小模型,成为解决这一难题的有效途径。传统蒸馏方法通常仅利用…...

如何在 GitHub Actions 中集成 Taotoken 实现自动化大模型调用

如何在 GitHub Actions 中集成 Taotoken 实现自动化大模型调用 1. 准备工作与环境配置 在 GitHub Actions 中集成 Taotoken 的第一步是完成必要的准备工作。进入 Taotoken 控制台,创建一个专用于自动化流程的 API Key。建议为 CI/CD 场景单独创建 Key 以便于权限管…...

RubiCap框架:提升密集图像描述细节与准确性的创新方案

1. 项目背景与核心价值在计算机视觉与自然语言处理的交叉领域,密集图像描述(Dense Image Captioning)一直是个极具挑战性的任务。不同于传统图像标注只需生成单一句子描述,密集描述要求模型能够识别图像中的多个显著区域&#xff…...

Python量化配置性能断崖式下降?用strace+pipdeptree+py-spy三工具链定位配置层CPU泄漏根源

更多请点击: https://intelliparadigm.com 第一章:Python量化配置性能断崖式下降?用stracepipdeptreepy-spy三工具链定位配置层CPU泄漏根源 当量化策略在回测环境中运行时,CPU使用率持续飙高至95%以上,但实际计算逻辑…...

Go语言构建高性能WebSocket服务器:从Hub模型到生产级实时协作引擎

1. 项目概述:一个为现代Web应用构建的实时协作引擎如果你正在开发一个需要多人实时编辑、协同白板或者即时聊天功能的Web应用,并且对市面上现成方案(如Firebase、Pusher)的灵活性、成本或数据主权有所顾虑,那么你很可能…...

ARMv7调试架构详解:从原理到实践

1. ARMv7调试架构概述ARMv7调试架构是处理器设计中的关键子系统,为嵌入式系统开发提供了全面的调试支持。该架构由三大核心组件构成:侵入式调试、性能计数器和跟踪功能,形成了一个多层次的调试解决方案。调试架构的演进始于ARMv6,…...

配置Claude Code编程助手使用Taotoken作为其Anthropic API后端

配置Claude Code编程助手使用Taotoken作为其Anthropic API后端 1. 准备工作 在开始配置前,请确保已安装Claude Code编程助手并拥有有效的Taotoken API Key。登录Taotoken控制台,在「API密钥管理」页面创建或复制现有密钥。同时,在「模型广场…...

基于MATLAB深度学习与传统机器学习的脑肿瘤MRI图像分类系统(GUI界面+数据集+训练代码)

摘要:脑肿瘤是严重威胁人类健康的疾病之一,准确、快速的诊断对于治疗方案的制定至关重要。传统的人工阅片方式效率低、主观性强,难以满足临床需求。本文针对脑肿瘤MRI图像分类问题,设计并实现了一套基于深度学习与传统机器学习的智…...

用Python+Lingo搞定2000年国赛B题:钢管订购运输优化模型保姆级复现

用PythonLingo实现钢管订购运输优化模型全流程解析 数学建模竞赛中,优化类问题一直是考察选手综合能力的重要题型。2000年国赛B题"钢管订购与运输"作为经典案例,融合了线性规划、运输问题和成本优化的核心知识点。本文将抛开复杂的理论推导&am…...

轻量级智能家居方案Olimex HoT解析与实战

1. 项目概述:轻量级智能家居方案Olimex HoT在智能家居领域,Home Assistant和OpenHAB等平台虽然功能强大,但对硬件资源的高需求常常让入门用户望而却步。Olimex公司推出的HoT(Home of Things)项目正是瞄准了这一痛点——…...

给数学老师的Python礼物:用Manim从零制作你的第一个教学动画(附完整代码)

给数学老师的Python礼物:用Manim从零制作你的第一个教学动画(附完整代码) 数学课堂上,一个生动的动画往往能让学生瞬间理解抽象概念。想象一下,当你在黑板上费力绘制正弦函数时,如果能直接展示正弦波如何随…...

MicroPython v1.27版本更新解析与嵌入式开发实践

1. MicroPython v1.27版本更新深度解析 MicroPython作为当前最受欢迎的微控制器固件之一,其最新发布的v1.27版本带来了多项重要更新。这次更新不仅新增了对多款主流MCU的支持,还在测试框架、性能优化和功能扩展等方面做出了显著改进。作为一名长期使用Mi…...

观察不同时段调用 Taotoken 服务的稳定性与路由容错表现

观察不同时段调用 Taotoken 服务的稳定性与路由容错表现 1. 测试环境与调用背景 在为期三个月的项目开发周期中,我们通过 Taotoken 的统一 API 接入了多种大模型服务,用于代码生成、文档摘要和对话交互等任务。调用频率在工作日高峰时段(9:…...

Python 爬虫反爬突破:JS 变量实时监控与关键参数捕获

前言 在现代 Web 前端工程化与站点风控体系持续升级的背景下,纯静态接口明文传输数据的模式已逐步淘汰,绝大多数中大型互联网平台、电商系统、资讯门户、金融类站点均采用 JavaScript 动态渲染、前端加密算法、运行时变量生成、动态参数签名等技术构建请…...

Ollama本地大模型部署工程2026:从安装到生产的完整实战指南

本地化部署大模型在2026年已经不是"尝鲜"而是"刚需"——数据隐私、网络隔离、成本控制,都推动着企业走向自托管。Ollama是目前最简单易用的本地LLM运行工具,本文从入门到生产,全面解析其工程化部署方案。 —## 为什么选择…...