Elite Member
|
非常經典的跑馬燈設計:..
不管是title formatting也好..
或著其他程式語言..
都可能有類似這樣的設計...
值得可學習的...
首先考量到文字移動和空白插入...
我想達到兩個目標:
1. 隨意插入空白
2. 我想左就左, 想右就右
我大概粗淺講一下...
插入空白是介於文字和文字之間..
也就是說我可以想成空白是作為偏移的關鍵點...
A部分文字+B部分空白+C部分文組成ABC三區塊..
我可以進行推論, 假設左移的話..
ABC=>BCA=>CAB=>ABC=>...loop
如此這樣反覆...
我把ABC三區塊模擬成個別的buffer..
我可以這樣猜想, A是首先要出現的..
第一次出現全部文字然後往左偏移減少...
A剛開始的buffer size等於整個文字大小(Lt)...
所以它是可顯性的, 我把它命名為:fBuffer...
然後我定義一個offset, offset是步進增加的...
對於fBuffer來說, 內存放的文字往左偏移..
必定是減少, 所以, fBuffer=Lt-offset
所以offset是起始計算, 從0起跳, 展現形式如下:
$puts(offset,$mod(%playback_time_seconds%,$get(titleLen)))
同樣是用餘數解來計算, 這樣的作法其實相當廣泛使用...
既然fBuffer=Lt-offset.., 左移後, 右邊接的肯定是空白(B)..
對於空白存放的緩衝區而言, 我命名為sBuffer...
他同樣也是左邊移動, 並且是以步進的方式...
因此對於sBuffer來說, sBuffer=Lt-offset, 往左移動..
但是請注意, 這個空白一開始是不可見的, 而是往左偏移後才出現...
那剩下的就是一開始完全看不到的C部分文字, 往左移動..
這個一開始不可現的buffer, 我命名為bBuffer
bBuffer往左移, 但是值得注意的是, 他是要和sBuffer大小一起合算...
也就是說, len(sBuffer)+len(bBuffer)=Lt, 剛好等於整串文字的大小..
結果就是Lt=fBuffer=len(sBuffer)+len(bBuffer)
這樣的平衡式在偏移的時候才不會發生問題...
那對於bBuffer的大小來看...
他是往左偏移, 可是一個重點是, 他卻是往左增加..
這點要注意!..從sBuffer開始起算....
sBuffer=Lt-offset, offset位置之後是接...
那要算進sBuffer的話, 必須要把sBuffer的大小給扣除..
也就是說, bBuffer=offset-len(sBuffer), 並且左偏移遞增文字...
那最後得出三個式子:
fBuffer=Lt-offset
sBuffer=Lt-offset
bBuffer=offset-len(sBuffer)
這三個式子的差異, fBuffer可顯性但持續減少; sBuffer一開始不可顯, 但往後顯示...
bBuffer必須要等待sBuffer完整出現後, 才會步進顯示...
fBuffer是由右往左移, 請注意! 是由右往右, 可採用$right偏移..
同樣sBuffer也是由右往左, 一樣採$right進行偏移..
最後的bBuffer是重點了, 他是往左..., 但是它是由左往右遞增..
請注意是由左往右遞增, 所以採用$left...
先把前置條件都完整寫出來...
$puts(spaceNum,2)
$puts(titleLen,$len(%title%))
$puts(space,$repeat(' ',$get(spaceNum)))
$puts(offset,$mod(%playback_time_seconds%,$get(titleLen)))
那麼fBuffer由右往左:
$puts(fBuffer,$right(%title%,$sub($get(titleLen),$get(offset))))
sBuffer同樣也是:
$puts(sBuffer,$right($get(space),$sub($get(titleLen),$get(offset))))
再來bBuffer是由左往右遞增:
$puts(bBuffer,$left(%title%,$sub($get(offset),$get(spaceNum))))
最終再將每一個給get出來:
$get(fBuffer)
$get(sBuffer)
$get(bBuffer)
因此整個左偏移跑馬燈設計就出來了...
再次提出完整代碼:
$puts(spaceNum,2)
$puts(titleLen,$len(%title%))
$puts(space,$repeat(' ',$get(spaceNum)))
$puts(offset,$mod(%playback_time_seconds%,$get(titleLen)))
$puts(fBuffer,$right(%title%,$sub($get(titleLen),$get(offset))))
$puts(sBuffer,$right($get(space),$sub($get(titleLen),$get(offset))))
$puts(bBuffer,$left(%title%,$sub($get(offset),$get(spaceNum))))
$get(fBuffer)
$get(sBuffer)
$get(bBuffer)
還有一個換方向的, 稍微更改寫法如下, 有興趣者可以自行理解:
$puts(spaceNum,2)
$puts(titleLen,$len(%title%))
$puts(space,$repeat(' ',$get(spaceNum)))
$puts(offset,$mod(%playback_time_seconds%,$get(titleLen)))
$puts(bBuffer,$right(%title%,$sub($get(offset),$get(spaceNum))))
$puts(sBuffer,$right($get(space),$get(offset)))
$puts(fBuffer,$left(%title%,$sub($get(titleLen),$get(offset))))
$get(bBuffer)
$get(sBuffer)
$get(fBuffer)
|