瀏覽單個文章
vxr
Elite Member
 
vxr的大頭照
 

加入日期: May 2002
您的住址: 地球的上面..
文章: 5,854
Exclamation

補2011/11/07: 左右級距部分字串標示控制
這是我寫的另一個特效代碼...
此範例在設計上相當彈性, 因為它的控制標示字串允許更變...
不過這個範例的缺點就是代碼並不容易理解...
假設有一個title正在被撥放..
他想要的效果為:
第一秒: ABCDEFGHI
下一秒: ABCDEFGHI
數到最後: ABCDEFGHI
在來從A開始起跳標示, 由此可以它是一個一個文字偏移標示...
假設這個標示文字設為cPos, 那麼左級距為:dLeft=cPos-1
因此, 右級距為:dRight=T-cPos
我可以導出這樣的代碼:
//titleLen=字串總長度
$puts(titleLen,$len(%title%))
//position=(當前播放秒數/字串總長度)的餘數解+1
//+1的情況是避免被整除掉, 這個是有意義的
$puts(position,$add($mod(%playback_time_seconds%,$get(titleLen)),1))
//左級距控制=從字串由左往右逐一增加文字, 但是要-1, 不可包含position的位址, 因為position就是cPos
$puts(dLeft,$left(%title%,$sub($get(position),1)))
//當前標示文字的位址取出單一文字; cP=position
$puts(cPos,$substr(%title%,$get(position),$get(position)))
//右級距控制=總長度T(titleLen)扣除當前標示文字的位址, 剩下的就是右級距的數值; dRight=T-cPos
$puts(dRight,$right(%title%,$sub($get(titleLen),$get(position))))
//最後我將這些文字效果呈現
<<$get(dLeft)>>
>>$get(cPos)<<
<<$get(dRight)>>
這個範例是一個稍微簡單一點的作法, 不過它有一個問題就是...
如果我想要將標示文字變成1個以上, 那要如何解決?..
在這種情形下, 就會複雜許多, 使用cP控制左右級距, 反而更難處理...
這時候我可以這樣想, 標示一組文字假設它的標示數量為P
總文字長度為T, 那我可以將T除以P, 就是一串文字拆成T/P的等份數量..
N=T/P, 那對於當前的dLeft=k的話...
cP=k+1, 所以, dRight=T-cP..
反而變成從dLeft開始計算, 至cP到最後的dRight...
那麼我們先來看看這段代碼:
$puts(markNum, 2)
$puts(titleLen,$len(%title%))
$puts(partNum,$div($get(titleLen),$get(markNum)))
$puts(partNum,$add($get(partNum),$mod($get(titleLen),$get(markNum))))
$puts(position,$mod(%playback_time_seconds%,$add($get(partNum),1)))
$puts(dLeft,$get(position))
$puts(cPos,$add($get(dLeft),1))
<<$left(%title%,$mul($get(dLeft),$get(markNum)))>>
>>$substr(%title%,$add($mul($get(dLeft),$get(markNum)),1),$mul($get(cPos),$get(markNum)))<<
<<$right(%title%,$sub($len(%title%),$mul($get(cPos),$get(markNum))))>>
很可悲的是, 它不太好懂, 連我自己寫到最後都快看不懂再寫啥了......
首先, markNum就是我要標示的文字數量
titleLen為字串總長度
partNum被求出為titleLen/markNum的分組數量...
另外要考量到無法整除的問題, 不整除會加1...
$puts(partNum,$add($get(partNum),$mod($get(titleLen),$get(markNum))))
不需要搞甚麼條件判斷..
我從partNum的分組數量先算出dLeft=position...
$puts(position,$mod(%playback_time_seconds%,$add($get(partNum),1)))
這種餘數解用法, 前面已經用過好幾次了, 各位可以自行理解....
$puts(cPos,$add($get(dLeft),1))這段就是cP=k+1...
得出這些關鍵要素後, 便可直接寫出剩下代碼...
<<$left(%title%,$mul($get(dLeft),$get(markNum)))>>
dLeft=k x P,
>>$substr(%title%,$add($mul($get(dLeft),$get(markNum)),1),$mul($get(cPos),$get(markNum)))<<
看到這段, 直接昏頭...Orz
它的形式為:cP=(dLeft+1)+((k+1)x P)....
最後, <<$right(%title%,$sub($len(%title%),$mul($get(cPos),$get(markNum))))>>
dRight=T-((k+1)x P), 看下去一整個要命....
各位, 這個需要花些時間去理解, 我也不好去解釋, 它並不太好說明....
當然, 您也可以直接抓取該代碼運作看看結果..
它實際上達到的效果如下, 如果標示數量為2:
ABCDEFG
ABCDEFG
ABCDEFG
...
ABCDEFG
ABCDEFG
...
文字標示相當彈性....
舊 2011-11-07, 09:21 PM #9
回應時引用此文章
vxr離線中