Giáo trình Thiết kế đa phương tiện (Flash) - Phần 2
Nếu bạn đã quen sử dụng JavaScript rồi thì bạn sẽ rất vui khi biết rằng JavaScript
có thể liên lạc được với ActionScript. Tuy nhiên, cách này không hoạt động tốt đối với
tất cả các loại trình duyệt.
Việc liên lạc này được xây dựng trên 2 công nghệ. Một là công nghệ
LiveConnect được xây dựng trong những phiên bản trình duyệt Netscape trước phiên
bản 6.0. Công nghệ thứ hai là ActiveX dùng để liên lạc giữa Flash và Internet
Explorer. Nhưng nếu bạn đang thiết kế cho người dùng sử dụng trình duyệt của
Windows thì cách này sẽ rất tốt.
Gởi thông điệp đến JavaScript
Gởi thông điệp từ ActionScript đến JavaScript thì chỉ cần viết code trong
ActionScript nhưng nó cũng sẽ thay đổi nội dung trang HTML của bạn .
Nếu bạn tạo file Flash bằng cách chọn FSCommand trong Publish settings, bạn
sẽ tạo được một file HTML đã được sửa chữa đầy đủ để nhận thông điệp. Công việc
của bạn chỉ là thay thế những chỗ được đánh dấu Your code here bằng phần JavaScript
của bạn.
Để hiểu rõ hơn cách nó làm việc như thế nào thì chúng ta hãy cùng nhau mổ xẻ
file html mà Flash đã tạo ra nhé
Đầu tiên, hãy chú ý đến thẻ OBJECT/EMBED, trong đó sẽ có một số phần để
chấp nhận sự liên lạc. Tham số ID trong thẻ OBJECT sẽ giống với tham số NAME
trong thẻ EMBED. Hai tham số này sẽ đặt tên cho movie của chúng ta trong trang web
để JavaScript có thể gọi nó. Ngoài ra còn có một tham số khác trong thẻ EMBED, đó
là tham số swLiveConnect để cho phép những phiên bạn Netscape trước phiên bản 6.0
có thể liên lạc với Flash bằng công nghệ LiveConnect.
CODE
[ic:cc]flash/swflash.cab#version=5,0,0,0"
ID=flashmovie WIDTH=120 HEIGHT=120>
VALUE=high> <>
NAME=bgcolor VALUE=#FFFFFF>
bgcolor=#FFFFFF
WIDTH=120 HEIGHT=120
swLiveConnect=true NAME=flashmovie TYPE="application/x-shockwave-flash"
PLUGINSPAGE="http:
index.cgi?P1_Prod_Version=ShockwaveFlash">
EMBED>Trang 111
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Giáo trình Thiết kế đa phương tiện (Flash) - Phần 2
vent sound. Ở đây toàn bộ sound sẽ được load vào bộ nhớ trước và sau đó được chơi nếu như có lệnh start(); CODE on (release) { mySound = new sound(); mySound.loadSound("mysound.mp3",false); mySound.start(); } Flash sẽ ghi nhớ là lệnh start đã được đưa ra thậm chí khi sound mới chỉ bắt đầu download. Khi sound được load xong thì nó sẽ được play ngay lập tức Trang 157 CODE on (release) { mySound = new sound(); mySound.loadSound("mysound.mp3",true); } Cách thứ 2 là ta sử dụng true ở param thứ 2. Giá trị true này sẽ bảo với flash đó là 1 stream sound. Ngay khi sound được load phần nào thì sẽ bắt đầu chơi ngay trong lúc phần còn lại vẫn tiếp tục được load. Nếu người dùng có kết nối mạng tốt thì sẽ nghe được toàn bộ sound khi load. Ghi chú là bạn ko cần phải sử dụng lệnh start với 1 streaming sound. Tuy nhiên bạn cần phải chú ý khi sử lí file MP3. Ví dụ nếu bạn sử dụng file nhạc mp3 với 128 Kbps hay 160 Kbps thường dùng để nghe thì nó sẽ là 1 file quá lớn để có thể stream vói internet, đặc biệt nếu người sư dụng dùng modem. 32 Kpsb hay ít hơn sẽ thích hợp hơn khi ta sử dụng stream. Một số câu hỏi và trả lời sau có thể giúp bạn nắm rõ bài hơn: Câu 1: ta có thể load 1 mc, vậy có thể unload chúng ko?? -Trả lời: có, bằng lệnh unloadMovie Câu 2: bình thường thì flash cần bao lâu để load trước khi nó start?? -Trả lời: ngay frame đầu tiên. Bởi vậy bạn cần sử dụng lệnh stop nếu như muốn nó đợi trước khi tiếp tục. Câu 3: 2 cách để xác định khi 1 movie được load hoàn toàn?? -Trả lời: cách 1 dùng getBytesLoaded == getBytesTotal function cách 2 dùng _frameLoaded property và _totalFrames property. Ngoài ra bạn có thể xem thêm các bài viết sau: Cách tạo 1 preloader đơn giản Trang 158 Cách tổng quát để tạo 1 loader đẹp: Ngoài ra về loadMovie, loadSound cũng có rất nhiều bài. Bạn chịu khó search ha Vẽ với AS Đây là h cuối cùng, cũng là giờ rất thú vị, hy vọng các bạn cảm thấy dzui dzẻ khi vẽ bằng AS . CBT ko có kinh nghiệm dịch bài, với lại nhìn vào mấy bài text dày đặc chữ là tối mắt tối mũi nên nhiều chỗ dịch lung tung, theo ý thích bởi vậy có chỗ nào diễn đạt tối nghĩa, ko đúng thì các bạn cứ thẳng thắn góp ý, đừng thương tiếc . Drawing lines -Để vẽ 1 đường thẳng, việc đầu tiên cần làm là định nghĩa các giá trị của lineStyle, nó dày như thế nào nè, rùi có màu gì và độ alpha. CODE lineStyle(thickness, color, alpha); Màu (color): giá trị được đưa ra dưới dạng số thập lục phân hexa, ví dụ: 0x000000 là màu đen, 0xffffff: trắng , chúng ta có thể nhìn vào bảng color mixer để biết thêm Độ trong suốt(alpha): min = 0; max=100; Độ dày (thickness): độ dày nhỏ nhất là 0, còn lớn nhất là bao nhiu thì cbt ko biết . Với độ dày 1 cái line có độ dày là 1 pixel, còn nếu ta cho giá trị là 0 (hairline) thì nó vẫn có độ dày là 1 pixel . Tuy nhiên chúng khác nhau ở chỗ: với hairline nếu như chúng ta thay đổi scale của nó thì độ dày của nó vẫn ko thay đổi. Các bạn thử đoạn code sau, và thay đổi giá trị độ dày nhé: CODE lineStyle(0,0x000000,100); moveTo(20,50); lineTo(200,200); _xscale=300; _yscale=300; Nhìn đoạn code trên ta thấy xuất hiện lệnh: Trang 159 CODE moveTo(20,50) Để vẽ 1 đường thẳng ta cần xác định 2 điểm: đầu và cuối. Mỗi điểm lại được xác đinh với 2 giá trị x và y ---> moveTo là điểm đầu, điểm đặt bút. Như vậy ở câu trên ta đặt bút tại x=20; y=50. ----> lineTo là điểm tiếp đến. Ta có x= 200; y=200. Như vậy chúng ta đã vẽ được đường thẳng nối từ điểm (20,50) đến (200,200). Chú ý: 1. nếu như các bạn ko nêu điểm moveTo thì nó tự mặc định là điểm (0,0) 2. nếu như các bạn vẽ thêm các line tiếp theo với lineTo thì điểm đặt bút được mặc định là điểm cuối cùng của line trước. Ví dụ để vẽ 500 đường lung tung trên màn hình ta có đoạn code đơn giản sau: CODE // set line style lineStyle(2,0x000000,100); // draw 500 lines for(var i=0;i<500;i++) { // pick random start point x1 = Math.random()*550; y1 = Math.random()*400; // pick random end point x2 = Math.random()*550; y2 = Math.random()*400; // move to start point moveTo(x1,y1); // draw to end point lineTo(x2,y2); } Trang 160 Bây giờ các bạn thử play trò này xem sao, thử thay đổi độ alpha, color or thickness của nó Mọi người thử copy and paste đoạn code sau xem hiện ra gì nào : CODE // set line style lineStyle(2,0x999999,100); for(var x=-400;x<550;x+=10) { // draw diagonal strip from left to right moveTo(x,0); lineTo(x+400,400); // draw opposite strip moveTo(550-x,0); lineTo(550-x-400,400); } Drawing Curves Tương tự khi bạn đã biết cách vẽ line rồi thì vẽ curveTo ko có gì là khó. Nó chỉ có thêm 1 chút giá trị thôi. Ta có đoạn code: CODE lineStyle(3,0x000000,100); moveTo(150,200); curveTo(275,275,400,200); Như đã biết moveTo là điểm bắt đầu, anker1 ha. curveTo(control_x, control_y, anker2_x, anker2_y); Control_point là tiếp tuyến của 2 điểm anker với đường cong anker2 là điểm cuối cùng của curve. Các bạn có thể đọc thêm 1 số bài viết trong diễn đàn về đường cong bezier để hiểu rõ thêm . Chúng ta play tiếp với đoạn code sau: CODE Trang 161 lineStyle( 1, 0x0000FF, 100 ); moveTo(200,200); curveTo(250,200,300,200); curveTo(300,250,300,300); curveTo(250,300,200,300); curveTo(200,250,200,200); Olala, tại sao chúng ko hiện ra các curve mà lại là 1 hình vuông. Nguyên nhân là do chúng ta cho các giá trị control point ở giữa 2 điểm kia Hãy thử thay đổi 1 chút xem chúng ta có gì nào: CODE var bend = 42; moveTo(200,200); curveTo(250,200-bend,300,200); curveTo(300+bend,250,300,300); curveTo(250,300+bend,200,300); curveTo(200-bend,250,200,200); sử dụng biến bend để thay đổi control point ta được 1 hình trong hơi méo rùi . Về phần này plz đọc thêm các topic trong box AS Drawing Filled Areas Trước hết để có thể tô màu cho 1 vùng ta cần phải vẽ 1 hình khép kín ha. Sau đó dùng lệnh beginFill để vẽ: CODE beginFill(color of fill, alpha of fill) Ví dụ đoạn code sau: CODE lineStyle( 3, 0x000000, 100 ); beginFill( 0xFF0000 ); moveTo(175,100); lineTo(375,100); lineTo(375,300); lineTo(175,300); lineTo(175,100); endFill(); Trang 162 Nếu như 1 vùng được cắt bởi line lần thứ 2 thì ở chỗ đó nó sẽ ko có màu nữa. Dựa vào đó ta có thể tạo nên 1 số hình thú vị . Bạn thử copy đoạn code sau xem nó hiện ra cái gì nào và chỗ nào được tô màu, chỗ nào ko : CODE lineStyle(3,0x000000,100 ); beginFill(0xFF0000); moveTo(250,50); lineTo(308,230); lineTo(155,120); lineTo(345,120); lineTo(192,230); lineTo(250,50); endFill(); Có cách khác tốt hơn để vẽ 1 star, nó cho phép chúng ta qui định các giá trị ban đầu. Bạn thử xem file fla 24betterstar.fla xem sao Pause Vẽ với chuột Phần tiếp theo trong sách này có đoạn code để user vẽ với chuột, thành thật mà nói, nếu bạn đã đọc đoạn code của DS post bên phần Flash hack thì bạn sẽ thấy nó khác nhau 1 trời 1 vực như thế nào Nếu bạn đã đọc đoạn code của DS thì đừng nên đọc tiếp đoạn code hướng dẫn trong cuốn sách này làm gì. CBt thấy là ko cần thiết phải dịch chỗ này nhưng trót rùi nên tôn trọng quyển sách, cbt dịch cho đầy đủ vậy 1.Tạo 1 shape đơn giản, convert to mc. 2.Copy đoạn code sau vào mc (cbt đã phân tích kèm) CODE onClipEvent (load) { // cho các giá trị cho kiểu line _root.lineStyle(0, 0x000000, 100); } Trang 163 //khi chuột được dzí xuống thì bắt đầu vẽ onClipEvent(mouseDown) { // ok to draw draw = true; // xác định điểm start để vẽ startX = _root._xmouse; startY = _root._ymouse; _root.moveTo(startX,startY); } //khi thả chuột ra thì ko vẽ nữa onClipEvent(mouseUp) { // don't draw anymore draw = false; } //bắt đầu onClipEvent (enterFrame) { if (draw) { //lấy vị trí hiện tại của chuột newX = _root._xmouse; newY = _root._ymouse; //nếu như vị trí khác với vị trí ban đầu if ((newX != startX) or (newY != startY)) { //vẽ 1 line tới vị trí mới _root.lineTo(newX,newY); // reset location for new time startX = newX; startY = newY; } } } 3. Tạo 1 movie clip riêng cho các hình đã vẽ Những gì chúng ta đã làm ở trên chỉ là vẽ 1 cách đơn giản trên stage, nó có bất lợi là có thể bị bất kì mc nào che khuất. ko thể di chuyển. Trang 164 Khi chúng ta đặt những cái này vào trong 1 mc thì thuận tiện hơn rất nhiều. ta có thể thay đổi _x, _y, rotation, alpha, scale .... Để tạo 1 new mc ta dùng lệnh : CODE my_mc.createEmptyMovieClip("tên của new mc", level của nó) Ví dụ : CODE this.createEmptyMovieClip("myMovieClip",1); myMoveClip.lineStyle(0,0x000000,100); myMoveClip.moveTo(100,100); myMovieClip.lineTo(200,200); Như vậy bạn đã có 1 mc mới tên là myMovieClip, level 1, có chứa các hình vẽ trên. Nếu bạn muốn viết nhanh hơn thì có thể viết lại như sau: CODE this.createEmptyMovieClip("myMovieClip",1); with(mymovieClip){ lineStyle(0,0x000000,100); moveTo(100,100); lineTo(200,200); } Lệnh createEmptyMovieClip này còn có rất nhiều tác dụng khác như ta có thể attach thêm movie vào đó hay là sao chép (duplicateMovieClip) Rùi bi giờ bạn hãy thử tạo 1 mc mới đi nào Có 1 bài hướng dẫn vẽ bông tuyết khá đẹp trong cuốn sách, tuy nhiên code được chia nhỏ thành các function khá dài dòng và mất công. trong khi trong diễn đàn của chúng ta có nhiều đoạn code về làm tuyết hay hơn rất nhiều: bài thế trời làm tuyết của DS trong box hướng dẫn thực hành. Đặc bịêt hợp với chủ đề này là bài dùng 100% bằng AS c Trang 165 dịch vủa Raider (tìm trong mề đoạn code trong sách này nục lục), trong ữa. đó có đoạn code rất hay. Bởi vậy cbt sẽ ko Để biết thêm chi tiết xin xem file fla 24snowflakes.fla Textfield Đây là phần cuối cùng, chúng ta sẽ học cách tạo 1 text field và sau đó là làm 1 effect flying words. Để Tạo Text tạo 1 text chúng ta cần tạo 1 ô text (text field) với lệnh : CODE createTextField("text_name", level , vị trí _x, vi trí _y, chiều rộng,chiều dài); Sau đó là text hiện lên trong text field đó: CODE text_name.text = "Nội dung text"; Ví dụ đoạn code sau, mình phân tích trong đó luon cho nhanh: CODE //tạo 1 ô chữ tên my..., level 0, _x=0, _y=170, width=550, height=60 createTextField("myTextField",0,0,170,550,60); //text myTextField.text = "Welcome to VNFX"; myTextField.embedFonts = true; //mặc định các tính chất của text myTextFormat = new TextFormat(); //loại chữ, cỡ, màu, vị trí myTextFormat.font = "Arial"; myTextFormat.size = 48; myTextFormat.color = 0x330000; myTextFormat.align = "center"; Trang 166 //liên kết những tính chất này với ô text của chúng ta myTextField.setTextFormat(myTextFormat); Chú ý khi sử dụng embedFont ta cần phải chọn 1 font trong thư viện click vào góc phải trên cùng của thư viện, chọn font mà bạn muốn, sau đó click chuột phải, linkage, export, IDname Nếu bạn muốn tạo 1 Input text thì cần phải cho type của textField là input, sau đó có thể set thêm các variable để máy có thể nhận info từ user Còn rất nhiều các tính chất trong textField và textFormat class, các bạn nên đọc thêm help để trang trí cho textField của mình Lý thuyết chỉ có vậy, nào bây giờ chúng ta sẽ làm effect flying words CBT không dám nhận xét nhiều về đoạn code và cách làm trong cuốn sách này, tuy nhiên nó được chia nhỏ thành các function gây rắc rối, dài dòng cho người đọc, lại còn phải tạo thêm mc trên stage, có chỗ hạn chế nữa... CODE function createText(n,text) { // create a new movie clip this.createEmptyMovieClip("text"+n,n); mc = this["text"+n]; // set the text format myFormat = new TextFormat(); myFormat.font = "Arial"; myFormat.color = 0x000000; myFormat.size = 24; myFormat.align = "center"; // create a new text field mc.createTextField("myTextField",1,-100,-20,200,40); mc.myTextField.text = text.toUpperCase(); mc.myTextField.embedFonts = true; mc.myTextField.setTextFormat(myFormat); // return reference to this movie clip return(mc); } function createAllText(textList) { // loop through array of text for(var i=0;i<textList.length;i++) { // create movie clip with this text mc = createText(i,textList[i]); Trang 167 // set random location mc._x = Math.random()*450+50; mc._y = Math.random()*350+25; // set scale to nothing mc._xscale = 0; mc._yscale = 0; // set scale variable to negative amount mc.scale = 0-i*100; } } function init() { // create array of text var words = "Love,Peace,Destiny,Llamas,Fate,History,Cheese,Rainbows,Tiny Rocks"; var textList = words.split(","); // create all text movie clips createAllText(textList); // remember how many there are numWords = textList.length; } function moveText() { // loop through words for(var i=0;i<numWords;i++) { // increase the scale of this movie clip mc = this["text"+i]; mc.scale += 10; // hide movie clip when scale is too big if (mc.scale > 300) { mc._visible = false; // set scale of movie clip to scale when it is a positive number } else if (mc.scale > 0) { mc._xscale = mc.scale; mc._yscale = mc.scale; } } } init(); stop(); Sau đó bạn tạo 1 mc trên stage và nhét đoạn code sau vào: CODE onClipEvent(enterFrame) { _parent.moveText(); } Cuối cùng vào thư viện, trong menu của thư viện ta chọn font ruì linkage, rùi export với tên Arial. Trang 168 effect này ko có gì khác là ta tạo 1 array chứa các ô text, sau đó các text hiện ra từ từ và dần dần phóng to lên, đến 1 kích thước nào đó thì biến mất. Để các text hiện ra từ từ ta chỉ cần mặc định scale ban đầu của text là ko, sau đó dùng thêm 1 var nữa. Dần dần phóng to lên thì ta thay đổi scale thôi. Thấy đoạn code trên dài dòng quá nên cbt viết lại cho nó đơn giản bớt như sau CODE function a(){ wordArr=new Array("vnfx","flash","actionscript"); //ta tạo 3 mc chứa 3 text field for(var n=0;n<wordArr.length;n++){ _root.createEmptyMovieClip("text"+n,n) mc=_root["text"+n]; myFormat=new TextFormat(); myFormat.font="Arial"; myFormat.color = 0x000000; myFormat.size = 24; myFormat.align = "center"; mc.createTextField("myTextField",1,-100,-20,200,40); mc.myTextField.text = wordArr[n]; mc.myTextField.embedFonts = true; mc.myTextField.setTextFormat(myFormat); //mặc định các giá trị ban đầu mc._x=Math.random()*450+50; mc._y=Math.random()*350+25; mc._xscale=mc._yscale=0; //biến để tạo sự xuất hiên từ từ mc.scale=0-n*100; mc.onEnterFrame=function(){ this.scale+=10; if (this.scale > 300) { removeMovieClip(this); } else if (this.scale > 0) { this._xscale=this._yscale = this.scale; } } } } a(); //cho lặp lại sau 5 s setInterval(a, 5000); Trang 169
File đính kèm:
- giao_trinh_thiet_ke_da_phuong_tien_flash_phan_2.pdf