App Inventor 2 游戏开发教程

覆盖:画布游戏、精灵动画、碰撞检测、物理效果、游戏循环

一、游戏基础

1.1 画布组件

// 画布属性
宽度: 填充父容器
高度: 填充父容器
背景颜色: #000000
启用触摸: 真

1.2 坐标系统

// 画布坐标
原点(0,0): 左上角
X轴: 向右增加
Y轴: 向下增加
中心点: 宽度/2, 高度/2

二、精灵绘制

2.1 绘制角色

当 画布1.初始化 时
  // 绘制玩家
  调用 画布1.绘制椭圆(
    中心X: 200, 中心Y: 300,
    半径X: 20, 半径Y: 20,
    填充颜色: "#00FF00"
  )

2.2 绘制背景

定义 绘制背景()
  调用 画布1.清除画布()
  调用 画布1.绘制矩形(
    X: 0, Y: 0,
    宽度: 画布1.宽度, 高度: 画布1.高度,
    填充颜色: "#87CEEB"  // 天空蓝
  )

三、玩家控制

3.1 触摸控制

当 画布1.被触摸 时(x, y)
  设置 全局变量 玩家X = x
  设置 全局变量 玩家Y = y
  调用 重绘玩家()

定义 重绘玩家()
  调用 绘制背景()
  调用 画布1.绘制椭圆(全局变量 玩家X, 全局变量 玩家Y, 20, 20, "#00FF00")

3.2 方向键控制

当 按钮_上.被点击 时
  设置 全局变量 玩家Y = 全局变量 玩家Y - 10
  调用 重绘玩家()

当 按钮_下.被点击 时
  设置 全局变量 玩家Y = 全局变量 玩家Y + 10
  调用 重绘玩家()

当 按钮_左.被点击 时
  设置 全局变量 玩家X = 全局变量 玩家X - 10
  调用 重绘玩家()

当 按钮_右.被点击 时
  设置 全局变量 玩家X = 全局变量 玩家X + 10
  调用 重绘玩家()

四、动画效果

4.1 帧动画

初始化全局变量 当前帧 = 1
初始化全局变量 总帧数 = 4

当 计时器_动画.计时 时
  设置 全局变量 当前帧 = 全局变量 当前帧 + 1
  如果 全局变量 当前帧 > 全局变量 总帧数 则
    设置 全局变量 当前帧 = 1
  调用 重绘玩家()

4.2 移动动画

定义 移动到(目标X, 目标Y, 步数)
  设置 全局变量 目标X = 目标X
  设置 全局变量 目标Y = 目标Y
  设置 全局变量 剩余步数 = 步数
  设置 计时器_移动.启用计时 = 真

当 计时器_移动.计时 时
  如果 全局变量 剩余步数 > 0 则
    初始化局部变量 dx = (全局变量 目标X - 全局变量 玩家X) / 全局变量 剩余步数
    初始化局部变量 dy = (全局变量 目标Y - 全局变量 玩家Y) / 全局变量 剩余步数
    设置 全局变量 玩家X = 全局变量 玩家X + dx
    设置 全局变量 玩家Y = 全局变量 玩家Y + dy
    设置 全局变量 剩余步数 = 全局变量 剩余步数 - 1
    调用 重绘玩家()
  否则
    设置 计时器_移动.启用计时 = 假

五、碰撞检测

5.1 矩形碰撞

定义 检测碰撞(玩家X, 玩家Y, 障碍物列表)
  对于 每个 障碍物 在 障碍物列表 中
    初始化局部变量 ox = 获取键的值(障碍物, "x", 0)
    初始化局部变量 oy = 获取键的值(障碍物, "y", 0)
    初始化局部变量 ow = 获取键的值(障碍物, "width", 0)
    初始化局部变量 oh = 获取键的值(障碍物, "height", 0)
    
    如果 玩家X > ox 且 玩家X < ox + ow 且 玩家Y > oy 且 玩家Y < oy + oh 则
      返回 真
  
  返回 假

5.2 圆形碰撞

定义 圆形碰撞(x1, y1, r1, x2, y2, r2)
  初始化局部变量 距离 = 平方根((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2))
  返回 距离 < (r1 + r2)

六、物理效果

6.1 重力

初始化全局变量 重力加速度 = 0.5
初始化全局变量 垂直速度 = 0
初始化全局变量 在地面 = 假

当 计时器_物理.计时 时
  // 应用重力
  设置 全局变量 垂直速度 = 全局变量 垂直速度 + 全局变量 重力加速度
  设置 全局变量 玩家Y = 全局变量 玩家Y + 全局变量 垂直速度
  
  // 地面检测
  如果 全局变量 玩家Y > 地面Y 则
    设置 全局变量 玩家Y = 地面Y
    设置 全局变量 垂直速度 = 0
    设置 全局变量 在地面 = 真
  
  调用 重绘玩家()

6.2 跳跃

当 按钮_跳跃.被点击 时
  如果 全局变量 在地面 = 真 则
    设置 全局变量 垂直速度 = -15
    设置 全局变量 在地面 = 假

七、敌人生成

7.1 随机生成

定义 生成敌人()
  初始化局部变量 x = 随机整数(0, 画布1.宽度)
  初始化局部变量 敌人 = 创建字典(
    键值对("x", x),
    键值对("y", 0),
    键值对("speed", 随机整数(2, 5))
  )
  追加列表项(全局变量 敌人列表, 敌人)

当 计时器_生成敌人.计时 时
  如果 列表长度(全局变量 敌人列表) < 10 则
    调用 生成敌人()

八、计分系统

8.1 分数显示

初始化全局变量 分数 = 0
初始化全局变量 生命 = 3

定义 加分(分数)
  设置 全局变量 分数 = 全局变量 分数 + 分数
  设置 标签_分数.文本 = "分数: " + 全局变量 分数

定义 扣血()
  设置 全局变量 生命 = 全局变量 生命 - 1
  设置 标签_生命.文本 = "生命: " + 全局变量 生命
  
  如果 全局变量 生命 <= 0 则
    调用 游戏结束()

定义 游戏结束()
  设置 计时器_物理.启用计时 = 假
  调用 对话框1.显示消息对话框("游戏结束!分数: " + 全局变量 分数, "结束", "确定")

九、关卡系统

9.1 关卡配置

初始化全局变量 当前关卡 = 1
初始化全局变量 关卡配置 = 创建字典(
  键值对("1", 创建字典(
    键值对("敌人速度", 2),
    键值对("生成间隔", 3000),
    键值对("目标分数", 100)
  )),
  键值对("2", 创建字典(
    键值对("敌人速度", 3),
    键值对("生成间隔", 2000),
    键值对("目标分数", 200)
  ))
)

定义 加载关卡(关卡号)
  初始化局部变量 配置 = 获取键的值(全局变量 关卡配置, 文本(关卡号), {})
  设置 全局变量 敌人速度 = 获取键的值(配置, "敌人速度", 2)
  设置 计时器_生成敌人.计时间隔 = 获取键的值(配置, "生成间隔", 3000)

十、常见问题

Q1:画面卡顿?

减少每帧绘制对象数量

Q2:触摸不灵敏?

使用 Canvas.TouchDown 事件

Q3:动画不流畅?

使用硬件加速
文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

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