關(guān)于定點移動的解決方案分析2007-10-20 14:13:25 / 個人分類:vim專欄 最近由于忙于工作,很少上來發(fā)表文章了。不過經(jīng)驗還是要和大家一起分享的。也希望大家能通過看了我寫的文章能夠得到收獲,這才是我寫這些文章的目的。好了,廢話就留在日后再說。我今天我要講的是一個定點移動的問題,為什么要說這個呢?其實沒別的原因,因為有個同學(xué)前幾天問過我這個問題,他說不太理解所以我也拿出來跟大家一起討論和分析。所謂定點移動是指某個物體移動到指定的地點這樣一個常規(guī)的動作??此坪唵蔚膯栴}但他所涉及的因素還是比較多的(如:總路程、速度、路面光滑程度以及物體內(nèi)在性質(zhì)等等)。由于我們是用Flash來實現(xiàn)這種定點移動,在這可視的動畫制作工具面前我們就不用考慮那么多了,今天我主要是說說利用鼠標(biāo)指定地點后影片就從原點移動到指定點這樣的一個動畫實例。這個實例主要是以AS腳本來實現(xiàn),雖然是比較簡單,但我會以三種不同的實現(xiàn)方法來實現(xiàn),這三種方法分別是:累積路徑法、剩余路徑法和移動次數(shù)法(這些名字是自己給他取的)。為了節(jié)省事件和降低難度,我這里主要是實現(xiàn)水平方向的定點移動,并且是勻速運動。在講各種方法之前我先講一下此實例的組成結(jié)構(gòu)。結(jié)構(gòu)非常簡單,整個主場景就只有一個名字為obj的影片剪輯對象,當(dāng)然剩下的工作就是要寫腳本來實現(xiàn)。一、累積路徑法:顧名思義,就是物體每次移動的距離我們把他累積起來,然后通過對比總路徑長度來判斷是否已經(jīng)到達目的地的方法。我們先來看看實現(xiàn)的腳本:var mouseListener:Object=new Object();var totalLength:Number=0;var pileLength:Number=0;var speed:Number=5; //勻速運動,此是定值。mouseListener.onMouseDown=function(){ _root.totalLength=obj._x-_root._xmouse; _root.onEnterFrame=function(){ if(_root.pileLength+_root.speed<=math.abs(_root.totallength)){>=math.abs(_root.totallength)){><0){ obj._x+="_root.speed;" }else{="" obj._x-="_root.speed;" }="" _root.pilelength+="_root.speed;" }else{="">0){><0){ obj._x+="Math.abs(_root.totalLength)-_root.pileLength;" }else{="" obj._x-="Math.abs(_root.totalLength)-_root.pileLength;" }="" _root.pilelength="0;" _root.totallength="0;" delete="" _root.onenterframe;="" }="" }}mouse.addlistener(mouselistener);="">0){>=_root.speed){ if(_root.totalLength<0){ obj._x+="_root.speed;" _root.totallength+="_root.speed;" }else{="" obj._x-="_root.speed;" _root.totallength-="_root.speed;" }="" }else{="">0){><0){ obj._x+="_root.totalLength;" }else{="" obj._x-="_root.totalLength;" }="" _root.totallength="0;" delete="" _root.onenterframe;="" }="" }}mouse.addlistener(mouselistener);="" 整段代碼下來我們可以清楚地看到obj對象每走一個步長,總路徑長度都在減少,但由于方向的不同這里做了不同的處理。直到總路徑長度為0后我們就結(jié)束onenterframe事件。="" 三、移動次數(shù)法:前兩個方法都是利用路徑的長度來進行判斷的,而這個方法就像我們出去旅行,計算到達目的地要多長時間一樣,把總路徑長度按照移動的步長計算出總共要用移動多少次,然后按照移動次數(shù)來控制影片的運動。先來看看源代碼吧。var="" mouselistener:object="new" object();var="" totallength:number="0;var" speed:number="3;var" count:number="0;var" spare:number="0;var" position:number="0;mouseListener.onMouseDown" =="" function()="" {="" _root.totallength="people._x-_root._xmouse;" _root.count="Math.abs(Math.floor(_root.totalLength/_root.speed));" _root.spare="_root.totalLength%_root.speed;" _root.onenterframe="function()" {="" if="" (_root.count="" !="0)" {="" 判斷方向="" if="" (_root.totallength="">0) { obj._x += _root.speed; } else { obj._x -= _root.speed; } _root.count--; } else { if(_root.totalLength<0){ obj._x -= _root.spare;}else{ obj._x+=_root.spare;} _root.spare = 0; _root.totallength = 0; delete _root.onenterframe; } };};mouse.addlistener(mouselistener); 以上代碼就是一個按次數(shù)移動的方法。其中的_root.spare = _root.totallength%_root.speed;可能會不理解,其實這是求取不足一次移動的距離,也是剩余的距離不夠作為一次移動步長了,最后只要加上這段距離就能到達目的地了。 那么,今天就講到這里吧,如果哪為高手還什么更好的解決方法不妨拿出來共享一下,讓大家學(xué)習(xí)學(xué)習(xí)。不懂的朋友或者認為我上面的代碼有誤的朋友(上面的代碼都沒有在flash中運行過,只是憑空寫出來的)可以聯(lián)系我跟我討論,本人先在此謝謝大家了。希望在時間充裕的時候和大家探討更深入的問題。 obj._x="" -="_root.spare;}else{" obj._x+="_root.spare;}" _root.spare="0;" _root.totallength="0;" delete="" _root.onenterframe;="" }="" };};mouse.addlistener(mouselistener);="" 以上代碼就是一個按次數(shù)移動的方法。其中的_root.spare="_root.totalLength%_root.speed;可能會不理解,其實這是求取不足一次移動的距離,也是剩余的距離不夠作為一次移動步長了,最后只要加上這段距離就能到達目的地了。">0){ obj._x -=_root.spare;}else{ obj._x+=_root.spare;} _root.spare=0; _root.totallength=0; delete _root.onenterframe; } };};mouse.addlistener(mouselistener); 以上代碼就是一個按次數(shù)移動的方法。其中的_root.spare=_root.totallength%_root.speed;可能會不理解,其實這是求取不足一次移動的距離,也是剩余的距離不夠作為一次移動步長了,最后只要加上這段距離就能到達目的地了。 那么,今天就講到這里吧,如果哪為高手還什么更好的解決方法不妨拿出來共享一下,讓大家學(xué)習(xí)學(xué)習(xí)。不懂的朋友或者認為我上面的代碼有誤的朋友(上面的代碼都沒有在flash中運行過,只是憑空寫出來的)可以聯(lián)系我跟我討論,本人先在此謝謝大家了。希望在時間充裕的時候和大家探討更深入的問題。>0){>
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。