哈囉,經過十一期的講解之後,本期就要為ScreenSaver Maker做下一個完結了,
感謝各位的光臨與支持,作者將所有的教學文件壓縮成一個Zip檔放在下載區,
有興趣的可以把它下載回去,方便離線閱讀,不囉唆,繼續我們的講解吧! 上回講解完了由左至右的表現方法,不知道各位有沒有想通其原理,接下來的三種 特效的顯示方法其實也就可以推出來了,例如由右至左的表現方法,其實它的算式與 由左至右完全相同,差別只在於開始的基準點而已,但是由於最後一次的StretchBlt 會可能因為環境造成失敗的原因,所以當執行由右至左的特效時,可能會發生下面這樣 的繪圖狀態 1. 2. 3. 4. 5. 像這種情況,就應該做特別的處理,否則都會變成很不自然的情形,在ver0.91都已經做了修正, 再建議你們一次,把程式中寫檔的註解拿掉,觀察值的變化,這樣會比較容易看懂的, 接下來的由上至下或由下至上,其原理就沒有什麼值得解說的了,差別只在於X與Y的立場互 換而已。搞懂上面的原理,接下來的亂數填入就單純多了,看一下程式碼 |
|
在程式執行亂數填入的特效前,程式會先呼叫GetRandomArray(在GetEffectTime),
在變數rndFlag裡填入1~49(7*7)的亂數,進入特效處理後,再依序取出陣列中的亂數值,
算出它在7*7陣列中的座標,再算出在這個位置的X,Y座標,就可以正確的繪出,
計算的原理其實和前面的處理一樣,只不過這次X,Y都會變化而已,為了紋路的處理,
一樣做了計算補償的動作,雖然這次的計算方式不會有上面產生空白的問題,不過
還是更正了一點計算不周詳的地方。不過對程式沒有太大影響。 最後是我最頭痛的地方,對於這種左上-右下的表現方式,我完全完全完全不知道 別的程式是怎麼做的,所以推演出來的演算法效率算不算好,或者有沒有更方便的方 法,老實說,我一點把握都沒有...,各位如果也沒有更好的方法的話...就姑且聽聽吧 首先,我們想像整張圖被切成n*n的矩陣,那麼,如果要達成左上-右下的特效表現的話, 我們就要這樣描繪圖型 1.
2.
3. 4.....以此類推 |
由上面的圖型可以推出一個定論 1.(1,1) 2.(2,1),(2-1,1+1) 3,(3,1),(3-1,1+1),(3-2,1+2) 也就是目前執行的次數,就是X的起始座標,Y的起始座標為1,然後X依次遞減至1,Y則依次 遞增,這樣一次次的描繪就可以展現出左上-右下的表現了,接者,在描繪到最右邊時,如果依 據這個公式繼續算下去的話,會發生超出螢幕範圍的無效繪圖動作,你可以想像一下,如果依 據這個公式去向一個5*5的矩陣作左上-右下的特效,那麼會計算發生這種情形 1.(1,1) 2.(2,1),(2-1,1+1) 3,(3,1),(3-1,1+1),(3-2,1+2) 4.(4,1),(4-1,1+1),(4-2,1+2),(4-3,1+3) 5.(5,1),(5-1,1+1),(5-2,1+2),(5-3,1+3),(5-4,1+4) 6.(6,1),(6-1,1+1)..... 以這個公式來計算,一個n*n的陣列,要完全描繪到每一個地方,需要n*2次才可以, 但是其中也會因此產生n*n個無效的計算值,因此程式要判斷這一點, 把無效的繪圖動作直接跳過,這樣才不會擔誤太多系統的時間(相差近一倍之多喔!),當然, 你也可以直接判斷目前執行的次數,直接設定X,Y的起始值,那也是可以的,不過作者比較懶, 就這樣帶過囉!至於Ver0.9與Ver0.91的差別...,作者太混了!Ver0.9有很多設錯的值,起始值 等等...有些變數的值都搞錯了,造成一些無效的繪圖動作,這些都在一一比對後,於Ver0.91修 正了,至於右上-左下的原理也是相同的,只要將其規則推出來,就可以做出來了。
Ver1.0 Update:
後記: |
回到VB教學教室 |