用AS控制MC的傾斜屬性的代碼
更新時(shí)間:2007年03月22日 00:00:00 作者:
在FLASH里,MC的傾斜屬性可以通過手動(dòng)的辦法來設(shè)定.在FLASH里,傾斜是實(shí)現(xiàn)3D效果的重要方面.
但是AS里頭就沒有傾斜屬性的代碼,盡管現(xiàn)在模擬3D的代碼已經(jīng)有很多人做出來,但是目前一般都是局限在坐標(biāo)點(diǎn)的模擬方面.對(duì)于物體,位圖的簡單3D效果,哪怕就一個(gè)傾斜,AS都還沒能做到.
為了解決這個(gè)問題(這問題,經(jīng)典里一位用戶也曾問過),本人花了近一周的時(shí)間來研究:
廢話少說,還是轉(zhuǎn)入正題吧.
1一個(gè)簡單的試驗(yàn):
在FLASH里,畫一個(gè)矩形(不要轉(zhuǎn)成元件),然后把該矩形稍作旋轉(zhuǎn).
接著把轉(zhuǎn)了的矩形在水平方向做一下縮放,你就看到矩行實(shí)際上是傾斜了.
因此,利用AS里的_XSCALE和_ROTATION屬性就可以讓MC動(dòng)態(tài)地傾斜了.
2把該試驗(yàn)應(yīng)用到AS中
不妨寫個(gè)代碼試試看:
制作一個(gè)MC(越復(fù)雜可能效果會(huì)越明顯)
往MC里寫代碼:
onClipEvent(enterFrame){
_rotation=30;
_xscale=30;
}
測試一下,沒有傾斜效果,仔細(xì)看一下會(huì)發(fā)現(xiàn)在MC旋轉(zhuǎn)以后,縮放的坐標(biāo)也跟著旋轉(zhuǎn).
可惜啊!
難道就沒有辦法了嗎?答案是否定的!
既然MC旋轉(zhuǎn)以后,縮放坐標(biāo)跟著旋轉(zhuǎn),那么,我們就把旋轉(zhuǎn)了的MC再轉(zhuǎn)為MC,那么不就有兩個(gè)坐標(biāo)系了嗎?不就可以達(dá)到小測試的效果嗎?
筆者也許比較笨,這個(gè)小問題也給卡住了3分鐘.
言歸正傳,我們繼續(xù)說吧.
把剛才的MC的代碼清空,命名為myMC,然后把他轉(zhuǎn)換為影片剪輯.
往轉(zhuǎn)換了的影片剪輯輸入代碼:
onClipEvent(load){
myMC._rotation=30
_xscale=30
}
再測試一下,傾斜效果出來了!
筆者以為這樣就可以大功告成,想自己動(dòng)態(tài)設(shè)置MC傾斜30度,卻發(fā)現(xiàn),上述的代碼雖然是傾斜了,但是傾斜并不是30度,上面兩個(gè)屬性跟傾斜屬性還存在著對(duì)筆者來說是比較復(fù)雜的數(shù)學(xué)關(guān)系.
筆者花了近一周的時(shí)間研究這種關(guān)系,盡管有點(diǎn)暈,但最終還是給弄出來了.
把上面的代碼替換為:
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)
}
就看到效果了.
從前面的簡單測試,到寫成這段代碼,可謂艱辛至極.但不管怎樣也好,代碼寫成了,也希望能讓大家從中學(xué)到一些東西.
至于從簡單的測試代碼到上面的代碼是怎么推出來的,里頭的語句意義何在,我將在這段時(shí)間給大家作出解釋.
但是AS里頭就沒有傾斜屬性的代碼,盡管現(xiàn)在模擬3D的代碼已經(jīng)有很多人做出來,但是目前一般都是局限在坐標(biāo)點(diǎn)的模擬方面.對(duì)于物體,位圖的簡單3D效果,哪怕就一個(gè)傾斜,AS都還沒能做到.
為了解決這個(gè)問題(這問題,經(jīng)典里一位用戶也曾問過),本人花了近一周的時(shí)間來研究:
廢話少說,還是轉(zhuǎn)入正題吧.
1一個(gè)簡單的試驗(yàn):
在FLASH里,畫一個(gè)矩形(不要轉(zhuǎn)成元件),然后把該矩形稍作旋轉(zhuǎn).
接著把轉(zhuǎn)了的矩形在水平方向做一下縮放,你就看到矩行實(shí)際上是傾斜了.
因此,利用AS里的_XSCALE和_ROTATION屬性就可以讓MC動(dòng)態(tài)地傾斜了.
2把該試驗(yàn)應(yīng)用到AS中
不妨寫個(gè)代碼試試看:
制作一個(gè)MC(越復(fù)雜可能效果會(huì)越明顯)
往MC里寫代碼:
onClipEvent(enterFrame){
_rotation=30;
_xscale=30;
}
測試一下,沒有傾斜效果,仔細(xì)看一下會(huì)發(fā)現(xiàn)在MC旋轉(zhuǎn)以后,縮放的坐標(biāo)也跟著旋轉(zhuǎn).
可惜啊!
難道就沒有辦法了嗎?答案是否定的!
既然MC旋轉(zhuǎn)以后,縮放坐標(biāo)跟著旋轉(zhuǎn),那么,我們就把旋轉(zhuǎn)了的MC再轉(zhuǎn)為MC,那么不就有兩個(gè)坐標(biāo)系了嗎?不就可以達(dá)到小測試的效果嗎?
筆者也許比較笨,這個(gè)小問題也給卡住了3分鐘.
言歸正傳,我們繼續(xù)說吧.
把剛才的MC的代碼清空,命名為myMC,然后把他轉(zhuǎn)換為影片剪輯.
往轉(zhuǎn)換了的影片剪輯輸入代碼:
onClipEvent(load){
myMC._rotation=30
_xscale=30
}
再測試一下,傾斜效果出來了!
筆者以為這樣就可以大功告成,想自己動(dòng)態(tài)設(shè)置MC傾斜30度,卻發(fā)現(xiàn),上述的代碼雖然是傾斜了,但是傾斜并不是30度,上面兩個(gè)屬性跟傾斜屬性還存在著對(duì)筆者來說是比較復(fù)雜的數(shù)學(xué)關(guān)系.
筆者花了近一周的時(shí)間研究這種關(guān)系,盡管有點(diǎn)暈,但最終還是給弄出來了.
把上面的代碼替換為:
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)
}
就看到效果了.
從前面的簡單測試,到寫成這段代碼,可謂艱辛至極.但不管怎樣也好,代碼寫成了,也希望能讓大家從中學(xué)到一些東西.
至于從簡單的測試代碼到上面的代碼是怎么推出來的,里頭的語句意義何在,我將在這段時(shí)間給大家作出解釋.
相關(guān)文章
AS3.0 實(shí)例學(xué)習(xí) 熟悉tween以及tweenEvent的運(yùn)用
AS3.0 實(shí)例學(xué)習(xí) 熟悉tween以及tweenEvent的運(yùn)用...2007-12-12