App Inventor 2 台球游戏制作教程

本文手把手教你用 App Inventor 2 制作一个完整的弹球游戏,涵盖画布、球、碰撞检测、得分系统。

一、核心组件介绍

1.1 画布(Canvas)

画布是游戏的”舞台”,所有游戏元素都在画布上运动。
关键属性说明
宽度/高度游戏区域大小
背景颜色游戏背景
背景图片可设置台球桌图片
关键事件说明
被触摸时(Touched)手指点击画布
被拖动时(Dragged)手指在画布上滑动

1.2 球(Ball)

球是画布上的圆形精灵,台球游戏的主角。
关键属性说明推荐值
半径(Radius)球的大小20
速度(Speed)每次移动的像素数5~15
方向(Heading)运动方向(角度)45
间隔(Interval)多少毫秒移动一次30
颜色(PaintColor)球的颜色红/白/黄
启用(Enabled)是否运动
关键事件说明
到达边缘时(EdgeReached)球碰到画布边界
碰撞时(CollidedWith)球与其他精灵碰撞
被拖动时(Dragged)手指拖动球
关键方法说明
反弹(Bounce)碰到边界后反弹
移动到(MoveTo)移动到指定坐标

1.3 图像精灵(ImageSprite)

可以用图片作为外观的精灵,用于制作球杆、球洞等。

二、最简单的弹球游戏(5分钟上手)

界面设计

  1. 拖入画布,设置宽度”充满”,高度400像素
  2. 在画布内拖入,设置半径20,颜色红色
  3. 拖入标签,显示得分
  4. 拖入按钮,开始/暂停游戏

代码块

初始化全局变量 得分 = 0

// 屏幕初始化:设置球的初始状态
当 Screen1.初始化 时
  设置 球1.速度 = 8
  设置 球1.方向 = 45
  设置 球1.间隔 = 30
  设置 球1.启用 = 真

// 球碰到边界:自动反弹
当 球1.到达边缘时(边缘)
  调用 球1.反弹(边缘)
  // 每次反弹加1分
  设置 全局变量 得分 = 全局变量 得分 + 1
  设置 标签_得分.文本 = 合并字符串("得分:", 全局变量 得分)

// 点击画布:球飞向点击位置
当 画布1.被触摸时(x, y)
  // 计算方向角
  初始化局部变量 dx = x - 球1.X
  初始化局部变量 dy = y - 球1.Y
  设置 球1.方向 = 调用 反正切2(dy, dx) * 180 / 3.14159

// 开始/暂停按钮
当 按钮_开始.被点击 时
  如果 球1.启用 = 真 则
    设置 球1.启用 = 假
    设置 按钮_开始.文本 = "继续"
  否则
    设置 球1.启用 = 真
    设置 按钮_开始.文本 = "暂停"

三、进阶:多球台球游戏

3.1 设计思路

台球游戏的核心:
  • 母球(白球):玩家控制,用手指拖动或点击发射
  • 目标球(彩球):被母球击中后运动
  • 球洞:球进洞得分,球消失

3.2 母球控制(拖动发射)

初始化全局变量 拖动起点X = 0
初始化全局变量 拖动起点Y = 0

// 记录拖动起点
当 母球.被触摸时(x, y)
  设置 全局变量 拖动起点X = x
  设置 全局变量 拖动起点Y = y
  设置 母球.启用 = 假  // 拖动时暂停运动

// 拖动结束:根据拖动方向发射
当 母球.被拖动时(起点X, 起点Y, 上次X, 上次Y, 当前X, 当前Y)
  // 显示瞄准线(可选)
  调用 画布1.画线(起点X, 起点Y, 当前X, 当前Y)

