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

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

                                                                                        歡迎您!
                                                                                        朋友圈

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

                                                                                        位置:培訓資訊 > 體驗Flash MX(4):用代碼繪圖

                                                                                        體驗Flash MX(4):用代碼繪圖

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

                                                                                          還記得Flash 4的時(shí)候Action只是協(xié)助Flash把動(dòng)畫(huà)做得更好,或增加一些普通的外部命令、簡(jiǎn)單的流程控制;到了Flash 5已經(jīng)可以作為一個(gè)較成熟的Script運行環(huán)境了,不過(guò)很多人還是當它為矢量的Photoshop來(lái)用;經(jīng)過(guò)了不算太長(cháng)的1年多,可愛(ài)的Flash MX終于出現了,她要告訴我們的是——你只需要鍵盤(pán)就足夠了。

                                                                                          從幾何圖形學(xué)來(lái)講,所有的圖形都可以用三角形表示,這個(gè)定理也適用于我們通常所看到的2D圖片和3D圖形。很多次,有人羨慕的說(shuō),阿,我要是可以用代碼完成你的作品該多好???Ok,我們給你Flash MX,只要你不嫌累并且打字快,你也可以做到。確實(shí),這是一個(gè)矛盾的時(shí)間效率話(huà)題,也許不同的人會(huì )有不同的解釋?zhuān)贿^(guò)作為Flash MX的教程,我可以主觀(guān)地先告訴你Flash MX可以做到怎樣的程度,然后我們再討論這個(gè)矛盾。

                                                                                          Flash MX的畫(huà)線(xiàn)功能更類(lèi)似于小的時(shí)候學(xué)習用的LOGO語(yǔ)言(就是那個(gè)小烏龜)。Macromedia公司把這些功能很好的嵌入了MovieClip對象中,并且每條語(yǔ)句都十分有用,如果善加利用,甚至可以用這些來(lái)寫(xiě)出3D的引擎,相信在未來(lái)的幾個(gè)月內會(huì )有這樣的東西出現。好了,先不管未來(lái),我們先看看她的繪畫(huà)流程:

                                                                                          設置起點(diǎn)-〉從這個(gè)起點(diǎn)繪制到其他的點(diǎn)線(xiàn)條,并設置那個(gè)點(diǎn)為新的起點(diǎn)-〉填充顏色。

                                                                                          這個(gè)流程也基本是所有類(lèi)似繪圖引擎的過(guò)程,我們先用幾行簡(jiǎn)單而且十分有用的代碼來(lái)形象的說(shuō)明這個(gè)流程(注意,今天不可以用手畫(huà),偷懶對自己可沒(méi)好處……這句話(huà)今天相反)

                                                                                          新建一個(gè)文件,在主場(chǎng)景*幀加入代碼:

                                                                                          createEmptyMovieClip("drawobj",1);//這條語(yǔ)句在*天已經(jīng)出現,就是要動(dòng)態(tài)建立一個(gè)MovieClip。
                                                                                          drawobj.onMouseDown=function(){this.lineto(_root._xmouse,_root._ymouse)};
                                                                                          drawobj.linestyle(.1, 0x111111, 100);

                                                                                          效果是不是很酷?三行代碼基本上跟Windows畫(huà)板差不多啦。我們主要是用了lineTo這個(gè)函數,它的主要功能是從當前起點(diǎn)繪制一條直線(xiàn)到目標點(diǎn),當然,你只要給目標點(diǎn)的x和y坐標即可;但你知道這個(gè)還不行,需要給你要畫(huà)的線(xiàn)條一種樣式,這就是linestyle,我們在這里畫(huà)的就是0.1厚度,灰黑色的,Alpha為100(不透明)的線(xiàn)。(圖1)

                                                                                        (圖1,……不是畫(huà)魔畫(huà)的L)

                                                                                          Ok,抓筆的人已經(jīng)松開(kāi)了吧。我們要在lineto的基礎上改進(jìn)一下,加入如下代碼:

                                                                                          createEmptyMovieClip("drawobj", 1);
                                                                                          Movieclip.prototype.makeBox = function(x, y, l) {
                                                                                           this.lineto(x, y+l);
                                                                                           this.lineto(x+l, y+l);
                                                                                           this.lineto(x+l, y);
                                                                                           this.lineto(x, y);
                                                                                          };  //init

                                                                                          with (drawobj) {
                                                                                           moveto(100,100);
                                                                                           beginfill(0x333333, 100);
                                                                                           linestyle(.1, 0x111111, 100);
                                                                                           makeBox(100,100,100);
                                                                                           endfill();
                                                                                          }

                                                                                          我們定義的makeBox如其名,就是畫(huà)正方形的,它在我們的初始化部分會(huì )用到,l參數是邊長(cháng)。當程序初始化的時(shí)候,我們對drawobj進(jìn)行操作,首先用moveto來(lái)改變它的位置,接著(zhù)我們會(huì )用到fill;它包括兩部分,一個(gè)是普通的beginfill,是設置填充的參數起點(diǎn),當我們用makeBox畫(huà)好了正方形后,必須要用到endfill才可以更新當前的fill,否則什么beginfill也沒(méi)什么意義(雖然我不加也照樣更新)。(圖2)

                                                                                        (圖2)

                                                                                          再接再厲,我們再結合另一個(gè)方法來(lái)看看程序作出來(lái)的圖形的魅力。加入代碼:

                                                                                          createEmptyMovieClip("drawobj", 1);
                                                                                          drawobj.linestyle(.1, 0x111111, 100);
                                                                                          for (var i=0; i<=50; i+=.1) {
                                                                                           with (drawobj) {
                                                                                            moveto(random(300),random(300));
                                                                                            beginfill(random(1048576),random(100));
                                                                                            curveto(i*random(10),i*random(10),i*random(10),i*random(10));
                                                                                            endfill();
                                                                                           }
                                                                                          }

                                                                                          這里我們先拋棄所謂的程序執行效率,用感性的大腦來(lái)寫(xiě)程序。憑空想象可能發(fā)生的事情,如果不知道的話(huà),就隨便寫(xiě)幾個(gè)random,然后動(dòng)態(tài)改變顏色和Alpha,*用curveto方法來(lái)畫(huà)曲線(xiàn)。值得注意的是curveto的后兩個(gè)參數x軸曲線(xiàn)偏移和y軸曲線(xiàn)偏移,不要做的太大,否則會(huì )更慢……,程序寫(xiě)完后執行一下,n秒鐘后出現了一幅圖畫(huà),看起來(lái)還有點(diǎn)味道(圖3)

                                                                                        (圖3,我不知道是什么,我想畢加索也不知道)

                                                                                          看來(lái),藝術(shù)的意義永遠無(wú)法解釋?zhuān)覀兊某绦蜻€得繼續往下寫(xiě)。上面說(shuō)的Fill方法的*種是普通的beginFill,只可以填充固定的顏色;而另一種就比較好用了,叫做beginGradientFill,用途是填充過(guò)渡色。還是先來(lái)動(dòng)手再說(shuō)是怎么回事,加代碼:

                                                                                          createEmptyMovieClip("drawobj", 1);
                                                                                          drawobj.linestyle(.1, 0x111111, 100);
                                                                                          for (var i=0; i<=100; i++) {
                                                                                           with (drawobj) {
                                                                                            cx=random(200);
                                                                                            cy=random(200);
                                                                                            makeBox(cx,cy,random(100));
                                                                                            drawWay=random(2) ===1 ? "linear" : "radial";
                                                                                            colorRange = [0x111111, 0xeeeeee];
                                                                                            alphaRange = [random(100), random(100)];
                                                                                            ra = [0, random(255)];
                                                                                            colorChart = {a:random(100), b:0, c:0, d:random(100), e:0, f:random(100), g:random(100), h:random(100), i:1};
                                                                                            beginGradientFill(drawway, colorRange, alphaRange, ra, colorChart);
                                                                                           }
                                                                                          }

                                                                                          這里我們分別使用begineGradientFill的兩種填充方式:linear線(xiàn)性填充和radial環(huán)行填充來(lái)演示了一些正方形組合在一起的樣子。這種填充方式需要的數據比較多,而且都為數組形式,其格式是*的:beginGradientFill(方式,顏色范圍,Alpha范圍,過(guò)渡范圍,過(guò)渡參數),缺一不可;但是過(guò)渡參數的形勢可以有兩種,一種是以3*3矩陣表示,內容為[a,b,c,d,e,f,g,h,i],分別表示填充的寬,x軸起點(diǎn),y軸起點(diǎn),明度,x軸偏移色,y軸偏移色,高,填充角度等填充參數;而另一種比較直觀(guān),是以[x軸起點(diǎn);y軸起點(diǎn);寬;高;填充角度]組成的數組,我比較喜歡這種方式,方便而且速度快一些。我們隨機的放入一些數據來(lái)看看能形成什么樣子,不過(guò)在這個(gè)過(guò)程中,我意外的發(fā)現如果我們先用makeBox,再做Fill,那么將不會(huì )用到endfill()來(lái)結束填充(這個(gè)endfill總感覺(jué)沒(méi)什么用途,或者說(shuō)沒(méi)有它應該有的功能)。運行一下,又經(jīng)過(guò)幾十秒后,一幅很酷的類(lèi)似某有名設計師的畫(huà)面出現了……(圖4)

                                                                                        (圖4,真的眼熟……)

                                                                                          *,如果你不喜歡這個(gè)樣子,你可以用drawobj.clear()來(lái)清空你畫(huà)的這些……

                                                                                          程序化的Mask蒙版

                                                                                          Flash MX現在已經(jīng)可以在程序中直接定義兩個(gè)Mask的主從關(guān)系,讓我們從一個(gè)例子來(lái)看看:(代碼)

                                                                                          Movieclip.prototype.makeBox = function(x, y, l) {
                                                                                           this.lineto(x, y+l);
                                                                                           this.lineto(x+l, y+l);
                                                                                           this.lineto(x+l, y);
                                                                                           this.lineto(x, y);
                                                                                          };

                                                                                          createEmptyMovieClip("drager",2);
                                                                                          drager.linestyle(.1, 0x111111, 100);
                                                                                          drager.beginfill(0x333333, 100);
                                                                                          drager.makeBox(0,0,30);
                                                                                          drager.endfill();
                                                                                          createEmptyMovieClip("jpgObj",1);
                                                                                          createEmptyMovieClip("loader",3);
                                                                                          loader.onenterframe=function(){
                                                                                           if(_root.jpgObj._width<>0){
                                                                                            _root.jpgObj.setMask
                                                                                            (_root.drager);removeMovieclip(this)
                                                                                           }
                                                                                          };
                                                                                          jpgObj.loadMovie("boy.jpg");
                                                                                          drager.startDrag(true);

                                                                                          這個(gè)例子我們結合這幾天所學(xué)的一些東西,而且還用到了那個(gè)小男孩。程序開(kāi)始的時(shí)候會(huì )畫(huà)出一個(gè)灰色的正方形,當然作為Mask的MovieClip顏色是無(wú)所謂的,接著(zhù)我們再創(chuàng )建一個(gè)MovieClip,作為被Mask的對象,當然到這里理論上我們可以直接用命令來(lái)控制Mask,但是,我們要考慮圖片是否被讀取的這個(gè)因素。而且,還是理論上我們可以用ondata這個(gè)事件來(lái)獲取,但是F6播放器做的好象有問(wèn)題……MovieClip的ondata被錯誤的傳遞給了_root,而且還不是正確的時(shí)候傳遞的。那我們沒(méi)辦法,只好再增加一個(gè)loader MovieClip作為判斷是否讀取得條件,當然,滿(mǎn)足后需要自己釋放自己所占有的內存,并且用setMask來(lái)遮蓋我們所讀取的圖片;*,把方塊綁在鼠標上就完成了,整個(gè)流程看似基本上不會(huì )發(fā)生什么錯誤了……(圖5)

                                                                                        (圖5)

                                                                                          源文件:

                                                                                          注:

                                                                                          FlashMX的程序雖然基本上都可以寫(xiě)入*幀,但是如果考慮時(shí)間效率的話(huà),還是分批處理為妙,例如把初始化和最常用的Action先處理,其他的可以放入.as或者別的幀。

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

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