在FLASH里,MC的傾斜屬性可以通過手動的辦法來設定.在FLASH里,傾斜是實現3D效果的重要方面.
但是AS里頭就沒有傾斜屬性的代碼,盡管現在模擬3D的代碼已經有很多人做出來,但是目前一般都是局限在坐標點的模擬方面.對于物體,位圖的簡單3D效果,哪怕就一個傾斜,AS都還沒能做到.
為了解決這個問題(這問題,經典里一位用戶也曾問過),本人花了近一周的時間來研究:
廢話少說,還是轉入正題吧.
1一個簡單的試驗:
在FLASH里,畫一個矩形(不要轉成元件),然后把該矩形稍作旋轉.
接著把轉了的矩形在水平方向做一下縮放,你就看到矩行實際上是傾斜了.
因此,利用AS里的_XSCALE和_ROTATION屬性就可以讓MC動態地傾斜了.
2把該試驗應用到AS中
不妨寫個代碼試試看:
制作一個MC(越復雜可能效果會越明顯)
往MC里寫代碼:
onClipEvent(enterFrame){
_rotation=30;
_xscale=30;
}
測試一下,沒有傾斜效果,仔細看一下會發現在MC旋轉以后,縮放的坐標也跟著旋轉.
可惜啊!
難道就沒有辦法了嗎?答案是否定的!
既然MC旋轉以后,縮放坐標跟著旋轉,那么,我們就把旋轉了的MC再轉為MC,那么不就有兩個坐標系了嗎?不就可以達到小測試的效果嗎?
筆者也許比較笨,這個小問題也給卡住了3分鐘.
言歸正傳,我們繼續說吧.
把剛才的MC的代碼清空,命名為myMC,然后把他轉換為影片剪輯.
往轉換了的影片剪輯輸入代碼:
onClipEvent(load){
myMC._rotation=30
_xscale=30
}
再測試一下,傾斜效果出來了!
筆者以為這樣就可以大功告成,想自己動態設置MC傾斜30度,卻發現,上述的代碼雖然是傾斜了,但是傾斜并不是30度,上面兩個屬性跟傾斜屬性還存在著對筆者來說是比較復雜的數學關系.
筆者花了近一周的時間研究這種關系,盡管有點暈,但最終還是給弄出來了.
把上面的代碼替換為:
onClipEvent (load) {
function setSkewx(anglex) {
var angx = anglex%360;
var tx = 1/Math.tan(angx*(Math.PI/180));
var alfax = (Math.tan(angx*(Math.PI/180)) == 0) ? Math.PI/2 : (Math.asin((Math.sqrt(tx*tx+1)-1)/tx));
myMC._rotation = -45;
_xscale = 100*Math.sin(alfax);
myMC._xscale = 100/Math.sqrt(1/2*(Math.pow(Math.sin(alfax), 2)+1));
myMC._yscale = 100/Math.sqrt(1/2*(Math.pow(Math.sin(alfax), 2)+1));
_rotation = Math.atan(1/Math.sin(alfax))/(Math.PI/180);
if (Math.cos(angx*(Math.PI/180))<0) {
myMC._yscale *= -1;
}
}
function setSkew(anglex, angley) {
setSkewx(anglex-angley);
_rotation += angley;
}
}
onClipEvent (enterFrame) {
an = (an+1)%360;
setSkew(an,0)
}
就看到效果了.
從前面的簡單測試,到寫成這段代碼,可謂艱辛至極.但不管怎樣也好,代碼寫成了,也希望能讓大家從中學到一些東西.
至于從簡單的測試代碼到上面的代碼是怎么推出來的,里頭的語句意義何在,我將在這段時間給大家作出解釋.