=============================================================================
pmore 2007 互動式動畫系統技術手冊
VERSION 1.4
最後更新: 2008/03/02 16: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 就只有這種時候才好用。
另外要注意是,正確的用法是只在同步開始點使用 ^LS。
(一般動畫只要在開始的第一個使用就夠了) 後面應該使用 ^L
而非 ^LS。這是因為一連串的 ^LS 就跟沒有用 ^LS 是一樣的。
也就是:
^LS0.5 (同步開始)
^L0.1 (這裡不該用 ^LS)
^L0.3
...
如果你寫成
^LS0.1
^LS0.2
^LS
那多半是錯誤的,這跟完全沒有 ^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
註: 為了效能考量,目前只開放與上面一字不差的寫法。
也就是說, 下列寫法都是錯誤的:
*[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,選項二 <- 選項二無作用
註: ^L# 在執行時會依順序判斷按鍵是否符合條件。也就是說,
若有熱鍵重複出現則是前面的會被執行。 適當排列並與特殊按鍵 (見 3.1)
如 @a 合用則可作出「按 XX 鍵執行 YY,其它所有鍵都執行 ZZ」的效果。
=============================================================================
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 中的任一個
其中每一項被選中的機率是相等的,所以若要製造出不等的比例,
把某項重複即可:
^LGf+1,f-1,f-1,:end:,f+1,f+1
有 3/6 的機率前往下一頁
有 2/6 的機率前往前一頁
有 1/6 的機率前往名為 :end: 的頁面
=============================================================================
4. 感謝
pmore 2007 的互動式功能在開發期間受到許多位動畫高手的協助測試並給予建議,
特別感謝下面幾位的大力支持,在系統未成熟時就開始試作動畫,使得系統的開發
能進行的更加順利:
ForSinSoKing solusmilk Vorukrus yoway945
Kinra john112136 janetangel slowcloud
pmore 2007, by piaip
=============================================================================