摘要:在Flash教學中逐個顯示大段文字的特效在動畫作品制作中已經得到大量普遍應用。由于Flash中逐個顯示大段文字的特效制作涉及到腳本代碼的熟練使用,有一定的難度,對于中職學校學生而言也是一大挑戰。下面通過程序控制的方法來探析這個問題,進而從中發現其中的共同點和規律,從而達到事半功倍的效果。
關鍵詞:中職;Flash教學;程序控制Flash中所謂逐個顯示大段文字就是一個字一個字顯示出來,像電腦打出來那種效果。下面通過典型案例來加以詳細分析,進而從中發現制作此類特效的共同點和規律。
一、案例1
制作任務:情人節賀卡之文字逐個顯示特效制作。
制作要求:逐字顯示“又是一個沒有情人的情人節,像這樣的節日你還要我度過幾個?或許時間真的是檢驗愛情的唯一的標準,但是你知道愛情也是有好多種的。在這沒有結束的等待中我害怕我的感情變老,除了我的愛,這世界上有太多的不確定,這其中包括你,還沒有確定的你的愛。我只想問你一句:愛不愛我?”
制作步驟:
(1)啟動Flash,建立“文字”圖層;
(2)在“文字”圖層的舞臺上利用文本工具插入一個動態文本,命名為“love”,設置為多行顯示,靠左對齊,至于動態文本的大小位置以及顯示文字的屬性可在之后根據需要進行調整。
(3)在“文字”圖層上面新建一圖層,命名為“控制代碼”,在第1空白關鍵幀輸入腳本:
x = 0;
wenben = \" 這里放置需要輸出的大段文字,就是上面那段話\";
“x”是一個變量,初始化為0,用來統計當前需要輸出的字數,“wenben” 是一個字符型變量,用來放置需要逐字輸出的大段文字。
(4)在“控制代碼”圖層第2幀處插入空白關鍵幀,輸入腳本:
if (x <= mblength(wenben)) {
x++;
love.text = mbsubstring(wenben, 1, x);
} else {
gotoAndStop(5);
}
以上控制腳本代碼的控制思路:首先采用條件判斷語句IF判斷當前顯示的位置是不是已經到了文本段的末尾,換句話說有沒有顯示完大段文字,如果沒有的話就繼續在動態文本框上顯示,讓當前變量“x”累加,向后移動一個位置,指向下一個文字;如果顯示完畢,就直接執行跳轉語句“gotoAndStop(5)”轉到第5幀執行“stop()”,結束顯示。
(5)在“控制代碼”圖層第3幀處插入普通幀,目的是減緩文字顯示的速度,能夠更加清晰地看到逐字顯示的效果。
(6)在“控制代碼”圖層第4幀處插入空白關鍵幀,輸入腳本“gotoAndPlay(2);”,目的是回到第2關鍵幀繼續條件判斷,是繼續顯示還是結束顯示。
(7)在“控制代碼”圖層第5幀處插入空白關鍵幀,輸入腳本“stop();”,結束顯示。
最終的圖層以及時間線如下:
(8)最后,保存,Ctrl+回車測試。
以上“算法”是解決此類問題的一種行之有效的方法,這是筆者在實踐當中總結出來的,簡單實用,容易理解。但是“算法”是什么,算法就是解決問題的方法,方法可以不是唯一的。上述任務的完成,主要核心是采用腳本來控制,利用條件判斷語句來進行判斷,這就是解決此問題的關鍵和規律,因此,只要抓住問題的規律可以有多種方法,譬如:
第一步,使用文本工具在舞臺把你要逐個顯示的文字輸入后,屬性改為動態文本,并設置動態文本的變量為“mytext”。
第二步,在第2幀處插入關鍵幀,并設置第2幀中動態文本的變量為“newtext”,在第4幀處插入幀。
第三步,新建圖層“控制代碼”,在“控制代碼”層第1幀中加入腳本:
n=1;
在“控制代碼”層第2幀插入關鍵幀,加入腳本:
n++;
newtext = mytext.substr(0,n)
if (n>mytext.length) {
stop();
}
在“腳本”層的第4幀插入關鍵幀,輸入腳本:
gotoAndPlay(2);
最后,保存,Ctrl+回車測試。
雖然這兩種方法在步驟和具體實現方面有些不同,但是其核心和規律是不變的,都是采用腳本來控制,都是采用條件判斷語句來判斷控制。
二、案例2
制作任務:心靈雞湯之文字逐個顯示特效制作。
制作要求:逐字顯示“有些事不是我過于執著,而是懂得了放棄,你應該明白,是我不想讓你過的太累太苦,你遠比我要承擔的更多,甚而疲于奔波。正如你說的:愛情是兩個人的事,婚姻則是兩個家庭的事。生命無常,聚散不定,相隔雖然不遙遠,可這一段路以及路上的荊棘足以摧毀行走的方向,我們看不到路邊那如詩如畫的風景,反而走的筋疲力盡,心力交瘁。哪怕我十二分的情愿和努力,最終換來的還是支離破碎。”
要很好的完成此特效,采用以上方法完全可以解決,之所以還要再次提出此類似問題,是想采用另外的“方法”來制作,讓大家體味到Flash動畫制作的靈活性和趣味性,適合不同人群的制作思路,所謂“世上的路有千萬條,我只選最近的那條路”就是這個道理。
制作步驟:
為了保持動畫制作步驟的完整性,所以還是把詳細的制作過程詳述如下:
(1)啟動Flash,建立“文字”圖層;
(2)在“文字”圖層的舞臺上利用文本工具插入一個動態文本,命名為“mytext”,設置為多行顯示,靠左對齊,至于動態文本的大小位置以及顯示文字的屬性可在之后根據需要多次調整。
(3)在“文字”圖層上面新建一圖層,命名為“控制代碼”,在第1空白關鍵幀輸入腳本:
n=0;
text=\" 這里放置需要輸出的大段文字,就是上面那段話\";
(4)在“控制代碼”圖層第2幀處插入空白關鍵幀,輸入腳本:
n++;
mytext.text=mytext.text+text.substr(n,1);
if (n>text.length) {
stop();
}
以上代碼的功能跟前面的相似,只是具體的執行過程有些差別,不過同樣可以實現大段文字的逐字顯示效果。
(5)在“控制代碼”圖層第3幀處插入空白關鍵幀,輸入腳本“gotoAndPlay(2);”,目的是回到第2關鍵幀繼續條件判斷。
最終的圖層以及時間線如下:
(6)最后,同樣的,保存,Ctrl+回車測試。
三、Flash中逐字顯示大段文字之進階:打印機打字效果特效的制作新建flash文檔,記住建AS3.0文檔。然后,導入一個打字聲音素材(只有一聲的那種)到庫中,在庫中右擊聲音元件,點“連接”(flash8,cs3)或“屬性”(flash cs4),在“為ActionScript導出”前打鉤,在“類”文本框中輸入一個類名稱,我的名稱是:dzj,“確定”后會彈出一個對話框,再“確定”。
下面打開幀動作面板寫代碼。
首先聲明一個字符串對象,將要打出的文字包含進去:
var mystr:String = \"生命無常,聚散不定,相隔雖然不遙遠,可這一段路以及路上的荊棘足以摧毀行走的方向,我們看不到路邊那如詩如畫的風景,反而走的筋疲力盡,心力交瘁。哪怕我十二分的情愿和努力,最終換來得還是支離破碎。\";
然后,聲明一個變量,存儲字符串的字符數,備用:
var strcd:Number = mystr.length;
接下來創建文本框,設置寬度,位置和縮放:
var mytextbox:TextField = new TextField();
mytextbox.width = 300;
mytextbox.x=120;
mytextbox.y=100;
mytextbox.wordWrap = true;
創建一個文本格式對象,設置文本的格式:
var strformat:TextFormat = new TextFormat();
strformat.bold = true;
strformat.color = 0xffff00;
strformat.size = 20;
將文本添加到顯示列表:
addChild(mytextbox);
下面創建一個函數,將字符串內容添加到文本上,并調用打字聲音,因為筆者后面會用Timer類實例來調用函數,用 event:TimerEvent,字符串的charAt(i)方法可以提取字符串中的第i個字符。文本框在有了內容后調用 setTextFormat()方法才會有作用,所以在這里才用它。
var i =0;
function xs(event:TimerEvent):void{
mytextbox.appendText(mystr.charAt(i));
i++;
mytextbox.setTextFormat(strformat);
新建一個dzj類,即我們導入的聲音,它將繼承Sound類的屬性和方法。所以用play()播放它,這樣每加一個字符就會出現一聲打字聲。
var sy:dzj = new dzj();
sy.play();
}
下面創建Timer類,設置每300毫秒調用一次xs函數,為文本添加一個字符,一共調用字符串的個數那么多次:
var jg:Timer = new Timer(300,strcd);
jg.addEventListener(TimerEvent.TIMER,xs);
jg.start();
測試影片,效果出來了。
通過以上典型案例的剖析,我們可以得到完美解決此類問題的方法,總結出這些方法的共同點,舉一反三,靈活應用,從中發現解決問題的規律:
(1)都是通過腳本代碼的方式來求解問題,所以對Flash中常用的腳本語言要有基本的掌握,特別是各種類型變量的定義以及初始化、條件判斷語句IF的掌握及其靈活應用、函數(類)的自定義以及調用等等。
(2)制作過程不外乎有以下基本步驟:
1)在單獨圖層上定義動態文本,進行命名和設置其基本屬性。
2)在另一圖層上進行腳本代碼的輸入及其調試,其基本思路是:首先進行控制變量的初始化,一般是0或者1;其次是在不同的幀上輸入核心控制代碼(主要是IF語句)進行條件判斷,是繼續進行文字顯示還是結束顯示;最后在其它幀上輸入跳轉語句或停止語句。
3)都是通過動態文本的方式輸出大段文字的,因此對于動態文本的基本屬性的設置要有熟練的掌握。
4)因為腳本語句當中包含一些基本函數,因此對于字符串截取函數substr()的使用和掌握必須熟悉。
只要真正掌握了解決此類問題的共同點和規律,不管怎樣變化,萬變不離其宗,他山之石,可以攻玉,應用規律去解決問題,可以達到舉一反三得心應手的效果,能更好地促進中職學校動漫設計與制作專業課程的教學,從而讓學生輕松制作出更加激動人心的動畫作品。
(作者單位:韶關市中等職業技術學校)
參考文獻:
[1]孫穎.Flash ActionScript3殿堂之路[M].北京:電子工業出版社,2007.
[2]陳宗斌.Adobe Flash CS4中文版經典教程[M].北京:人民郵電出版社,2009.
[3]劉歡.Flash ActionScript 3.0全站互動設計[M].北京:人民郵電出版社,2012.
責任編輯賴俊辰