天才教育網(wǎng)合作機構 > 培訓機構 >

                                                                                        東莞設計培訓網(wǎng)

                                                                                        歡迎您!
                                                                                        朋友圈

                                                                                        全國統一學(xué)習專(zhuān)線(xiàn) 9:00-21:00

                                                                                        位置:培訓資訊 > 體驗Flash MX(8):控制時(shí)鐘Timer

                                                                                        體驗Flash MX(8):控制時(shí)鐘Timer

                                                                                        日期:2005-12-24 00:00:00     瀏覽:338    來(lái)源:東莞設計培訓網(wǎng)

                                                                                          新的閃爍世界按照每天一個(gè)類(lèi)別的新特性來(lái)感受Flash MX的路已經(jīng)走到了第八天,程序和設計的岔路口似隱似現的就在眼前,而我寫(xiě)這個(gè)系列的文章的目的是希望可以拉住要前往設計之路的同行說(shuō):“要不要試一試FlashMX?”,事實(shí)上我不過(guò)是想說(shuō)——FlashMX,通往理性世界的后門(mén)。

                                                                                          一個(gè)簡(jiǎn)單的程序基本流程需要包括:初始化,運行期,結束處理 三部分。當決定了一個(gè)程序的目的后,其3部分的內容也是多樣的,不過(guò)少哪一部分都是無(wú)意義的。

                                                                                          在運行期的處理是通過(guò)一個(gè)主程序時(shí)鐘來(lái)讓程序一直處于循環(huán)狀態(tài),直到用戶(hù)、異常錯誤或系統中斷而退出循環(huán)到結束處理,而這個(gè)時(shí)鐘即是我們今天要學(xué)習的一個(gè)單獨課題。

                                                                                          早期的時(shí)鐘(下面稱(chēng)Timer)很簡(jiǎn)單,直接取用CPU的運算速度并加以簡(jiǎn)單處理,直到高頻率的CPU出現,人們才考慮如何處理/減少CPU間程序運行的差距。Flash 的時(shí)鐘從版本 5的時(shí)代就已經(jīng)看見(jiàn)改良后的效果,雖然在相差太大的機器上還是看到丟幀的問(wèn)題,到Flash MX的今天,我們終于可以控制Timer了。

                                                                                          首先看一個(gè)放松點(diǎn)的例子:

                                                                                          createEmptyMovieClip("mc",1);
                                                                                          function drawDream() {
                                                                                            mc.lineStyle(random(++i/100),++i*random(30),(++i/30));
                                                                                            tempx=random(500);
                                                                                            tempy=10;
                                                                                            mc.moveTo(tempx,tempy);
                                                                                            mc.lineTo(tempx, tempy+300);
                                                                                          }
                                                                                          idDream=setInterval(drawDream,50);

                                                                                          運用setInterval,每50毫秒執行一次drawDream,通過(guò)draw method隨機繪制出來(lái)一個(gè)夢(mèng)的窗簾……(看圖1)

                                                                                        圖1

                                                                                          升華升華……

                                                                                          //dream2

                                                                                          function drawDream() {
                                                                                            if(i==undefined){i=0;keynum=1;offy=300;clr=new Color(pic);}else if(i>=700) clearInterval (idDream);
                                                                                            mc.lineStyle(random(++i/i/10),++i*random(80),(i/50));
                                                                                            tempx+= i*2*keynum/10;  //reverse set
                                                                                            keynum=tempx<250 ? 1 : -1;  //reverse key
                                                                                            tempy=0;
                                                                                            offy-=.07;
                                                                                            mc.moveTo(tempx,tempy);
                                                                                            mc.lineTo(tempx, tempy+offy);
                                                                                            var tempcolor=clr.getTransform();
                                                                                            tempcolor.rb+=i/200;  //color to sun
                                                                                            tempcolor.gb+=i/150;  //color to leaf
                                                                                            clr.setTransform(tempcolor);
                                                                                          }

                                                                                          //init

                                                                                          stage.scalemode="showall";
                                                                                          createEmptyMovieClip("pic",1);
                                                                                          createEmptyMovieClip("mc",2);
                                                                                          createEmptyMovieClip("loader",3);
                                                                                          pic.loadMovie("ice.jpg");
                                                                                          loader.onEnterFrame=function(){
                                                                                           if (_root.pic._width>0){
                                                                                            _root.pic._width=Stage.width;
                                                                                            _root.pic._height=Stage.height;
                                                                                            this.removeMovieClip();
                                                                                            }
                                                                                          }

                                                                                          //init end

                                                                                          //start main timer

                                                                                          idDream=setInterval(drawDream,10);

                                                                                          新手先不要吐血,讓我們一步步深入察看

                                                                                          *步:產(chǎn)生我們Flash MX的初始化//init 到//init end部分,這段開(kāi)始決定了屏幕的顯示模式是拉伸式顯示全部;接著(zhù)產(chǎn)生我們需要的一切mc;產(chǎn)生以后讀入一個(gè)jpg雪的圖片,并附帶一個(gè)讀入的loader,當圖片完全讀入的時(shí)候設置圖片的相應屬性并“自殺”(自動(dòng)踢出內存);

                                                                                          第二步,進(jìn)入程序主循環(huán)。使用idDream來(lái)代表主循環(huán)timer 的id,并且每10毫秒刷新一次,這樣就進(jìn)入了內部子程序,里面也有自己的初始化、運行期、結束處理。

                                                                                          做光柱的算法我已經(jīng)優(yōu)化到這樣子:

                                                                                            tempx+= i*2*keynum/10;  //reverse set
                                                                                            keynum=tempx<250 ? 1 : -1;  //reverse key

                                                                                          狀態(tài)每2次換一次,分別獲得光柱當前劃線(xiàn)的左右位置,而且通過(guò)keynum變量方便的設置中點(diǎn),即250(隨意一個(gè)什么位置)。

                                                                                          結合

                                                                                            mc.moveTo(tempx,tempy);
                                                                                            mc.lineTo(tempx, tempy+offy);

                                                                                          即可畫(huà)出一個(gè)光柱的模型,稍加處理即可得到下面的樣子。(圖2)

                                                                                          而所謂的光射的環(huán)境效果,我們可以簡(jiǎn)單嘗試下面的算法:

                                                                                            var tempcolor=clr.getTransform();
                                                                                            tempcolor.rb+=i/200; //color to sun
                                                                                            tempcolor.gb+=i/150; //color to leaf
                                                                                            clr.setTransform(tempcolor);

                                                                                          算法以速度為先,不考慮太多的客觀(guān)因素,只按照程序當前的狀態(tài)往太陽(yáng)和綠色的生命感覺(jué)走(紅色和綠色的增量補償,rb要大于gb,否則沒(méi)有光感)

                                                                                          *就是結束條件:if(i>=700) clearInterval (idDream)。當程序運行了700/3次后,結束子程序,清除timer并返回主程序。

                                                                                          返回主程序后,無(wú)其他語(yǔ)句即保持靜止狀態(tài),除非用戶(hù)關(guān)閉窗口來(lái)結束程序。   可以測試一下效果,若覺(jué)得光感太強,可以調節rb和gb的值。(測試效果如圖2)

                                                                                        圖2

                                                                                          雖然setInterval不是系統級的,但這意味著(zhù)在不使用movieclip的情況下來(lái)得到速度的提高的方法是良性進(jìn)步,以后會(huì )有更多的程序使用timer而不用MovieClip,因為產(chǎn)生一個(gè)MovieClip的代價(jià)是繼承了所有MovieClip的方法和屬性,而Timer不過(guò)是一個(gè)Function或一個(gè)簡(jiǎn)單的Object,何樂(lè )而不為。

                                                                                          

                                                                                          惡習不改破壞性測試:

                                                                                          //pic.loadMovie("ice.jpg");

                                                                                          loadMovie("ice.jpg",-1);

                                                                                          將*條語(yǔ)句修改為第二條語(yǔ)句的樣子,看看會(huì )發(fā)生什么?不管是測試環(huán)境還是直接運行swf,都會(huì )打開(kāi)IE來(lái)讀入剛剛我們需要讀入的jpg,只要條件是負數……傻了眼,這回怎么去控制我要的jpg?

                                                                                        感謝DnVsystem
                                                                                        如果本頁(yè)不是您要找的課程,您也可以百度查找一下:

                                                                                        奇米在线7777在线精品|国产成人精品免费视|精品无码不卡一区二区三区|国内综合精品午夜久久资源|亚洲视频在线观看..