清泛IT社区App Inventor 2 中文社区

搜索

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.76

Aia StoreApp上架指南 .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

AppInventor2离线版中文教育版接入DeepSeek VIP会员 享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档AI2拓展IoT专题

查看: 7|回复: 0
打印 上一主题 下一主题

[经验分享] 不到20个积木块,我用App Inventor 2给女儿做了个接星星小游戏

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 865 天

    [LV.10]以坛为家III

    1219

    主题

    2029

    帖子

    5万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    57925

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 1 小时前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    周末带女儿去科技馆,她玩了一个"接星星"的互动投影游戏,回来就缠着我:"爸爸,做一个能装在手机上的接星星App吧!"刚好最近在研究App Inventor 2的精灵动画组件,于是决定用一上午把这个小游戏做出来——没想到过程比想的顺利不少。

    需求分析

    女儿的"需求"其实很简单:
    1. 星星从屏幕上方不断掉落
    2. 底部有一个篮子可以左右移动
    3. 接住星星加分,没接住就掉血
    4. 分数越高越好玩

    说白了就是一个经典的"跌落物体接住"小游戏,这类游戏的核心就是精灵运动逻辑——这恰好是Sprite动画组件的看家本领。

    技术方案

    App Inventor 2提供了三种与动画直接相关的组件:

    画布(Canvas):游戏舞台,所有精灵必须在画布上
    图像精灵(ImageSprite):可以用图片作为外观的运动对象
    球形精灵(Ball):圆形精灵,适合做小球、子弹、星星等

    我的方案很直接:
    • 用画布作为游戏主界面
    • 星星用球形精灵(Ball)实现,修改填充色为黄色,缩小半径充当"星星"
    • 篮子用图像精灵(ImageSprite),加载一张篮子图片作为外观
    • 再搭配一个时钟组件(Clock)做定时控制

    关键实现

    第一步:搭建界面

    在组件面板中依次拖入:
    1. 一个Canvas(设置宽为"填充父容器",高为400px,背景色为深蓝色)
    2. 一个ImageSprite(放到Canvas里面,设置图片为篮子素材,名称为"Basket")
    3. 一个Ball(放到Canvas里面,设置半径12px,填充色#FFD700金色,名称为"Star")
    4. 一个Clock(放到屏幕下方,不显示)

    第二步:让星星掉下来

    核心逻辑——让球形精灵定时移动。Ball组件有个关键属性组合:

    Speed(速度):每次移动的像素数
    Interval(间隔):每次移动的时间间隔(毫秒)
    Heading(方向):移动角度(180°=向下)
    Enabled(启用):是否移动

    当 Screen1.初始化
      设置 Star.速度 为 5
      设置 Star.间隔 为 50
      设置 Star.方向 为 180  // 向下
      设置 Star.启用 为 真

    就这么几行,星星就开始往下掉了。不过掉到屏幕底部就没了——我们需要检测"到达边缘"事件。

    第三步:边界检测与重新生成

    Ball组件自带一个 到达边缘时 事件:

    当 Star.到达边缘时(边缘数值)
      调用 Star.移动到指定位置(x: 随机整数从1到(Canvas.宽度 - 50), y: 10)
      设置 分数 为 分数 - 1
      如果 分数 < 0
        调用 Notifier.显示警告("游戏结束!")

    同时,当星星到达底部时,随机生成一个新的X坐标位置,让它从顶部重新落下,模拟"不断掉落的星星"。

    第四步:篮子跟随手指移动

    ImageSprite同样支持触摸响应。我用画布的 被拖动时 事件来控制篮子的位置:

    当 Canvas1.被拖动时(起点X,起点Y,前点X,前点Y,当前X,当前Y,有精灵被拖动)
      调用 Basket.移动到指定位置(x: 当前X - Basket.宽度 / 2, y: Canvas1.高度 - Basket.高度)

    这里的关键技巧是 当前X - Basket.宽度 / 2,让篮子中心对齐手指位置,体验更自然。

    第五步:碰撞检测

    Ball和ImageSprite之间可以互相检测碰撞。Ball的 被碰撞时 事件:

    当 Star.被碰撞时(其他精灵)
      设置 分数 为 分数 + 1
      调用 Star.移动到指定位置(x: 随机整数从1到(Canvas.宽度 - 50), y: 10)
      调用 Star.反弹(0)  // 反弹处理
      调用 Sound1.播放()

    这个事件自动检测精灵之间的碰撞,无需自己写任何碰撞算法。App Inventor 2的引擎内部已经实现了矩形碰撞检测。

    踩过的坑

    坑1:Z坐标的问题
    一开始篮子和星星重叠时,星星显示在篮子上面,看起来像是星星穿过了篮子。后来设置了 Basket.Z坐标 为2,Star.Z坐标 为1,让篮子始终显示在前层,视觉上就像稳稳地"接住"了。

    坑2:性能抖动
    星星下落速度设置太快(Speed=15+Interval=30),低端手机上出现了明显的卡顿。调整为Speed=5+Interval=50后就流畅了。Ball组件文档也提到:间隔越小位置更新越频繁,但性能消耗也越大。

    坑3:边缘数值的含义
    Ball组件的"到达边缘时"事件返回一个边缘数值:北=1、东北=2、东=3、东南=4、南=-1、西南=-2、西=-3、西北=-4。一开始直接用这个值传给反弹方法,结果星星到处乱弹。后来判断如果边缘数值是 -1(南/底部),就理解是"没接住",重置位置重新掉落。

    最终效果

    最终成品是一个完整的"接星星"小游戏:
    • 金色星星不断从顶部落下
    • 手指拖动底部篮子左右移动
    • 接住星星播放音效加1分
    • 没接住扣分,扣到0游戏结束
    • 游戏过程中星星下落速度会随分数增加逐步加快

    女儿试玩后开心得不行,自己玩了半小时还叫来小伙伴一起比分数。最让我意外的是,整个游戏的核心逻辑只用了不到20个积木块——App Inventor 2对精灵碰撞、移动、边界检测的高度封装,让游戏开发的门槛低得超乎想象。

    复盘感悟

    1. 精灵组件是游戏开发的基石:Ball和ImageSprite搭配Canvas,足以实现90%的2D小游戏需求
    2. 属性组合创造出丰富效果:仅靠Speed+Interval+Heading三个属性搭配不同值,就能实现加速、变速、弹射等效果
    3. 碰撞事件是零代码的:不需要写任何碰撞检测算法,组件自带"被碰撞时"事件开箱即用
    4. 性能调优不能忘:Interval不是越小越好,需要在视觉流畅性和设备性能之间找平衡

    如果你想进一步拓展,可以添加多个Ball实现"多星同屏掉落",或者用ImageSprite做不同道具(加分星、减速星、炸弹),甚至用TinyDB保存最高分排行榜——画布精灵引擎的潜力远超你的想象。

    > 文档参考:https://www.fun123.cn/reference/components/animation.html
    App Inventor 2 中文网 - MIT同步更新的中文本土化平台!v2.76 支持Android 15 & iOS 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2026 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2026-07-13 19:50 , Processed in 0.016537 second(s), 33 queries .