// 松手发射(用画布的触摸结束事件模拟)
当 画布1.被触摸时(x, y)
  初始化局部变量 dx = 全局变量 拖动起点X - x
  初始化局部变量 dy = 全局变量 拖动起点Y - y
  初始化局部变量 距离 = 平方根(dx*dx + dy*dy)
  
  如果 距离 > 10 则
    设置 母球.速度 = 最小值(距离 / 5, 20)  // 速度与拖动距离成正比,最大20
    设置 母球.方向 = 调用 反正切2(-dy, -dx) * 180 / 3.14159
    设置 母球.启用 = 真
    调用 画布1.清除  // 清除瞄准线

3.3 球与球碰撞

// 母球碰到目标球
当 母球.碰撞时(其他精灵)
  // 目标球获得母球的速度和方向(简化物理)
  设置 其他精灵.速度 = 母球.速度 * 0.8
  设置 其他精灵.方向 = 母球.方向
  设置 其他精灵.启用 = 真
  
  // 母球减速
  设置 母球.速度 = 母球.速度 * 0.3
  
  // 播放碰撞音效
  调用 音效1.播放

// 目标球碰到边界
当 目标球.到达边缘时(边缘)
  调用 目标球.反弹(边缘)
  // 逐渐减速(模拟摩擦力)
  设置 目标球.速度 = 目标球.速度 * 0.95
  如果 目标球.速度 < 1 则
    设置 目标球.启用 = 假  // 停止

3.4 球进洞检测

球洞用图像精灵表示,检测球是否进洞:
初始化全局变量 得分 = 0

// 检测球是否进洞(用计时器每帧检测)
当 计时器1.计时 时
  // 遍历所有目标球
  对于 每个 球 在 [目标球1, 目标球2, 目标球3] 中
    如果 球.启用 = 真 则
      // 检测与每个球洞的距离
      对于 每个 洞 在 [球洞1, 球洞2, 球洞3, 球洞4] 中
        初始化局部变量 距离 = 平方根(
          (球.X - 洞.X)^2 + (球.Y - 洞.Y)^2
        )
        如果 距离 < 25 则  // 进洞距离阈值
          设置 球.可见 = 假
          设置 球.启用 = 假
          设置 全局变量 得分 = 全局变量 得分 + 1
          设置 标签_得分.文本 = 合并字符串("得分:", 全局变量 得分)
          调用 音效_进洞.播放

四、摩擦力模拟(让球自然停下)

真实台球会因摩擦力逐渐减速停下:
// 用计时器每帧减速
当 计时器_摩擦.计时 时
  对于 每个 球 在 [母球, 目标球1, 目标球2] 中
    如果 球.速度 > 0.5 则
      设置 球.速度 = 球.速度 * 0.98  // 每帧速度乘以0.98
    否则
      设置 球.速度 = 0
      设置 球.启用 = 假

五、完整游戏结构

屏幕组件:
├── 画布(游戏区域)
│   ├── 母球(Ball,白色)
│   ├── 目标球1-6(Ball,彩色)
│   └── 球洞1-6(ImageSprite,黑色圆形图片)
├── 标签_得分
├── 标签_剩余球数
├── 按钮_重新开始
├── 计时器_摩擦(间隔30ms)
└── 音效组件

全局变量:
├── 得分 = 0
├── 剩余球数 = 6
├── 游戏状态 = "等待"  // 等待/瞄准/运动
└── 拖动起点X/Y

六、常见问题

Q1:球速度越来越快怎么办?

每次碰撞后速度应该减少,不要直接赋值新速度,而是乘以系数:
设置 球.速度 = 球.速度 * 0.8  // 碰撞后减速20%

Q2:球穿过边界怎么办?

  • 确保在 到达边缘时 事件中调用 反弹(边缘)
  • 球速不要太快(建议不超过20像素/帧)

Q3:碰撞检测不准确?

App Inventor 2 的碰撞检测基于矩形包围盒,对旋转的图像精灵不准确。球(Ball)组件的碰撞检测相对准确。

Q4:如何让球图案更好看?

  • 使用**图像精灵(ImageSprite)**代替球(Ball),可以设置台球图片
  • 准备1-15号台球图片,分别设置给不同精灵

七、参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。