作者lpyd (我爱飞碟(FM92.1))
看板PttNewhand
标题[转录]pmore 2007 互动式动画系统技术手册
时间Sun Dec 9 16:48:07 2007
※ [本文转录自 BBSmovie 看板]
作者: piaip () 看板: BBSmovie
标题: pmore 2007 互动式动画系统技术手册
时间: Sun Dec 9 11:05:22 2007
=============================================================================
pmore 2007 互动式动画系统技术手册
VERSION 1.1
最後更新: 2007/12/09 14:00
=============================================================================
0. 序
2005 年的夏天,一个划时代的 BBS 文章浏览程式 pmore 诞生了。
它所内建的简易文字动画播放功能,更是让在 BBS 上观看文字动画
成为全新的体验。 虽然原始的 pmore 动画只是单纯的时间轴系统,
但在众家高手的巧思下也有不少实验性互动作品的出现 (见 PTT
BBSMovie 板);创意十足,只可惜受限於旧系统,操作上总是不太方便,
问题也很多。
2007 年冬,根据这两年来所收集到的成果与意见, pmore 的动画系统
进行了一连串的改进与新增,加进了大量的播放控制与互动能力。
迷宫、RPG、太鼓达人、多重结局动画,这些都不再是梦想。
这篇文件是写给有志利用新系统
「制作」动画的,
所以里面会有不少技术性的东西;请多多谅解。
如果你只是喜欢「看」动画,後面讲的东西不需要懂、直接左键跳出
也是完全没问题的!
本文定位是技术手册而非动画入门,假设你已对文字形动画有一定程度的
理解、最好自己作个简单的作品、也大概见过 pmore 传统动画。
如果你是刚接触 ASCII Art 的新手,建议你先观摩一下其它高手前辈的作品
(ex, AsciiArt, BBSMovie) 可能会更容易理解这篇在谈的东西。
PS: 由於 2007 新增的内容实在太多,这次的技术手册本身不使用动画格式写
不过有另一篇「pmore 2007 互动功能简介」
本身就是用新互动语法写成的介绍,可以方便你体验互动式的乐趣。
=============================================================================
1. 一般动画
除了加入少量控制指令,传统动画部份没有什麽大改变,
不过为了方便後面说明,还是重新简单介绍一下吧:
先来定义一些名词
Frame 画面
一个动画,其实就是一连串的画面,在连续的时间内交换显示。
BBS 的文字动画本质上也是如此。 我们把每次显示、使用者所看
到的单页称之为一个画面 (英文为 Frame)。
Escape Code 控制码
由於我们的动画是用纯文字写成的,所以要一些特别的符号
来指示系统该怎麽处理播放时间的变化,或是画面的开始。
这种东西被通称为控制码。 pmore 的控制码是写成 ^L
注意这是分别打入「^」 (Shift-6) 与大写「L」两个符号的结果。
在 BBS 的编辑器中压着 Ctrl 再按 L 只会重新显示,不会
跑出这个符号。
注: 在 PTT 新版的编辑器中,当你正确的打入 ^L 後该行
会变色。 如果没有变色,代表你的输入方式有误。
注: 对於许多人问「按 Ctrl 再按 L 没反应」这点深感抱歉,实际上
pmore 真的接受 Ctrl-L 为控制码,只是大部份的 BBS 编辑器按
Ctrl-L 都是重绘萤幕指令而非输入 Ctrl-L,所以现在都以输入
Shift-6 (^) 再按 L 比较方便。
Time (Duration) 播放时间
每张画面从出现到消失(被下张取代)的时间就是所谓的播放时间。
在 pmore 的系统中,这个时间是有下限的: 最短不能少於 0.1 秒。
这个数字是参考到网路延迟、系统效能、还有使用者反应时间所
定出来的。
Timeline 时间轴
整个动画在播放时的时间与顺序变化可称之为时间轴系统。
传统 BBS 动画等於没有时间轴,完全靠使用者手动翻页。
pmore 动画的时间轴是靠指令设定的。
-----------------------------------------------------------------------------
1.1 画面开始
^L
FRAME START 画面开始
pmore 动画的每张画面,都是从以 ^L 开头的一行开始的。
这行不会显示在萤幕上,而且萤幕只会显示到下个 ^L 出现的那行。
所以你可以不用在意每张画面有没有对齐 22 行,
也可以一路画到第 23 行。
另外每个 ^L 後面可以带一个时间参数,单位为秒。
若没写时间,则此画面的播放时间与上一张相同。
最开始预设的时间是 1 秒。
范例:
^L (播放 1.0 秒)
^L0.5 (播放 0.5 秒)
^L (与上张同 - 播放 0.5 秒)
^L10 (播放 10 秒)
^L0 (少於最短播放时间的一律会变为 0.1 秒)
注: 每个 ^L 一定要对齐该行开头。
另外,由於系统效能考量,第一个 ^L 一定要出现在文章开始显示的
第一页范围内,否则不会被视为动画档。
在 BBS 编辑器中观看时,它的前面应该没有任何空白,
也没有 ANSI 控制码 (某些特殊码例外)
详情见参见 1.5 隐藏控制码
-----------------------------------------------------------------------------
1.2 基本播放控制: 暂停 (2007 新增)
^LP
PAUSE 暂停播放
以往想让使用者看仔细一点的画面,
常常有人写成 ^L99999
然後画面指示「看完请看任意键後再按 p (继续播放)」
秒数写少看不清楚,写太多操作又复杂
^LP 就是为了解决这个问题而诞生的。
^LP 会让该页提示使用者按下任意键後再继续。
范例:
^LP
-----------------------------------------------------------------------------
1.3 基本播放控制: 停止 (2007 新增)
^LE
END 结束播放
旧版 pmore 动画结束後会一路跳到文章最底下
很难在文章结尾放些说明文字或感言
所以也有人常在想结束的地方写 ^L99999
现在不用这麽麻烦了,
^LE 会直接在该页停下来。
范例:
^LE
-----------------------------------------------------------------------------
1.4 时间同步
^LS
SYNC 同步播放
这是为 KTV 系列动画而生的指令。 此类需要与现实世界对时
(电脑一面播歌,一面放动画) 的动画会受到网路的影响使得
动画产生延迟,播久一点後画面跟声音就对不起来了。
^LS 会使时间计算忽略网路延迟,不过实际播放效果仍可能
受到网路影响,端看使用者的网路连线品质有多好。
范例:
^LS0.8 (此页会不计网路延迟的播放 0.8 秒)
注: 非同步播放的计时是由「本张画面显示完」开始计时,每张独立;
同步播放的计时则是由「上张画面显示完」开始,每张相关。
^L0.5 跟 ^LS0.5 的差别用图来解说: (若延迟 0.1s)
时间轴: 0 0.5 0.6 1.0 1.1 1.2
|--------|-----|--------|-----|-----|------->
^L 非同步: |<-0.5s->|<0.1>|<----0.5----->|<0.1>|<--0.5-->
画面1 画面2 画面3
^LS 同步: |<-0.5s->|<0.1>|<--0.4->|<0.1>|<---0.4--->
画面1 画面2 画面3
由上图可得知, ^LS 可以让设计者直接对时,不需要考虑延迟时间。
如果你还是不懂 ^LS 在干麽,没关系...
^LS 跟互动式无关,使用上也不用特别设定
只要记得
「如果你的动画会要求使用者开别的程式同时运作,
就把全部的 ^L都改成 ^LS 」
例如叫使用者开着 mp3 在旁边播歌之类的
基本上 ^LS 就只有这种时候才好用。
-----------------------------------------------------------------------------
1.5 隐藏控制码 (2007 新增)
*[30;40m^L
INVISIBLE ESCAPE 隐藏控制码
做好的动画档出现一堆 ^L 显示在萤幕上总是讨厌的事。
想把它放在第二页又不行,因为只有第一页有出现 ^L 才能播放。
pmore 2007 有稍微修正这个问题,不再显示第一页的控制码;
但若想转到其它 BBS 时,又会冒出一堆 ^L
於是,pmore 2007 支援前有 *[30;40m ANSI 码的 ^L,
(30;40 为黑底黑字)。
控制码後面有没有 *[m 不影响,不过多数人为了把颜色设回来
应该都会加吧。
范例:
*[30;40m^L2.5*[m
*[30;40m^LP
(上面的 * 都是在 BBS 打入 ESC 控制码的特殊字元)
另外为了与传统 24 行动画对齐开头,最前面还可以再加个 ==
范例:
==*[30;40m^L2.5
==*[30;40m^LP*[m
注: 为了效能考量,目前只开放 *[30;40m 一字不差的写法。
也就是说, 下列写法都是错误的:
*[0;30;40m^L (前面多了 0;)
*[30;40m ^L (中间多了空白)
*[37;47m^L (37 47 不行)
*[m*[30;40m^L (前面多了 *[m)
--*[30;40m^L (目前只接受 == 不接受 --)
=*[30;40m^L (少一个 = 也不行)
==^L (很抱歉目前也不接受这种)
在实装 pmore 2007 的系统上,编辑器通常会帮 ^L 行变色。
如果你的 ^L 没有变色,请检查是不是多了还少了什麽。
-----------------------------------------------------------------------------
1.6 与传统动画相容 (2007 新增)
^LO=
OLDMODE 传统动画
pmore 动画系统目前仍然只有使用 pmore 的 BBS 站支援,
也就是说当你选择了这种动画後,也暗示着动画的不易流通。
为了解决这种遗憾,pmore 加入了隐藏控制码 (见前章),
这样只要你在传统动画的23行分隔线处加入 pmore 控制码,
就可得到「有 pmore 会自动播放、非 pmore 仍可手动翻页」
的结果。
不幸的是,除非你每页都加,不然 pmore 会直接跳到档尾 -
因为它找不到後面的 ^L。
^LO= 就是解决这个问题的。 (是英文的大写 O 而非数字 0)
加了这行後等於帮使用者按了小写 p (播放动画),而且可指定时间。
适用於不想全篇改写的旧动画。
范例:
^LO=0.5
以传统模式播放,速度为每张 0.5 秒
与隐藏控制码可混用,如:
==*[30;40m^LO=0.5*[m
假设你已经作好了一个传统的 24 行动画,
只要在第一行加入上面的码, (後面全部一行都不用改!)
它就会在 pmore 系统上有自动播放的效果
(询问使用者要不要播放、且会自动对齐第一行後再播放)
在非 pmore 的外站上则与一般传统动画无异。
=============================================================================
2. 互动式动画
pmore 2007 最大的特色就是加入了大量互动的指令,
使得游戏、多重结局的动画都不再是梦想。
某种程度而言,它也可以当成一个迷你的 BBS 程式发展平台。
-----------------------------------------------------------------------------
2.1 动画编号方式
要谈互动式的动画制作前,有些观念要先理解。
一个互动式的动画不外乎两大重点:
1. 取得使用者的输入
2. 根据输入作出不同反应。
取得输入会在後面的章节介绍,现在先来谈谈怎样作出「反应」。
目前的动画系统,唯一的反应其实就是换画面,也可说是「跳页」。
例如使用者按 1 就跳第 1 页,按 2 就跳第二页。
在 pmore 要换画面,先要知道每一张画面是怎麽编号的,还有怎麽指定
跳页的目标。
前面提过, pmore 动画的每一张画面都是从 ^L 开始的;
^L
画面一
^L
画面二
^L
画面三
从档案开始,第一个出现的 ^L 编号为 1, 可称之为「画面1」 (frame 1)
要指定一个画面,在 pmore 的语法简写中称之为「cmd」 (command)
一个 cmd 实际是由两个部份构成的:
TypeOffset
Type 可以想成「单位」,Offset 可以想成「编号」。
Type (单位) 可直接指定画面(frame),或是页数(page)、行数(line)
、别名 (named,详见 3.4 画面命名)。
每种单位的编号都是从 1 开始计算。
Type 的语法就是各单位的英文缩写: f, p, l。 (named 格式 为 :xxx:)
Offset 通常是一个数字。有正负号时代表它是「相对」的单位,
无正负号时则是「绝对」的单位。
有点复杂吗? 直接来看例子吧:
f1 => frame 1 (第 1 张画面)
p+2 => page +2 (往後 2 页)
l-100 => line -100 (往前 100 行)
:named: => named (寻找叫作 named 的画面, 详见 3.4)
注: 由於播放时在跳页後每页还是会从 ^L 开始显示 (新页在 ^L 出现之前的
内容不会显示),加上 page(页)会受不同连线程式视窗大小的影响,所以一般
还是建议以 frame 或 name 为单位。
常见错误:
5 => 没 type, 系统不知你是要指定哪种格式
f0 => 0 没有东西,编号由 1 开始。
-----------------------------------------------------------------------------
2.2 跳页
^LGcmd
GOTO 跳页
最自然的练习,就是由直接跳页开始了。
跳页(画面)的指令叫 ^LG, 後面接个 cmd (参见 2.1 动画编号方式)
实际效果就是直接跳到该页後继续播放。
常见的应用是无限重播的区段。
注意有跳页指令时该页本身不会显示出来。
范例:
^LGf1 (跳到第一张画面)
^LGf+3 (往後跳三张画面)
实例:
^L0.5
画面一
^L
画面二
^LGf-2
画面三
上面的指令会造成画面不停的加互显示「画面一」「画面二」
但「画面三」字样不会出现。
注: 跳页另外有些限制:
- 无法跳到第一张画面之前 (例: 在第 2 张画面打 ^LGf-2 无效)
- 无法跳到自己本身 (例: 在第 2 张画面打 ^LGf2 无效)
- 跳页本身会花费一张画面的最短播放时间 (目前为 0.1 秒)
- 跳页失败时会视情况变成改显示下张画面或是停止播放
- 跳页失败时请检查 cmd 的 type 是否忘了写,如 ^LG2
-----------------------------------------------------------------------------
2.3 互动选项
^L#key,cmd,text#
OPTION 互动选项
互动式选项 ^L# 可说是是 pmore 2007 动画系统最主要的核心了。
它让你的动画可依使用者的输入(key)进行不同的反应。
^L# 的基本形可以拿来作 RPG-Like 的互动游戏。
初看有点复杂,其实只要掌握两个原则就好了:
1. 每一个选项用 # 包起来,也就是 ^L#选项1#选项2#选项3#
2. 每个选项内的设定用逗号 (,) 分开,也就是 #设定1,设定2,设定3#
那麽,再来细看语法吧:
^L#key,cmd,text#
key: 使用者可按下的快捷键 (只能单键,如 1 2 3 a b A B ...)
cmd: 被选取後要执行的动作 (就是跳页,见 2.1 动画编号方式)
text: 显示在萤幕上的说明 (可省略)
范例:
^L#a,f1,首页#
按下 a 时会跳到第一张画面
^L#b,f-1,前面#c,f+2,结束#
按下 b 会跳往前一张画面,按 c 则会往後两张画面
标准形式在萤幕的下方会照你的顺序显示一排选项列。
这些选项可用方向键移动选取,也可用你指定的 key 当热键按。
key, cmd, text 这三个要素,基本上只有 cmd 是必需的。
(当然, key 跟 cmd 中间的分隔逗号也不能少)
key 省略时,系统会由前一个 key 来产生下个 key。
^L#a,f1,这是a#,f2,这是b#1,f1,这是1#,f2,这是2#
这例子中,省略的两个分别会变成 b 跟 2。
text 省略时,系统不会出现选项列。请记得在你的动画中提示
使用者现在该作什麽事。
^L#a,f1#,f2#,f3#,f4#
按 a 跳第一张, b 跳 2, c 跳 3, d 跳 4
而且没有选项列
注: 选项列会不会出现实际上是看「第一个选项的 text」有没有被省略。
也就是说,
^L#a,f1#,f2,看不到# <- 这行一样没选项列。
^L#a,f1,有文字#,f2# <- 这个有选项列,第 2 个选项会显示热键
注: ^L## 结尾要有对应的 # 包起来才行!
常见错误:
^L#a,f1,选项一#b,f2,选项二 <- 选项二无作用
=============================================================================
3. 即时互动与进阶
下面讲的是更高级的特殊指令及应用,
主要是让互动更进一步变为即时性的互动,
例如「在某时使用者按下某键才会有反应」的效果。
-----------------------------------------------------------------------------
3.1 特殊按键与预设选项
@
NAMED KEY 特殊按键
有些键无法用标准的语法表示出来,所以 pmore 提供了一些特殊的名字。
此类按键表示法一律以 @ 开头,後面接单一个字元,大小写有别。
@u UP 方向键(↑)
@d DOWN 方向键(↓)
@l LEFT 方向键(←)
@r RIGHT 方向键(→)
@b BS 倒退键
@H HOME Home
@E END End
@P PGUP PageUp
@N PGDN PageDown
@I INS Ins
@D DEL Del
另外还有一个特别的叫
@a ALL/ANY 任意键
范例
^L#@u,f1# 按↑时跳到第1张画面
^L#@d,f2#@a,f-3# 按↓时跳到第2张画面,
其它任何键都往前跳3张画面
注意即使是 @a 也无法盖掉系统的中断键 (目前为 q, Q, Ctrl-C)
选取键 (空白键与 ENTER) 的功能也无法改变,但有别的技巧
可以「使用」这两个键。
对於每个 ^L# 指令来说,预设的选项就是第一个选项。
按下空白或 ENTER 就是「选择目前选项」。
所以,只要在编辑指令时把 ENTER/空白 想让它们做的事放在第一个选项即可
-----------------------------------------------------------------------------
3.2 即时互动
^L#time#key,cmd,text#
TIMED OPTION 计时互动选项
「计时互动是为了即时互动而产生的指令」。
简单的说,标准形的 ^L# 会停在那里等使用者输入。
可是如果我想要作出使用者在不同时间按会有不同反应的效果呢?
(ex, 太鼓达人、大家来找碴类)
只要在 ^L# 各选项前先放个时间单位就好了
范例:
^L#0.5#a,f1,首页#b,f10,结束#
0.5 秒内使用者按 a 则跳第一张画面,按 b 跳第 10 张
什麽都没按则播放下张画面。
-----------------------------------------------------------------------------
3.3 保留按键
^LK##
PRESERVE KEY 保留互动按键
当你开始制作即时性动画时常会遇到一个问题 -
使用者在没有互动的页按了键使得动画中断。
一个解决方法是把全部的画面都变成计时互动,不过这样修改实在工程浩大
所以有个特别的指令叫 ^LK, 保留按键 (也就是说,使用者按下这些键时
什麽事都别作。)
^LK 目前只支援保留按键给互动式选项 (^L#) 使用,所以语法就是
^LK#keys# keys 为你要保留的键。
范例:
^LK#abc123# 保留 a b c 1 2 3 为互动所需要的键
^L2.5 (此时使用者按 abc 123 都不会停下来)
^L#a,f1#
...
当然, ^LK## 可以使用所有的 @ 特殊按键 (包括 @a),所以即时互动
的动画开头最常写的就是:
^LK#@a#
这样除非使用者按下系统中断键 (q,Q,Ctrl-C) ,不然什麽键都不会打断你的
播放。
另外,由於 ^LK 只是设定系统而非动画控制指令,所以你可以在它後面
再接上标准的控制语法。
范例: 下面两个为常见开场法
^LK#@a#2.5
停留2.5秒的首页,设定本动画不被任何键中断
^LK#@a#P
互动方法说明的首页,设定本动画不被任何键中断
设定一次 ^LK 後会一直有效,直到下次再指定。
^LK## 等於放弃所有指定的保留效果。
-----------------------------------------------------------------------------
3.4 画面命名
^L:name:
NAMED FRAME 画面别名
互动式动画有个特色 - 很快你就会发现画面数量成长的速度大幅增加,
要管理各画面的关系是个大问题。
相对编号 (f-2, f+10) 小动画勉强可用,但是当你有一连串互动指令
都要跑到相同的结尾时,只要中间增减一张画面就要到处改编号 -
非常的麻烦。
最简单的方法,就是为画面命名。
语法为用 :: 包起来的字串,只可使用英文字母及数字 (大小写有别)。
范例:
^L:end: 本画面的名字为 end
另外,由於 ^L:name: 只是设定名称而非动画控制指令,所以可以在它後面
再接上标准的控制语法。
^L:home:P
设定此页名为 home, 并在显示内容後暂停。
若想跟其它非控制命令如 K## 合用,则 :name: 要在最前面
^L:home:K#@a#P
设定此页名为 home 、保留全部按键供互动使用、
并在显示内容後暂停。
要使用有名字的 frame, 只要一样用 :name: 来指定就好了。 :name:
格式属於正常 cmd (见 2.1 动画编号方式) 之一,所以可以
在 ^LG 跟 ^L# 中使用。
^LG:end:
跳至叫 end 的画面
^L#1,:opt1:#,:opt2:#,:opt3:#
按下 1 时跳至叫 opt1 的画面
按下 2 时跳至叫 opt2 的画面
按下 3 时跳至叫 opt3 的画面
使用命名方式,则不管你中间增减多少页,系统都能正确的跳页。
-----------------------------------------------------------------------------
3.5 乱数跳页
^LGcmd,cmd,cmd,cmd
GOTO(RANDOM) 跳页(乱数)
有一种应用是,例如在设计 RPG 时想让敌人的反应每次都不固定,
但又不希望是写死靠使用者按键的时机决定的,
此类可以利用乱数跳页的功能。
语法上与跳页一模一样,只是跳页变成一排由逗号 (,) 分隔的列表。
范例:
^LG:scn1:,:scn2:,:scn3:
随意跳到 scn1, scn2, scn3 中的任一个
=============================================================================
4. 感谢
pmore 2007 的互动式功能在开发期间受到许多位动画高手的协助测试并给予建议,
特别感谢下面几位的大力支持,在系统未成熟时就开始试作动画,使得系统的开发
能进行的更加顺利:
ForSinSoKing solusmilk Vorukrus yoway945
Kinra john112136 janetangel slowcloud
pmore 2007, by piaip
=============================================================================
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.30.49
1F:推 Star123:推推 12/09 11:32
2F:推 DrRd:收藏个版,见证动画的进步XD 12/09 11:33
3F:推 tang76430:大推!! 12/09 11:34
4F:推 Kane0513:好深奥 看不懂(哭) 不过还是推啦 超强XD 12/09 12:29
5F:推 Kinra:推 感谢piaip 12/09 12:33
6F:推 ForSinSoKing:辛苦了, 感谢piaip的辛苦制作:) 12/09 12:33
7F:推 nonoise:真的要感谢piaip和上面列的众人 12/09 12:34
※ 编辑: piaip 来自: 140.112.30.49 (12/09 13:53)
8F:推 Kenqr:推! 12/09 14:34
9F:推 Vorukrus:辛苦了! 12/09 16:24
10F:推 hjc12345:辛苦了!!!很棒! 12/09 16:31
--
*────────────────────────────────────┐
◢██◣ ◢██◣ ◢█▍╭╮ ╮╭┬──╮╭┬──╮*────广播╮ │
█▉██ █▉██ █▉ ││ │││ ││ │┌─飞碟联播─┘ │
█▉██ █▉██ █▉ ││ │├┼──╯││ │╰空中的梦想家┐ │
◥███ ◢▇█◤ █▉ ││ │││ ││ │╭就爱电你UFO~╯ │
◥▇█◤ ████ ● █▉ ╰┴──╯╰╯ ╰┴──╯└───UFO-Radio┘
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.166.217.199
11F:推 xx5236294roy:借转Rubiks板,谢谢 59.115.50.116 06/01 11:53