Axure RP 逻辑组织方法——用伪事件模拟程序结构
Axure 缺乏程序结构,交互一多就乱成麻。本文提出“伪事件”方法,用用户界面不会调用的交互事件模拟函数,实现分支、调用、传参、嵌套与复用。从基础模式到四种终止方法,再到多层嵌套与实战案例,系统讲解如何用 Axure 写出可维护的复杂逻辑。

一、问题:Axure 没有“程序结构”
1.1 Axure 的三重缺失

1.2 这带来什么后果

1.3 这个临界点在哪

交互数量与复杂度关系
本项目《终章 2026》中,一辆敌方坦克挂载了数十个场景,涉及 7 类事件。交互面板早已超出“可直接阅读”的规模。
二、核心思想
2.1 一句话
用伪事件模拟程序结构。
2.2 概念映射表

2.3 什么是伪事件
伪事件 = 用“用户操作界面不会调用”的交互事件,当作纯函数入口。
2.4 判定标准:用户操作界面会不会调用该动作

2.5 关键机制:动作触发事件,不是状态触发事件
Axure 的“显示/隐藏”事件,由“动作被调用”触发,不是由“状态变化”触发。
推论:元件已显示时,再调“显示”,仍会触发事件。
2.6 伪事件源风险:拖动不可靠
“拖动”事件由“用户尝试拖动”触发,而非“元件发生位移”。
即使你:
- 没有给元件设置任何“移动”动作
- 元件在视觉上纹丝不动
只要用户按住这个元件并移动鼠标,Axure 就会持续触发 OnDrag 事件。
这意味着“拖动”不是一个安全的伪事件源。

结论: 除非你确实需要拖动交互,否则不要用“拖动”做伪事件源。推荐用“滚动”代替。
2.7 伪事件源的元件限制

2.8 翻译说明

2.9 为什么伪事件能模拟程序结构
六个特性全部具备:可被触发、可命名、可带参数、可返回值、可嵌套、可复用。伪事件就是“事实上的函数”。
三、基础模式
3.1 单层分支:伪事件内部的条件用例

单层分支:伪事件内部的条件用例
【判断】敌人是否可以移动:
用例 1:[[前方是墙]] → 转向
用例 2:[[前方是水]] → 转向
用例 3:[[前方是钢]] → 转向
用例 4:Else(前方可通行) → 移动
一个伪事件内部可以有多个用例,相当于 if-else if-else 链。
3.2 调用模式:跨元件触发伪事件

调用模式:跨元件触发伪事件
调用方:
触发事件 → 目标元件的【某伪事件】
目标元件:
【某伪事件】:…执行逻辑…
调用方不需要知道目标元件的内部结构,只需要“触发”即可。
3.3 带参模式:单一入口 + 来路分派

带参模式:单一入口 + 来路分派
调用方 A:设置变量 来路 = “A” → 触发事件 伪事件
调用方 B:设置变量 来路 = “B” → 触发事件 伪事件
伪事件(唯一入口):
用例 1:[[来路 == “A”]] → 执行 A 的逻辑
用例 2:[[来路 == “B”]] → 执行 B 的逻辑
来路变量 = 函数参数,伪事件 = 函数体,触发事件 = 函数调用。
适用边界:

3.4 互斥 + 公共:用位置差异实现双重分支

互斥 + 公共:用位置差异实现双重分支
【伪事件】:
用例 1(If):[[条件 A]] → 分支 A 的动作
用例 2(Else If true):[[恒真]] → 分支 B 的动作
用例 3(If true):[[恒真]] → 无条件的公共动作
效果:

关键点:

3.5 推式 vs 拉式:跨元件数据传递

推式示例:
主地图「载入」:
1. 移动自己到 (0, 随机)
2. 等待 1ms
3. 触发事件 → 草地图的【显示】
核心洞察:
生产者掌握数据、掌握时机,它自己决定什么时候推。 消费者被动接收,不依赖时序。
四、用例链的顺序与短路
4.1 并列 If vs If 链

这是“顺序 + 短路”。
4.2 分组成链的代价

“分组成链”不是“分组独立”,是“链内短路 + 链间顺序”。
4.3 链的顺序即优先级
多条链并列时,从上到下评估。
如果“链 A”的第一个 Case 命中,执行后,“链 B”仍然会评估——但“链 B”看到的变量状态已经被“链 A”改过。
4.4 现象:一次按键触发两个事件
Case 1(首组):
If 空格 → 暂停
Else If 任意键 → 恢复
Case 2(第二组):
If 方向键 → 转向
场景:暂停状态下,按方向键。

“一次按键,两条链分别捕获,且顺序决定谁先执行。”
4.5 “任意键”是贪婪条件
“任意键恢复”会捕获“所有按键”——包括那些“本应被其他链处理的键”。
设计“任意键”时,必须考虑“它会抢走哪些键”。
4.6 新发现:if else if 链污染下游独立 if
现象:

