一、畫正玄圖象,由外部輸入控制起點橫坐標、震幅和跨度。
源文件下載
點擊查看動畫效果<
思路:我們可以在作業(yè)源程序中發(fā)現(xiàn):
.......
moveTo(100, 200); //正玄線的起點坐標為(100,200)可以把橫坐標用一個變量(a)來表示
........
y = 200-100*Math.sin(i*Math.PI/180);//其中100決定震幅大小,我們可以用變量(b)來表示;橫坐標1個象數(shù),對應(yīng)表示1度的角度,在一個周期360度的條件下,如果橫坐標1個象數(shù)對應(yīng)幾度,那么跨度顯然會減小,就是說sin(i*Math.PI/180)中i的系數(shù)決定跨度的大小,經(jīng)過反復(fù)測試這個系數(shù)為360/c比較合理。因此,原來程序中的這兩條可以改為:
moveTo(a, 200);
y = 200-b*Math.sin(360/c*i*Math.PI/180)
為了能夠重復(fù)使用這個畫圖程序,顯然我們應(yīng)該用自定義函數(shù),上面的三個變量就可以做為參數(shù)。
打開源程序3.7.1.fla文件,這里只記與作業(yè)不同的地方:
第1幀上:
a = b=c=""; //對輸入文本變量賦初值
function huaxian(a, b, c) { //自定義函數(shù),函數(shù)名為huaxian,參數(shù)為三個文本變量
............
y = 200-b*Math.sin(360/c*i*Math.PI/180);//b決定震幅,c決定跨度
.....
if (i>c) { //超過360度時(由360/c*i>360計算得到i>c)
delete onEnterFrame; //刪除事件
}
};
}
huaxian(100, 100, 360); //先畫一個正玄圖象
按扭上的腳本:
on (release) {
if (c<36) {
web = "請輸入36以上的整數(shù)"; //跨度太小,圖象誤差太大
} else {
web=""
_root.huaxian(Number(a), Number(b), Number(c));//調(diào)自定義函數(shù),并且把其中參數(shù)轉(zhuǎn)化為數(shù)值
}
}
二、把文字和下面的mc的位置都分別作任意的排列
點擊查看動畫效果<
思路:考慮mc位置的亂排,這些mc的縱坐標都相同,因此,我們主要考慮亂排橫坐標。我們把這些mc的6個橫坐標放入一個數(shù)組,用上一節(jié)講的辦法,很容易實現(xiàn)亂排的效果。
打開3.7.1.fla文件
在第1幀上的腳本為:
stop();
i = 0;
w_arry = [30, 110, 190, 270, 350, 430]; //把文本的橫坐標作為一個數(shù)組
for (t=1; t<7; t++) {
m = Math.floor(Math.random()*w_arry.length);//從數(shù)組中任意選出一個編號
this["wz"+t]._x = w_arry[m]; //把數(shù)組中這個編號的元數(shù)作為這個文本的橫坐標
w_arry.splice(m, 1); //從這個數(shù)組中刪去這個元數(shù);
this["wz"+t]._y = 30; //設(shè)置這個文本的縱坐標
}
tx_arry = [76, 156, 236, 316, 396, 476]; //與上面類同;
for (s=1; s<7; s++) {
m = Math.floor(Math.random()*tx_arry.length);
this["tx"+s+"_mc"]._x = tx_arry[m];
tx_arry.splice(m, 1);
this["tx"+i+"_mc"]._y = 320;
}
function stlx(md, mc) { //設(shè)置自定義函數(shù)
md.x = md._x; //影片剪輯的坐標用這個影片剪輯下的變量x,y來保存
md.y = md._y;
md.onPress = function() { //鼠標在md上按下時;
startDrag(this, true); //拖動這個md;
};
md.onRelease = function() { //鼠標在md上松開時;
stopDrag(); //停止拖動;
if (md.hitTest(mc)) { //如果md和mc交叉或者重疊;
if (md.k != 1) { //又如果md下的變量k不等于1的話;
i++; //變量i加1;
md.k = 1; //使md下的變量k=1;
}
if (i == 6) { //如果i等于6;
nextFrame();//到下一幀停下;
}
} else { //如果md和nc不重疊或者相交;
md._x = md.x; //把md原來的坐標賦給md(回到原來的位置)
md._y = md.y;
}
};
}
for (j=1; j<7; j++) { //相當于在6個mc上調(diào)自定義函數(shù)
stlx(this["tx"+j+"_mc"], this["wz"+j]);
}
/* 例如,j=1,那么就是:
stlx(this.tx1_mc,this.wz1)
*/
三、這四個元件開始順序播放時,一個結(jié)束到另外一個開始的時間 間隔就能等于輸入 的時間 ?隨機播放的時候 一個結(jié)束到另一個播放的時間 的間隔也等于輸入 的時間
點擊查看動畫效果<
思路:
方法1 可以在4個元件的最后一幀上加腳本,使另外的元件隔一定時間開始播放;
方法2 可以使用(幀頻)事件處理函數(shù)來監(jiān)測,如果影片的當前幀等于總幀數(shù),那么這個影片播放完畢,讓其它影片開始播放。用方法2比較簡單。
打開 3.7.3fla文件:
在第1幀上的腳本為:
yp_array = [aa, bb, cc, dd]; //把4個mc作為數(shù)組yp_array的元素;
time = "";
i = 0;
function du() { //自定義函數(shù)du
yp_array[i].play(); //播放數(shù)組yp_array中第i個mc
yp_array[i].onEnterFrame = function() { //對這個mc使用事件處理函數(shù)
if (this._currentframe == this._totalframes) { //如果這個mc的當前幀等于總幀數(shù);
sj = setInterval(du, time*1000); //間隔time*1000毫秒調(diào)這個自定義函數(shù)du;
delete this.onEnterFrame; //刪除事件;
}
};
clearInterval(sj); //清除時間間隔函數(shù)
i++;
}
function duing() {
k = Math.floor(Math.random()*yp_array.length);
//根據(jù)數(shù)組yp_array的長度,選擇一個隨機數(shù)k;
yp_array[k].play(); //數(shù)組yp_array中的第k個mc播放
yp_array[k].onEnterFrame = function() { //對這個mc使用事件處理函數(shù)
if (this._currentframe == this._totalframes) { //如果這個mc的當前幀等于總幀數(shù);
sjing = setInterval(duing, time*1000);
//間隔time*1000毫秒調(diào)這個自定義函數(shù)duing;
delete this.onEnterFrame; //刪除事件;
}
};
yp_array.splice(k, 1); //從數(shù)組yp_array中刪除第k個元數(shù)
clearInterval(sjing); //清除時間間隔函數(shù)
}
在按扭“順序播放”上的腳本:
on (release) {
yp_array = [aa, bb, cc, dd];//重新給數(shù)組yp_array賦值
clearInterval(sjing);
//刪除隨機播放時的時間間隔函數(shù);這兩句是防止先按“隨機播放”后出錯。
i = 0; //重新給變量賦值。
if (time != "") {
du(); //調(diào)函數(shù)du
}
}
在按扭“隨機播放”上的腳本:
on (release) { //與“順序播放”按扭上的腳本類似
yp_array = [aa, bb, cc, dd];
clearInterval(sj);
i = 0;
if (time != "") {
duing();
}
}
查看全套"Flash AS 高級教程"