根因:
Axure 在执行 if else if 链后,可能没有“重置”条件链的状态。 后续的独立 if 被当作“链的延续”来评估,而由于链前面已经命中过,后续的 if 就被短路了。
通俗说:if else if 链“没关干净”,把后面的 if 吞了。
解决方案:

推荐 A 或 C。
4.7 应用规则

4.8 同类逻辑必须对称
多组件场景下(如子弹 A、子弹 B、子弹 1/2/3),为其中一个组件添加条件时,必须同步检查所有同类组件。
例:为“子弹 A 击中钢”添加 Pic_5 == “0” 条件后,必须同步为“子弹 B 击中钢”添加相同条件。否则已穿钢时,子弹 B 的击中钢会被触发两次。
这是一类可迁移的经验——多实例逻辑必须一致。
五、分支控制:四种终止方法
5.1 方法一:不写 else —— 轮空终止
【伪事件】:
用例 1:[[条件 A 成立]] → 执行动作 A
用例 2:[[条件 B 成立]] → 执行动作 B
(没有 else)
当 A 和 B 都不成立时,什么都不执行,逻辑“自然结束”。

5.2 方法二:刷新页面 —— 重建终止
【伪事件】:
…执行…
打开链接 → 刷新当前页面
刷新后,页面重建,所有状态清零。

5.3 方法三:时间约束 —— 窗口终止
【伪事件】:
条件:[[Now.getTime() – 起始时间 < 窗口时长]]
→ 执行动作
(超时则自然跳过)

5.4 方法四:逻辑条件约束 —— 标志终止
【伪事件】:
条件:[[标志累加值 >= 阈值]]
→ 终止逻辑
否则:
→ 继续

5.5 四种终止的对比

六、多层嵌套的实践
6.1 嵌套的三种形态
形态一:元件内嵌套
【伪事件 A】:
用例 1:条件成立 → 执行动作
用例 2:条件成立 → 【伪事件 B】
形态二:跨元件嵌套
元件 A 的伪事件:触发 → 元件 B 的伪事件
形态三:循环嵌套
【伪事件 循环】:
1. 处理当前帧
2. 等待 20ms
3. 触发 → 【伪事件 循环】(自己)
6.2 嵌套深度建议

超过 4 层,考虑用“单一入口 + 来路分派”扁平化。
6.3 避免死循环
循环伪事件(如步进循环)必须带终止条件——通常由状态变量控制(状态为 0 时停止循环)。
七、本项目实践
7.1 案例一:敌方坦克的七类事件
一辆敌方坦克挂载 7 类事件:

四类伪事件都是“多入口、多层级”的 if 判断链,覆盖 18 类决策。
7.2 案例二:监听器的多输入巨输出架构
监听器是中继器内部的元件,承担“数据查询”职责。

监听器的多输入巨输出架构
【输入】(多头外部输入)
├── 玩家子弹 A/B 端点行号
├── 敌方子弹 1/2/3 端点行号
└── 其他需要查询的格子行号
【查询】根据行号读取中继器数据
【输出】(巨量伪事件)
├── 尺寸改变 → 击中砖/钢:爆炸 + 编辑行数据
└── 滚动 → 击中钢:火花
注:V8.1 中“击中砖/钢”已统一用“尺寸改变”触发,避免触发方式不对称导致的双响丢失。
7.3 案例三:玩家坦克的“军师”拆分

7.4 案例四:护城河——用双层伪事件实现“按需查询”
子弹在远离墙带时,不需要查 MapStr。为减少“吃空饷”,用两个伪事件实现切换:

结界:用双层伪事件实现“按需查询”
【拖动】—— 远离墙带
If 在护城河外:
→ 移动、等待、触发自己(轻量循环)
【拖动后松开】—— 在护城河内
If 在护城河内:
→ 移动、计算端点、触发监听器、等待、触发自己(监听循环)
Else If 存活:
→ 触发「拖动」(回到轻量循环)
效果:子弹在墙带外飞行时,不打扰监听器;进入护城河后,才开始查 MapStr。
八、代价与边界
8.1 八种代价

8.2 边界

九、知识体系图

知识体系图
十、一句话总结
Axure 没有程序结构,但有伪事件。
用伪事件模拟函数、参数、分支、调用、嵌套、终止。
“并列 If 都评估” ≠ “并行”。Axure 是“顺序评估 + 短路”。
if else if 链可能污染下游独立 if——调整顺序,或隔离事件。
同类逻辑必须对称——一处遗漏,行为不一致。
伪事件源要选安全的——拖动会被误触,滚动更可靠。
这是结构维度的解法,和时序控制(时间维度)互为姊妹篇。
附录:姊妹篇:
《Axure RP 时序控制方法——给事件精确硬塞时序》
解决的另一个维度:时间。

本文由 @CHI 原创发布于人人都是产品经理。未经作者许可,禁止转载
题图来自作者提供

起点课堂会员权益





本文基于《终章 2026》ChiTank · Axure RP 坦克对战原型的实际开发经验整理。
项目作者:郭池(http://www.guochi.org)
试玩体验:http://www.guochi.org/ChiTank/