Mục lục
Phần I: Tìm hiểu về Macromedia Director 8
Chương 1: Cơ bản về Director 8
I.Giới thiệu về Macromedia Director
Chương trình multimedia là một chương trình tích hợp cả văn bản, âm thanh, hình ảnh. Để tạo ra những chương trình mulitmeda sống động đòi hỏi phải có các công cụ chuyên để tạo lập chúng. Macromedia Director là một công cụ phục vụ cho mục đích này.
Director là một công cụ chuẩn công nghiệp để xây dựng các sản phẩm multimedia và các ứng dụng chạy trên mạng Internet hay cũng nh
74 trang |
Chia sẻ: huyen82 | Lượt xem: 1385 | Lượt tải: 1
Tóm tắt tài liệu Tìm hiểu về Macromedia Director 8; Công nghệ shochứng khoánwave trên internet; Xây dựng chương trình, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ư mạng intranet. Director không chỉ có khả năng kết hợp các phần tử để tạo ra các sản phẩm, mà còn cung cấp khả năng lập trình mềm dẻo bằng ngôn ngữ Lingo Scrpt để tạo các hiệu quả mong muốn. Hiện nay, Director được dùng rộng rãi để tạo ra các trang WEB multimedia, các chương trình dạy học, các trò chơi trên máy tính.
Bởi vì Director có khả năng kết hợp âm thanh cũng như hình ảnh tĩnh và động, người ta gọi các sản phẩm của nó là multimedia (đa phương tiện). Trên thị trường đĩa CD-ROM, Director là một công cụ tạo lập tiêu chuẩn. Một vài công cụ multimeda đang được sử dụng để tạo ra các sản phẩm trên đĩa CD, nhưng Macromedia đã lên tục cải tiến và nâng cấp sản phẩm để đáp ứng nhu cầu cho Internet/intranet. Director 8 có các chức năng tiện lợi để đưa multimedia lên mạng.
Có gì đặc biệt trong Director?
Director đi tiên phong trong lĩnh vực tạo multimedia, nhưng cũng có rất nhiều đối thủ cạnh tranh như: SuperCard, Apple Media Toolkit, và Quark/mFactory, mTropolis, và ngay cả sản phẩm cùng hãng : Authorware Professional. Vậy điều gì đã làm cho Director giữ được vị trí dẫn đầu của mình? Đó là do các ưu điểm của nó như:
Khả năng tạo ảnh động
Director tạo ảnh chuyển động bằng kỹ thuật thay thế các thành phần trong từng lớp và trình diễn chúng qua từng khung hình một (frame-by-frame). Điều này có thể đòi hỏi thời gian phát triển dài nhưng bù lại là ta có vật thể chuyển động thật hơn.
Khả năng chạy trên nhiều hệ thống
Không phải tất cả các phần mềm đều có thể chạy trên mọi máy tính. Có nhiều loại hệ điều hành khác nhau, và hầu hết phần mềm được thiết kế để tương thích với một trong các hệ điều hành đó. Một vài sản phẩm phần mềm được “di chuyển” từ một hệ thống sang hệ thống khác (thường là Macintosh sang Windows, và ngược lại), nhưng những phiên bản được chuyển này đòi hỏi phải được “viết lại” rất nhiều.
Khi thị trường multimedia hình thành, các nhà phát triển gặp phải một chút băn khoăn. Đó là do Macintosh cung cấp khả năng đồ hoạ cao, vì thế nó là hệ điều hành được các nhà thiết kế chọn lựa, nhưng với mục tiêu là số lượng người dùng thì Windows vượt hẳn. Có thể kết hợp những mặt tốt của cả hai? Bằng cách xây dựng multimedia trên Macintosh và sau đó chuyển sang Windows.
Director có thể làm cho quá trình trên trở nên đơn giản. Hiện nay, Director có hai phiên bản chạy trên Macintosh và trên Windows, và các file được tạo ra trên hệ điều hành này có thể được mở trực tiếp từ Director trên hệ điều hành kia. Quá trình chuyển đổi mặc dù không được trơn tru lắm nhưng cũng ăn đứt việc viết lại chương trình.
Shockwave: đưa sản phẩm Director lên mạng
Với sự phát triển của công nghệ Shockwave, mọt phim Director có thể được đưa lên trang web một cách đơn giản: người dùng có thể tương tác với phim Director trong trang web. Chuyển từ phim Director thành dạng Shockwave rất dễ dàng và chỉ đòi hỏi một chút hiều biết.
Trong môi trường tương tác trực tuyến, đối thủ cạnh tranh chính của Shockwave là Java - và Java có một số ưu điểm so với Shockwave. Nhưng java đòi hỏi phải tạo multimedia từ đầu, trong khi Shockwave chỉ đơn giản được chuyển từ Director sang. Phim dạng Shockwave được nhúng vào trang Web ( như Java Applet ) và chạy được nhờ vào một plug-in riêng.
II.Các thành phần của Director
Director cung cấp hai loại cast là cast bên trong (internal cast) và cast ngoài (external cast) và chúng được phân loại thành cast âm thanh, cast hình ảnh, video, cast, văn bản hoặc thành cast nút bấm, cast thủ tục...
Cửa sổ cast
Cửa sổ cast thể hiện các cast hiện có, cho phép người lập trình tạo mới các cast hay các cast thành phần, soạn mới một cast, đặt các thuộc tính cho cast, viết các thủ tục cho cast thành phần, xem số hiệu và tên cast thành phần, kéo thả một cast thành phần vào stage,...
Để hiển thị các dữ liệu trên màn hình, Director phải truy nhập tới cơ sở dữ liệu của ứng dụng. Đối với các phim được tạo bằng máy tính, cast bao gồm một số phần tử cơ bản (media element) như đồ hoạ, âm thanh, văn bản, các file 3D, video số và các phim Director. Các loại dữ liệu khác của cast như các bảng màu tự tạo, các thủ tục được nhập từ ngoài hoặc được tạo ra trong quá trình làm việc với Director. Những cast này là cast ngoài, nhưng ta vẫn có thể truy nhập chúng từ cửa sổ cast.
Stage
Stage là nơi trình diễn của phim, mọi cái người dùng có thể nhìn thấy và điều khiển đều diễn ra ở stage
Trước khi xây dựng một ứng dụng, ta cần xác định kích thước của stage. Việc thay đổi kích thước của stage sau khi xây dựng ứng dụng hay sau khi kết thúc công việc là một điều rất bất lợi. Để thay đổi kích thước của stage, ta sử dụng hộp thoại movie Properties bằng cách chọn menu Modify->Movie->properties. Kích thước mặc định của stage là 640x480. Trong Director cũng có một thuộc tính dùng để hiển thị phim trên toàn bộ màn hình (stage sẽ chiếm toàn bộ màn hình) đó là full screen.
Ta cũng có thể sử dụng hộp thoại Movie Properties để thay đổi màu của stage. Trong hộp thoại này, kích vào ô bên cạnh stage color, một bảng màu sẽ hiện ra cho ta lựa chọn. Ngoài ra, ta có thể thay đổi màu của stage bằng lệnh Lingo. Nháy đúp chuột vào kênh script trong score sau đó đưa thêm dòng lệnh sau vào vị trí cần thiết
Set the stagecolor to color_num
Playback head
Sprite trong score
Cửa sổ Score
Score là trung tâm điều khiển của Director, nó phản ánh tình trạng, nội dung của stage và các đối tượng đặt trên stage trong một khung hình nhất định nào đó. Có thể nói score chính là biểu diễn của phim.
Sprite
Là hiện diện của một cast thành phần trên stage. Mỗi ô (cell) của score chứa thông tin về một cast thành phần tại một thời điểm và được gọi là một sprite. Tại mỗi thời điểm, Director 8 cung cấp tới 1000 kênh sprite và nó cho phép tắt các kênh không cần thiết để tối ưu quá trình thực hiện. Vị trí của sprite được xác định dựa vào gốc toạ độ ( góc trái trên cùng của stage).
Sprite không phải là một cast thành phần mà chỉ chứa thông tin liên quan tới cast thành phần đó trên stage, như vị trí hiển thị, các hiệu ứng đặc biệt, .... mỗi sprite chiếm một vùng hình chữ nhật trên stage. Mỗi khi ta đặt một cast thành phần vào stage, một sprite sẽ xuất hiện trong score và ngược lại, khi ta đặt một cast thành phần vào score nó cũng tự động được đặt vào stage.
Khi thực hiện, score của Director sẽ kiểm tra xem cast thành phần nào được hiển thị trên stage và truy cập các thông tin về nó tại mỗi thời điểm ( điều này toạ điều kiện trong quá trình xử lý ảnh động). Khi chuyển sang khung hình tiếp theo, Director sẽ đọc score, kiểm tra các thông tin của các sprite và phát hiện ra các sprite có thay đổi. Khi đó, Director chỉ cần đọc dữ liệu từ các cast thành phần tương ứng và hiển thị nó lên màn hình. Score của Director có tới 1000 kênh sprite nên tại mỗi thời điểm nó có thể hiển thị 1000 sprite lên stage.
Mỗi sprite có thể có nhiều kích thước, hình dạng khác nhau trong phim, các thuộc tính này thay đổi được mặc dù phim vẫn truy nhập đến cùng một cast thành phần của cast và cast thành phần đó không thay đổi. Mỗi cast thành phần có thể xuất hiện nhiều lần trong phim, tức là chiếm nhiều sprite, nhưng nó vẫn chỉ chiếm một vị trí trong cửa sổ cast.
Người ta thường dùng lệnh Lingo để thay đổi các thuộc tính của sprite khi người dùng có tương tác với phim. Thông thường ta truy cập sprite bằng số hiệu của nó. Director 8 chứa nhiều loại sprite hơn các phiên bản trước, như :
Sprite Span
Mỗi sprite chiếm giữ một ô và ta phải dùng In-between Sprite dọc theo score khi ta muốn nhìn thấy chúng trên stage. Trong Director ta có thể dùng các lệnh In-Between Linear và In-Between Special để tạo các hình ảnh động và các hoạt động trên stage tại bất kỳ thời điểm nào.
Director xem các sprite như các đối tượng trong một khoảng thời gian xác định. Khi ta kéo một cast thành phần vào stage, sprite đã tạo ra sẽ chiếm 28 khung, mỗi khung chứa một thể hiện xác định của sprite. Giá trị mặc định này có thể thay đổi trong một hộp thoại sprite preferences.
Khi ta dịch chuyển một sprite trên stage, mọi thể hiện của sprite đó trong Sprite Span cũng dịch chuyển theo. Nếu ta kích vào một ô trên score, không phải chỉ một ô mà toàn bộ sprite ta vừa chọn sẽ sáng lên. Tương tự nếu ta dịch chuyển này trong score toàn bộ sprite sẽ dịch chuyển. Nếu ta muốn soạn thảo các khung riêng biệt trong một sprite, như trong các phiên bản trước, ta có thể chọn Edit->edit sprite frames. Khi soạn thảo ở chế độ này, việc cập nhật sẽ diễn ra trong từng ô riêng biệt. Để đưa chúng trở lại thành sprite span hoàn chỉnh, ta chọn các sprite này trên menu Edit->Edit entire sprite. Dùng lựa chọn này, việc soạn thảo sẽ làm thay đổi toàn bộ sprite span. Ta có thể thày đổi số khung mà sprite span từ 28 đến một giá trị tuỳ ý bằng cách dùng hộp thoại Sprite Preferences. Để làm việc với từng sprite như trong phiên bản trước đổi span duration về 1.
Sprite Overlay
Nếu bật Sprite Overlay, ta có thể nhìn trực tiếp thông tin về sprite trong một hình chữ nhật nhỏ, trong suốt nằm dưới sprite trên stage. Sprite Overlay hiển thị tự động thông tin sprite.
Ta không cần mở hộp thoại Sprite Properties để soạn thảo các thuộc tính của sprite. Ta có thể dùng Sprite Overlay và Sprite inspector với nhau để soạn trực tiếp các sprite trên stage. Nếu ta cần mở hộp thoại Sprite Properties cho các ứng dụng khác, ta có tể nhanh chóng mở nó từ nút có chữ I màu đỏ trong Sprite Overlay. Ta cũng có thể mở trực tiếp hộp thoại Cast Member Properties và Behavior inspector từ Sprite Overlay.
Để thay đổi các thiết lập Sprite Overlay, mở hộp thoại Overlay Settings từ menu View, Sprite Overlay, Settings.
Khung hình
Khung hình được hiển thị trong stage dưới dạng một cột. Mỗi cột gồm có 1000 hàng. Mỗi hàng là một trong 1000 kênh của score. Số lượng khung hình không hạn chế. Ta có thể nhìn thấy soó hiệu khung hình hiện thới đang dược hiển thị trên score hoặc control panel của Director.
Mỗi khung hình hiển thị một cảnh nào đó khi Director đọc tới vị trí khung hình đó trong cửa sổ score. Theo mặc định, Director sẽ đọc qua tất cả các khung hình cho đến hết phim, đây chính là nguyên tắc của các phim tuyến tính. Ta có thể tạo một phim Director chỉ có một khung hình nhưng trong trường hợp đó ta phải dùng các lệnh Lingo để tạo các thay đổi cần thiết.
Kênh
Mỗi kênh là một hàng trong score, Director cung cấp cho ta 1000 kênh. Thông tin chứa trong các kênh đều có ảnh hưởng tới việc hiển thị các khung hình trên stage. Thông tin đó bao gồm tốc độ phim, các pallette màu, các hiệu ứng chuyển đổi (transition), âm thanh, các thủ tục Lingo, và các vị trí của sprite trên stage.
Kênh tempo
Kênh palette
Kênh transition
Kênh âm thanh
Kênh behavior
Kênh sprite
Kênh Tempo
Kênh Tempo được dùng để đặt các thuộc tính về thời gian đợi cho phim. Với kênh Tempo ta có thể đặt tốc độ cho phim (fps/frame per second), khoảng thời gian đợi cho khung hình đố tính theo giây, đợi một sự kiện phím bấm hoặc nhấy chuột, đợi kênh âm thanh 1 hoặc 2 kết thúc, đợi một kênh Video nào đó kết thúc. Dùng kênh tempo rất đơn giản và nhanh gọn, tuy nhiên nó chỉ cho phép tạo các phim dưới dạng trình diễn (presentation) hay còn gọi là các phim tuyến tính. Các thuộc tính đặt trong kênh tempo cũng có thể thay đổi bằng các lệnh Lingo, lệnh Lingo cho phép tạo ra các tương tác trong chương trình. Ta có thể đặt tốc độ cho phim làm cho phim chuyển động nhanh hay chậm tuỳ ý.
Kênh palette
Kênh palette dùng bảng màu đã được kích hoạt để thay đổi bảng màu và thực hiện các hiệu ứng màu trong phim. Nháy đúp vào kênh Palette của một khung hình , ta sẽ xem được bảng màu hiện thời của khung hình đó. Khi sử dụng kênh palette, ta cần quan tâm đến các vấn đề sau:
Độ phân giải màu: Liên quan tới số lượng màu trên màn hình. Ta kiểm tra độ phân giải màu bằng lệnh put the colorDepth, kết quả nhận được sẽ là độ phân giải màu hiện thời. Director cho phép xây dựng các phim có độ phân giải màu 32 bit
Chuyển đổi giữa các bảng màu: Giả sử máy của ta hiển thị được 256 màu và ta dùng scanner để quét ảnh dùng trong ứng dụng, khi đó ta cần chuyển đổi các ảnh về mức 256 màu. Nếu các ảnh được quét bằng scanner có sốo lượng màu lớn hơn 256, ta phải dùng các coong cụ soạn thảo đồ hoạ để chuyển chúng về 256 màu.
Khi import một ảnh từ ngoài vào và bảng màu nó dùng không phải bảng màu chuẩn , ta có theer vẫn giữ nguyên bảng màu đó và coi nó như một cast thành phần hoặc ánh xạ bảng màu đó thành bảng màu của hệ thốgn. Nếu giữ nguyên bảng màu, ta phải đảm bảo khi cast thành phần đó được dùng thì bảng màu tương ứng của nó phải được đặt trong kênh Palette của khung hình mà nó xuất hiện. Các công việc trên được thực hiện bằng cách dùng những lựa chọn trong khung hội thoại khi ta import ảnh vào.
Việc thay đổi bảng màu một cách thường xuyên là không nên, do đó ta nên dùng các bảng màu chuẩn hoặc tạo ra các bảng màu của riêng ta để dùng chung cho tất cả các ảnh trong ứng dụng.
Khi đã có một bảng màu dùng chung, ta chỉ cần đặt nó vào kenh Palette trong khung hình thứ nhất, bảng màu đó sẽ được kích hoạt trong suốt quá trình ứng dụng chạy nếu ta không kích hoạt thêm một bảng màu nào khác.
Kênh Transtion
Kênh này dùng để đặt các hiệu ứng đặc biệt, chuyển đổi giữa các cảnh trong phim ta xây dựng. Để đặt các hiệu ứng cho một khung hình nào đó, ta nháy đúp vào kênh Transition ứng với khung hình đó. Ta có thể đặt các hiệu ứng của kênh này cho toàn bôj stage hay chỉ cho những phần thay đổi của stage mà thôi. Sau khi đã đặt hiệu ứng Transition trong một khung hình, Director tự động lưu trữ nó trong cast tương ứng như một cast thành phần. Do đó nếu ta không muốn dùng hiệu ứng chuyển đổi đó nữa ta cần phải xoá cast thành phần của hiệu ứng đó.
Các hiệu ứng Transiton là một trong những nhiệm vụ nặng nề mà CPU phải thực hiện và nó chiếm khá nhiều bộ nhớ. Thời gian cần thiết để thực hiện hiệu ứng Transition sẽ làm giảm toàn bộ tốc độ thực hiện của hệ thống.
Hai kênh âm thanh
Macintosh cho phép dùng tới 8 kênh âm thanh trong khi đó Windows chỉ cho phép dùng hai kênh, những thư viện MảcoMix.dll mà Director cung cấp giúp ta trộn nhiều file âm thanh vào trong một kênh âm thanh.
Trong Score kích đúp vào kênh âm thanh ứng với khung hình ta muốn bắt đầu đoạn âm thanh, chọn cast âm thanh thành phần muốn dùng, đoạn âm thanh của cast thành phần đó sẽ bắt đầu chơi từ khung hình ta vừa đặt. Director cũng cho phép kéo thả các cast âm thanh thành phần từ cast vào một trong hai kênh âm thanh.
Việc dùng score tỏ ra rất nhanh và tiện lợi nhưng nó có nhược điểm là nó tốn bộ nhớ và đôi khi không đạt hiệu quả như mong muốn, trong trường hợp đó dùng các lệnh Lingo sẽ hữu hiệu hơn. Kênh âm thanh thứ hai sẽ được dùng cho âm thanh nền, kênh 1 dùng cho các âm thanh được điều khiển bằng lệnh puppet sound của Lingo.
Kênh script
Dùng để chứa các thủ tục viết bằng Lingo, các thủ tục đó chỉ có tác dụng trong khung hình tương ứng. Các thủ tục này (còn gọi là các script) được gọi là các thủ tục khung hình (frame script). Thủ tục còn được gọi là handler vì các thủ tục này tương ứng với một sự kiện và nó sẽ thực hiện khi sự kiện tương ứng xuất hiện.
Để đưa vào kênh script, ta nháy đúp chuột vào script của khung hình, ta sẽ nhận được một thủ tục tên là exitframe tương ứng với sự kiện kết thúc khung hình này và chuyển sang khung hình tiếp theo.
Mỗi khi bắt đầu một khung hình, các kênh được đọc và thực hiện theo thứ tự từ trên xuống, từ kênh tempo đến kênh script thứ 1000. Những kênh đặc biệt cung cấp thông tin về các hiệu ứng đặc biệt được dùng trong khung hình, còn các script 1 đến 1000 sẽ được hiển thị trên stage. Thứ tự các kênh rất quan trọng, kênh thứ nhất được hiển thị đầu tiên sau đó đến kênh thứ hai... Theo thứ tự hiển thị trên stage, ta thấy kênh 1000 được vẽ trên cùng chèn lên các kênh khác còn kênh 1 nằm dưới cùng. Quá trình này tiếp diễn với tất cả các khung hình.
Control Panel
Bảng điều khiển là một cửa sổ và nó cho phép người dùng điều khiển phim trong môi trường Director. Các nốt điều khiển của bảng này giống như các nút điều khiển của một đầu video. Ngoài ra, bảng điều khiển còn hiển thị và cho phép ta thay đổi một số thông tin như khung hình hiện thời, số khung hình/giây, thay đổi tốc độ phim, đặt chế độ lặp cho phim, điều khiển âm lượng.
Bảng điều khiển rất có ích trong các phim tuyến tính, đặc biệt là trong khi chạy thử nghiệm để xem khả năng của chương trình. Nó cũng giúp cho công việc của người lập trình đơn giản đi một chút khi sử dụng các khả năng của nó để điều khiển các thành phần multimedia mà không cần phải sử dụng các lệnh điều khiển Lingo.
III.Các kỹ thuật tạo hoạt hình trong Director
Hoạt hình là sự thay đổi của ảnh theo thời gian. Các loại hoạt hình thường thấy nhất là di chuyển một sprite trên cửa sổ Stage ( hoạt hình kiểu tweening) và dùng một loạt các thành phần cast trên cùng một sprite (hoạt hình kiểu frame-by-frame hay còn gọi là kiểu thay đổi theo khung hình).
Tweening là một thuật ngữ trong kỹ thuật hoạt hình, nó mô tả quá trình trong đó người chỉ đạo vẽ các khung hình chính còn các trợ lý vẽ các hình thay đổi giữa các hình chính đó.
Kỹ thuật hoạt hình frame-by-frame đòi hỏi tạo ra mỗi khung hình trong phim hoạt hình.
Các kỹ thuật hoạt hình khác bao gồm thay đổi kích thước, quay, thay đổi màu, hay thay đổi độ sáng của một sprite.
Để đặt các thuộc tính trong Tweening, ta dùng hộp thoại Sprite Tweening
Để mở hộp thoại Sprite Tweening :
1 Chọn một sprite
2 Vào Modify > Sprite > Tweening.
Kỹ thuật Tweening trong Director
Để dùng kỹ thuật này trong Director, ta xác định các thuộc tính cho một sprite trong những frame gọi là key frame và để cho Director thay đổi những thuộc tính trong những frame nằm giữa.
Tweening rất có hiệu quả trong việc thêm hoạt hình vào trang Web, vì nó không cần download thêm các dữ liệu khi một thành phần cast thanh đổi.
Một keyframe thường được dùng khi có thay đổi trong các thuộc tính của một sprite. Có thể thay đổi các thuộc tính vị trí, kích thước, góc quay, độ sáng, màu nền và màu nổi. Mỗi keyframe xác định một giá trị cho các thuộc tính trên.
Thay đổi đường đi của một sprite
Đường đi của sprite là những đường biều diễn sự di chuyển trên cửa sổ Stage của một sprite. Đường đi của Sprite được kiểm soát trong hộp thoại Sprite Overlay Settings.
Bạn có thể thay đổi đường đi của một sprite trực tiếp trên cửa sổ Stage bằng cách kéo-thả các keyframe.
Để thay đổi đường đi của một sprite:
Đặt một sprite trên cửa sổ Stage nơi bạn muốn bắt đầu của đường đi, nếu đã có rồi thì chỉ việc chọn nó.
Nếu cần chọn View > Sprite Overlay > Show Paths để hiện đường đi của sprite
Chèn các keyframe vào frame nào mà bạn muốn thay đổi đường đi
Kéo đầu đỏ của đường đi trên Stage đến chỗ bạn muốn kết thúc đường đi.
5. Để thay đổi đường cong trên đường đi, giữ phím Alt (Windows) hay phím Option (Macintosh) và dùng chuột kéo trên đường cong.
6. Muốn thay đổi độ cong giữa các keyframe, chọn Modify > Sprite > Tweening và điều chỉnh Curvature.
Ngoài việc thay đổi đường đi của một sprite, Director có thể thay đổi cả kích thước, góc quay, độ sáng, màu nền và màu nổi. Thay đổi kích thước được áp dụng tốt nhất đối với các thành phần cast có dạng vector (vector-based)
Chuyển đổi các thành phần cast của một sprite
Để thay đổi nội dung một sprite mà lại muốn giữ nguyên các thuộc tính khác của sprite, bạn đổi thành phần cast gắn với sprite đó.Kỹ thuật này rất có ích khi bạn vừa áp dụng Tweening cho một sprite nhưng sau đó lại muốn dùng một thành phần cast khác. Khi thay đổi thành phần cast, đường đi không thay đổi
Các bước để thay đổi thành phần cast trong Score
Muốn thay đổi trong tất cả các khung hình của một sprite, chọn toàn bộ. Nếu không thì có thể chọn một phần.
Chọn một phần bằng cách nhấn phím Alt và click frame đầu tiên muốn chọn. Sau đó nhấn Control-Alt(Windows) hay Option-Alt(Macintosh) và click các frame muốn chọn
Mở cửa sổ Cast và chọn thành phần cast bạn muốn dùng để thay thế
Chọn Edit > Exchange Cast Members.
Hình: Trước khi thay đổi thành phần cast
Hình: Sau khi thay đổi thành phần cast, đường đi không đổi
Ngoài ra, có thể dùng lệnh Lingo để chuyển đổi thành phần cast của một sprite.
Hoạt hình theo kỹ thuật thay đổi khung hình (Frame-by-frame animation)
Để tạo ra hoạt hình phức tạp hơn là dùng kỹ thuật Tweening, bạn có thể dùng một loạt các thành phần cast trong kỹ thuật hoạt hình frame-by-frame.Các sprite thường chỉ chứa một thành phần cast, nhưng chúng có thể thay đổi thành phần cast theo từng thời điểm.
Các bước để tạo hoạt hình của một sprite dùng nhiều thành phần cast:
Tạo ra một sprite trên cửa sổ Stage
Thay đổi độ dài cần của sprite theo ý muốn
Chọn View > Display > Cast Member để hiện tên của mỗi thành phần cast trên sprite.
4 Vào View > Sprite Labels > Changes Only. Đặt thế này để hiện tên chỉ khi thành phần cast thay đổi.
5 Vào Edit > Edit Sprite Frames.
Sau đó chọn những frame muốn thay đổi thành phần cast
Mở cửa sổ Cast và chọn thành phần cast để thay đổi
Chọn Edit > Exchange Cast Members.
Director thay thế những thành phần cast được chọn trên sprite bằng thành phần cast trong cửa sổ Cast
9 Lặp lại đến khi hoàn thành. Chọn Edit Entire Sprite khi làm xong.
Nhanh chóng tạo hoạt hình dùng nhiều thành phần cast
Cast to Time và Space to Time được dùng để tạo hoạt hình một cách nhanh chóng dùng nhiều thành phần cast
Sử dụng Cast to Time
Để “nhét” một loạt các thành phần cast vào Score như là một sprite duy nhất, dùng lệnh Modify > Cast to Time, đây là một lệnh có ích nhất để tạo hoạt hình dùng nhiều thành phần cast. Thường thì bạn tạo một loạt ảnh và sau đó dùng lệnh Cast to Time để nhanh chóng đặt chúng vào Score như là một sprite duy nhất.
Các bước tạo một sprite từ nhiều thành phần cast:
1 Chọn frame trên Score nơi muốn đặt sprite mới
2 Mở cửa sổ Cast
3 Chọn các thành phần cast để đặt trên sprite mới tạo ra.
4 Vào Modify > Cast to Time
Sử dụng lệnh Space to Time
Muốn chuyển các kênh lân cận vào một sprite,ta dùng lệnh Modify > Space to Time. Phương pháp này tiện lợi khi bạn muốn xếp một vài ảnh trên cửa sổ Stage vào một frame và chuyển thành một sprite.
Để dùng lệnh Space to Time :
1 Vào File > Preferences > Sprite và đặt Span Duration bằng 1 frame.
2 Chọn một frame còn trống trên Score.
3 Kéo thành phần cast vào Stage để tạo ra các sprite.
Khi định vị sprite trên cửa sổ Stage, Director đặt mỗi sprite trên một kênh riêng biệt. Hãy đặt các sprite trên các kênh liên tiếp.
Chọn tất cả các sprite cần thiết trong chuỗi hình ảnh.
Vào Modify > Space to Time.
Hộp thoại Space to Time xuất hiện. Đặt số frame giữa các thành phần cast tuỳ ý.
Sử dụng film loop
Một film loop là một dãy hoạt hình mà ta có thể dùng như là một thành phần cast đơn.Ví dụ, để tạo một hoạt hình diễn tả cảnh một con chim đang bay, ta có thể tạo ra một film loop gồm ảnh các thành phần cast các cảnh chim vỗ cánh.Thay vì dùng kỹ thuật frame-by-frame, ta tạo một sprite chỉ chứa film loop và cho chạy qua bao nhiêu khung hình tuỳ ý.
Có thể dùng film loop để làm gọn dữ liệu trên Score. Film loop đặc biệt hữu ích khi cần làm giảm số kênh sprite. Có thể kết hợp vài kênh trên Score thành một film loop và đặt trên một kênh. Có thể đặt các thuộc tính cho film loop.
Các bước để tạo một film loop:
1 Trên Score, chọn các sprite bạn muốn chuyển thành film loop.
Sử dụng bao nhiêu sprite tuỳ thích – kể cả kênh âm thanh.
2 Vào Insert > Film Loop.
Một hộp thoại xuất hiện.
3 Đặt tên cho film loop mới tạo ra.
Tạo hoạt hình dùng lệnh Lingo
Lingo có thể tạo hoạt hình bất kể những đặc tính được đặt trên Score. Điều này cho phép bạn tạo ra hay sửa đổi một hoạt hình dựa trên tình trạng của phim.
Muốn di chuyển một sprite trên cửa sổ Stage, bạn có thể dùng các lệnh Lingo điều khiển vị trí của sprite đó. Để tạo hoạt hình bằng cách thay đổi thành phần cast của sprite, có thể dùng lệnh chuyển thuộc tính của sprite.
Chương 2: Lingo script trong Director
Muốn xây dựng các ứng dụng có tính tương tác với người dùng, Director cung cấp một ngôn ngữ tiện lợi để viết lệnh điều khiển phim khi xảy ra một điều kiện hay một sự kiện nào đó, đó là ngôn ngữ Lingo Script
Lingo tạo ra các tính năng mà nếu chỉ dùng các công cụ kéo-thả trong Director thì không thể thực hiện được. Ví dụ, Lingo có thể chơi một âm thanh sau khi một phần dữ liệu âm thanh được tải về từ mạng. Ngôn ngữ này có một điểm mạnh là nó dễ học, cú pháp gần với ngôn ngữ tự nhiên. Đối với ngôn ngữ này, việc quan trọng nhất là ta cần hiểu cách thức nó tương tác với các thành phần cast và Score, vị trí đặt đoạn mã để thu được kết quả mong muốn.
I. Sơ qua về Lingo
Các thuật ngữ
Cũng như các ngôn ngữ lập trình khác, Lingo sử dụng các thuật ngữ và các cú pháp đặc trưng mà người lập trình cần phải nắm được. Các thuật ngữ của Lingo có thể tóm tắt như sau:
Tham số (Argument) là tên tượng trưng dùng thế chỗ cho các giá trị thực sự sẽ được truyền cho hàm khi hàm được gọi.
Lệnh (Command) là một chỉ thị yêu cầu Director thực hiện một thao tác gì đó. Ví dụ như chuyển đầu đọc tới một khung hình khác.
Hằng (Constant) là các yếu tố không thay đổi. Ví dụ ta có các hằng TAB, EMPTY, và RETURN.
Sự kiện (Event) là các hành động xảy ra khi phim đang chạy. Ví dụ, phim kết thúc, bắt đầu một sprite, đầu đọc đi vào một khung hình, người dùng gõ phím, đều là những sự kiện.
Biểu thức (Expression) là bất cứ phần nào của dòng lệnh mà tạo ra một giá trị. Ví dụ, 2 + 2 là một biểu thức.
Hàm (Function) trả về một giá trị.
Hàm xử lý (Handler) là tập hợp các lệnh Lingo, chạy khi một sự kiện nào xác định xảy ra. Ví dụ, các dòng lệnh sau chứa một hàm xử lý, hàm này được gọi khi chuột được nhấn:
on mouseDown
beep
end
Từ khoá (Keyword) là các từ dành riêng có ý nghĩa đặc biệt.
Danh sách (List) là tập hợp các giá trị dùng để theo dõi và cập nhật dãy dữ liệu.
Thông báo (Message) là những lời gọi do Director gửi đến script khi một sự kiện xác định xảy ra.
Toán tử (Operator) dùng để tính toán tạo ra giá trị mới từ một hay nhiều giá trị cũ.
Thuộc tính (Propertie) là các tính chất để xác định một đối tượng.
Biến (Variable) là các thành phần dùng để lưu trữ và cập nhật giá trị.
Các sự kiện, thông báo và hàm xử lý(handler)
Mọi điều trong Lingo xảy ra như kết quả của một sự kiện. Một số sự kiện là hoạt động của người dùng, mouseUp, keyUp; một số khác là của hệ thống, như timeout. Bảng dưới đây liệt kê các sự kiện chuẩn mà Lingo có thể nhận biết.
Các sự kiện chuẩn của Lingo
Sự kiện
Xảy ra khi
MouseUp
Nhả chuột
MouseDown
Nhấn chuột
MouseEnter
Con trỏ di chuyển đến một sprite
MouseLeave
Con trỏ di chuyển ra khỏi sprite
MouseWithin
Con trỏ nằm trong một sprite
CuePassed
Mỗi khi một điểm nhắc được truyền bởi một âm thanh, video số QuickTime hoặc Xtra mà hỗ trợ các điểm nhắc
BeginSprite
Đầu đọc nhập vào một sprite
EndSprite
Đầu đọc thoát khỏi một sprite
PrepareFrame
Trước khi khung hiện tại được chiếu, các khung đơn nhận message này.
RightMouseUp
Nhả nút chuột phải
RightMouseDown
Nhấn nút chuột phải
KeyUp
Nhả một phím
KeyDown
Nhấn một phím
StartMovie
Bắt đầu phim
StopMovie
Kết thúc một phim
Xảy ra khi thực hiện lệnh quit
Hay lệnh play movie, go movie
ActivateWindow
Người dùng kích vào một phim trong cửa sổ mà hiện tại không được “nổi” (focus), đưa phim đó “nổi”lên
MoveWindow
Người dùng kéo một phim trong cửa sổ
ResizeWindow
định lại kích thước một phim trong cửa sổ
DeactivateWindow
Người dùng kích vào một phim trong cửa sổ hiện tại, làm “chìm” chương trình hiện tại
CloseWindow
Đóng cửa sổ
Lệnh close window
EnterFrame
đầu đọc nhập vào một khung hình
ExitFrame
đầu đọc thoát khỏi một khung hình
Idle
Không xử lý sự kiện nào
TimeOut
Thuộc tính hệ thống timeLapsed >=thuộc tính hệ thống timeoutLength
Khi Director nhận thấy một sự kiện đã xảy ra, nó sẽ một thông báo sự kiện (event message), sau đó tìm trong các script trong phim xem có đoạn mã nào xử lý sự kiện đó không ( tìm hàm handler). Thủ tục Lingo gồm một hoặc nhiều hàm xử lý sự kiện.
Các lệnh Lingo dùng để chỉ cho Director biết những việc cần làm khi thìm thấy một thông báo sự kiện. Ta có thể tạo các sự kiện và các hàm xử lý sự kiện của riêng mình. Các hàm xử lý sự kiện của người dùng có dạng như sau:
On handlerName
Lingo statements
End
Không giống như các hàm xử lý sự kiện được định nghĩa trước ( được dùng để trả lời một sự kiện đã tìm thấy), các hàm xử lý sự kiện người dùng phải được gọi rõ ràng trong thủ tục.
Các loại Lingo script
Director dùng bốn loại script: behavior script, movie script, script cha, và script gắn với thành phần cast. Behavior script, movie scripts, và script cha tất cả đều là những thành phần trong cửa sổ Cast.
Behavior là loại script được gán với sprite hay frame trong Score, được gọi là sprite behavior hay frame behavior. Loại script này chứa các điều khiển xác định xem nó xử lý một thông báo khi nào và ở đâu.
Tất cả các behavior được thêm vào cast xuất hiện trong menu Popup Behavior Inspector. (các loại script không có ở đây).
Ta có thể gắn cùng một behavior vào nhiều vị trí trong Score. Khi soạn thảo một behavior, nó ảnh hưởng đến toàn bộ các vị trí được gán. Movie script đáp ứng các sự kiện như nhấn phím hay click chuột, và có thể kiểm soát các sự kiện khi phim bắt đầu, kết thúc, hay tạm dừng. Các hàm xử lý trong một movie script có thể được gọi từ các script khác khi phim chạy.
Movie script có thể được dùng trong toàn bộ phim, bất kể là phim đang ở khung hình nào, hay người dùng đang tương tác với sprite nào. Movie script sẽ nhận tất cả các thông báo mà chưa được xử lý bởi behavior scipt, hay script của thành phần cast. Movie script là nơi tốt nhất để đặt các hàm xử lý mặc định.
Script chas là script đặc biệt chứa các lệnh Lingo dùng để tạo các đối tượng con(child object). Ta có thể dùng script cha để sinh ra các đối tượng script hoạt động độc lập với nhau. Script cha được dùng để lập trình theo phong cách hướng đối tượng (object-oriented).
Script của thành phần cast được gắn trực tiếp với một thành phần cast, không phụ thuộc vào Score.
Không giống với behavior, movie script, và script cha, script của thành phần trong cast không xuất hiện trong cửa sổ Cast.
._.Các hàm xử lý sự kiện của hệ thống (system handler)
Ngoài các loại script trên, còn có các hàm xử lý của hệ thống. Chúng khác các loại script còn lại các đặc điểm sau:
Các hàm xử lý còn lại không nhận các thông báo trừ khi các thông báo truyền qua tất cả các mức phân cấp cao hơn. Còn các hàm xử lý sự kiện hệ thống sẽ nhận các thông báo trước tất cả các hàm xử lý khác.
Các hàm xử lý sự kiện khác giữ lại mọi sự kiện mà chúng nhận được, không truyền tiếp đi. Còn các hàm xử lý hệ thống thực hiện thông báo nhận được , sau đó tiếp tục gửi nó đến các mức phân cấp khác.
Sau đây là một vài hàm xử lý hệ thống:
MouseUpScript
MouseDownScript
KeyupScript
KeyDownScript
TimeOutScript
Ta có thể đặt lại một hàm xử lý hệ thống từ bất kỳ một script nào bằng cú pháp sau:
Set the eventScript to “code lines
Ví dụ:
the keyDownScript = "if the key = RETURN then go to the frame + 1"
Hay đặt đến một hàm của người dùng
Set the mouseScript to “userhandler”
Có thể vô hiệu hoá hàm xử lý hệ thống bằng câu lệnh
Set the eventScript to EMPTY
Các hàm xử lý sự kiện hệ thống có lợi khi ta cần xử lý sự kiện chung. Nếu không ta phải viết lệnh để xử lý các sự kiện ở tất cả các script khác.
Thứ tự phân cấp các thông báo
Director truyền các thông báo đến các script khác nhau theo môt trật tự xác định. Các thông báo được truyền theo thứ tự sau:
Các hàm xử lý sự kiện của hệ thống ( system handlers)
Các hàm xử lý sự kiện của sprite ( sprite handlers)
Các hàm xử lý sự kiện của thành phần cast (cast member’s scripts)
Các hàm xử lý sự kiện của khung hình (frame handlers)
Các hàm xử lý sự kiện của phim (Movie handlers)
Muốn Director truyền thông báo đến hàm xử lý cần thiết, ta phải đặt nó trong loại script có thể nhận được thông báo đó. Sau đây là bảng gồm các loại thông báo và các script có thể nhận được các thông báo đó:
Kiểu script
Các thông báo nhận được
Sprite script
MouseEnter
MouseLeave
MouseWithin
MouseUp
MouseDown
RightMouseUp
RightMouseDown
KeyUp
KeyDown
BeginSprite
EndSprite
PrepareFrame
Cast member’s script
MouseEnter
MouseLeave
MouseWithin
MouseUp
MouseDown
RightMouseUp
RightMouseDown
KeyUp
KeyDown
Frame script
EnterFrame
ExitFrame
MouseUp
MouseDown
RightMouseUp
RightMouseDown
KeyUp
KeyDown
TimeOut
Movie script
EnterFrame
ExitFrame
MouseUp
MouseDown
RightMouseUp
RightMouseDown
KeyUp
KeyDown
Idle
StartMovie
StopMovie
ActivateWindow
MoveWindow
ResizeWindow
DeactivateWindow
CloseWindow
TimeOut
Truyền các thông báo sự kiện
Thông thường các điều khiển thông báo sprite, cast, frame nhận được thông báo và nó không tiếp tục truyền thông báo đến các mức tiếp theo nữa. Nhưng đôi khi ta muốn các script tiếp theo cũng nhận được thông báo, muốn thế ta dùng lệnh pass. Khi ta thêm lệnh pass vào trong một hàm xử lý sự kiện, thì sau khi sau khi thực hiện các hành động cần thiết, nó sẽ truyền thông báo sự kiện tới các đối tượng khác trong mức khác.
Các hàm xử lý hệ thống luôn truyền đi các thông báo mà nó nhận được. Nếu ta dùng lệnh stopEvent trong hàm xử lý hệ thống, nó sẽ không truyền đi nữa. Ngoài ra ta cũng có thể tự sinh ra một thông báo và truyền nó đi. Ví du ta thêm dòng lệnh MouseDown(script “button”)
Nếu button là tên của một sprite hay cast member script của một nút trên stage, nút sẽ hoạt động như thể là ngườidùng vừa nhấn chuột.
II. Các kiểu biến trong Director
Director dùng các biến để lưu trữ và cập nhật các giá trị của dữ liệu. Một biến có thể thay đổi giá trị của nó khi chạy phim. Bằng cách thay đổi giá trị của một biến khi phim đang chạy ta có thể lưu trữ những giá trị cần quan tâm ví dụ như cất một đường dẫn URL, theo dõi số lần một người tham gia vào một phiên chat, hay kiểm tra xem một hoạt động mạng đã kết thúc chưa.
Các biến có thể là toàn cục hay biến cục bộ. Một biến toàn cục có thể tồn tại và duy trì giá trị của nó khi nào mà phim còn chạy, trong khi đó một biến cục bộ chỉ tồn tại trong một hàm xử lý hay.
Biến cục bộ
Một biến cục bộ chỉ tồn tại trong hãm xử lý có chứa nó đang chạy. Các biến cục bộ được dùng cho các biến tạm thời trong một hàm xử lý. Điều này giúp tránh việc vô ý thay đổi giá trị trong hàm xử lý khác có biến cục bộ cùng tên.
Ta khai báo một biến cục bộ trong một hàm bằng lệnh put hoặc lệnh set:
Set [variable]=[value]
hay
Put [value] into [variable]
Biến toàn cục
Các biến toàn cục có thể được chia sẻ giữa các hàm xử lý và các phim. Một biến toàn cục tồn tại và duy trì giá trị của nó khi phim chạy hay đến khi bạn dùng lệnh clearGlobasl để xoá.
Nếu một hàm xử lý khai báo một biến là toàn cục thì có thể dùng giá trị hiện tại của biến đó. Nếu hàm này thay đổi giá trị của biến thì giá trị mới sẽ có tác dụng đối với các hàm còn lại có sử dụng nó. Khai báo biến toàn cục như sau:
Global gbvarName
Ta có thể khai báo biến toàn cục bên trong hay bên ngoài một hàm. Khi khai báo biến toàn cục, ta không phải khởi tạo cho nó, Director sẽ gán cho nó một giá trị là .
Bởi vì ta muốn dùng biến cục bộ trong suốt một bộ phim, tốt nhất là nên khai báo chúng trong hàm xử lý prepareMovie , đảm bảo rằng chúng sẽ tồn tại ngay khi phim bắt đầu.
Các dòng lệnh sau đây khai báo biến toàn cục gName và gán nó giá trị là Mary:
global gName
gName = "Mary"
Nếu một biến toàn cục được khai báo bên trong một hàm xử lý và ta muốn sử dụng nó ở một hàm khác, ta phải khai báo lại biến toàn cục đó, nếu không Director sẽ xem nó là một biến cục bộ trùng tên với biến toàn cục. Còn nếu biến toàn cục được khai báo ở trong một MovieScript, bên ngoài tất cả các hàm, thì các hàm không phải khai báo lại biến toàn cục.
Kiểu danh sách
Danh sách là một kiểu dữ liệu giúp ta dễ dàng theo dõi và cập nhật một dãy dữ liệu. Ví dụ, nếu muốn lưu trữ nhiều tên hay số trong một dự án Director, ta có thể lưu trong một danh sách. Toán tử ([ ]) dùng để biểu diễn một danh sách.
Có hai loại danh sách trong Lingo: danh sách tuyến tính và danh sách thuộc tính.
Trong một danh sách tuyến tính, mỗi một thành phần là một giá trị đơn. Ví dụ, danh sách dưới đây là một tập đơn giản các số:
[100, 150, 300, 350]
Trong một danh sách thuộc tính, mỗi một thành phần chứa hai giá trị cách nhau bởi một dấu “:”. Một thành phần là tên thuộc tính, luôn luôn có dấu thăng (#) đi trước; thành phần kia là giá trị gắn với thuộc tính đó. Ví dụ, những lệnh sau đây sẽ đặt biến myList thành một danh sách thuộc tính chứa các giá trị của các thuộc tính là #speed, #direction,và #weight. Đây có thể là tính chất của một thiên thể.
myList = [#speed: 155, #direction: 237, #weight: 8746]
Các thuộc tính có thể xuất hiện nhiều lần trong một danh sách.
Cả hai loại danh sách có thể là danh sách rông, không chứa giá trị nào cả. Một danh sách tuyến tính chứa hai dấu móc vuông ([ ]). Một danh sách thuộc tính rỗng chứa hai dấu móc vuông và một dấu hai chấm ở giữa ([:]).
Thao tác trên danh sách:
Lưu trữ và truy nhập danh sách
Danh sách tuyến tính (linear list)
Để đặt một giá trị vào một danh sách tuyến tính:
Dùng toán tử “=”. (Có thể dùng lệnh setAt như trong các phiên bản Director trước)
Ví dụ, dòng lệnh workerList[2] = "Tiffany" đặt giá trị phần tử thứ hai của danh sách là Tiffany.
Để truy nhập một giá trị trong một danh sách tuyến tính:
Dùng biến danh sách và chỉ số trỏ vào phần tử trong danh sách. (Còn có thể dùng lệnh getAt hay getaProp)
Ví dụ, trong một danh sách tuyến tính tên là workerList, ta đặt các giá trị:
set workerList = ["Bruno ", "Heather ", "Carlos "],
thì biểu thức workerList[2] sẽ lấy giá trị của phần tử thứ hai trong workerList, giá trị là Heather.
Danh sách thuộc tính (property list)
Đối với danh sách thuộc tính thì có hai kiểu cú pháp có thể dùng để thao tác. Kiểu thứ nhất là dùng dấu [] và tên của thuộc tính. Kiểu thứ hai là dùng dấu chấm (.). Giả sử ta có một danh sách
list foodList = [#breakfast:"Waffles", #lunch:"Tofu Burger", #dinner:"Hungarian Goulash"]
Có thể dùng một vài lệnh như dưới đây để thao tác
foodList[#Bruno] = "sushi" (vào thuộc tính Bruno có giá trị “sushi”)
hay
foodList.Bruno = "sushi"
Kiểm tra các đặc điểm của một danh sách:
Ta có thể xác định các đặc điểm của một danh sách và số phần tử của nó bằng cách sử dụng các lệnh sau:
Đếm số phần tử dùng hàm count().
Xác định kiểu của danh sách, dùng hàm ilk().
Lấy giá trị lớn nhất hay nhỏ nhất, dùng hàm max() hay min()
Xác định vị trí của một thuộc tính dùng các hàm findPos, findPosNear, or getOne.
Copy các danh sách
Gán một danh sách vào một biến và sau đó lại gán biến đó cho một biến khác không tạo ra một bản copy riêng biệt và khác với danh sách ban đầu. Hai biến đó thực chất chỉ trỏ vào cùng một danh sách mà thôi.
Để tạo ra một bản copy đúng nghĩa, độc lập với danh sách gốc, ta dùng hàm duplicate().
Các dòng lệnh sau tạo ra một danh sách và sau đó lại tạo ra một bản copy của nó:
oldList = ["a", "b", "c"]
newList = duplicate(oldList)
Sau đó thì nếu ta có thay đổi một trong newList hay oldList danh sách kia không bị ảnh hưởng.
Sắp xếp danh sách:
Có thể sắp xếp một danh sách trong đó các phần tử được xếp theo trình tự abc , số đứng trước xâu. Xâu được xếp tuỳ vào ký tự đầu tiên, bất kể nó dài bao nhiêu.
Lingo sắp xếp một danh sách tuyến tính theo các giá trị trong đó, còn với danh sách thuộc tính thì theo thuộc tính. Dùng lệnh sort để sắp xếp.
Tạo mảng nhiều chiều
Mỗi phần tử của một danh sách lại chứa các danh sách con khác. Theo kiểu này ta có thể tạo ra mảng nhiều chiều bằng danh sách.
Giả sử ta cần tạo một mảng hai chiều tên là twoDimensionList, mỗi phần tử của danh sách này lại là một danh sách. Đoạn chương trình sau sẽ tạo một mảng hai chiều với giá trị các phần tử là #none.
Set twoDimensionList=[]
Repeat with row=1 to 10
Set aRow=[]
Repeat with column=1 to 10
SetAt (aRow,column,#none)
End repeat
SetAt ( twoDimensionList, Row, aRow)
End repeat
Kiểu số nguyên (integer)
Director xử lý số nguyên trong khoảng 2,147,483,648 đến +2,147,483,647. ( Ngoài khoảng này nên dùng số thập phân, hay còn gọi là dấu phẩy động).
Ta có thể chuyển đổi một số thập phân thành số nguyên nhờ hàm integer(). Ví dụ, lệnh set theNumber = integer(3.9) làm tròn số thập phân 3.9 thành 4.
Kiểu số thập phân
Một số thập phân, hay còn gọi là số dấu phẩy động, là một số có chứa dấu chấm thập phân. Ta có thể dùng kiểu ký hiệu số mũ với số thập phân: ví dụ,
-1.1234e-100 or 123.4e+9
Để chuyển một giá trị nguyên thành thập phân ta dùng hàm float().
Kiểu biểu tượng
Kiểu biểu tượng là một kiểu dữ liệu đặc biệt, khác với ngôn ngữ khác. Một kiểu biểu tượng luôn bắt đầu bằng dấu thăng (#).
Kiểu biểu tượng là hằng do ngườidùng định nghĩa. Các phép so sánh có thể được thực hiện rất nhanh khi dùng kiểu này.
Ví dụ, dòng lệnh
userLevel = #novice
chạy nhanh hơn dòng lệnh
userLevel = "novice"
Biểu tượng không thể chứa dấu cách hay dấu chấm.
Chuyển một xâu thành biểu tượng ta dùng hàm symbol(). Còn chuyển ngược từ
kiểu biểu tượng thành xâu ta lại dùng hàm string().
III. Dùng các Xtras để mở rộng chức năng của Director
Xtras là những thành phần phần mềm mở rộng các chức năng của Director; một vài Xtras được cài đặt cùng với Director còn lại được các nhà sản xuất trung gian phát triển. Xtras cung cấp các khả năng như nối với Internet, thao tác trên file, thao tác với cơ sở dữ liệu..v.v. Dùng ngôn ngữ lập trình C ta có thể tạo ra được Xtras của riêng mình.
Các kiểu Xtras
Director hỗ trợ năm loại Xtras: cast member Xtras, importing Xtras, scripting Xtras, transition Xtras, và tool Xtras.
Cast member Xtras cung cấp kiểu thành phần cast mới dùng trong Director. Chúng điều khiển nhiều kiểu đối tượng được dùng như là thành phần cast.
Một vài thành phần cast được xây dựng ngay trong Director, như là Shockwave Flash, Vector Shape, và Animated GIF, chúng là các Xtras. Xtras cung cấp bởi các nhà trung gian bao gồm cơ sở dữ liệu, xử lý ảnh 3D, các kiểu đồ hoạ đặc biệt…. Cast member Xtras có sẵn trong Director xuất hiện trong menu Insert > Media Element . Một vài cast member Xtras không xuất hiện trong menu này nhưng có thể sử dụng chúng bằng lệnh Lingo.
Importing Xtras cung cấp mã lệnh cần thiết để nhập vào (import) các loại phương tiện (media) vào Director. Khi trỏ một phim tới một file ngoài,Director dùng importing Xtra để nhập file mỗi lúc phim chạy.
Scripting Xtras thêm các thành phần vào các Lingo script đã được viết trước đó. Ví dụ, NetLingo Xtra cung cấp các thành phần đặc biệt để điều khiển các hàm dùng cho Internet.
Transition Xtras cho phép tạo các hiệu ứng chuyển đổi đặc biệt giữa các frame.
Tool Xtras cung cấp các chức năng trong môi trường tạo sản phẩm, nhưng chúng không làm gì cả khi phim chạy. Không cần phải kèm chúng theo khi phân phối sản phẩm.
Lưu trữ trong các file ngoài dùng FileIOXtra
Đối với các dữ liệu vừa và nhỏ, việc sử dụng các trường trong phim Director để lưu trữ là cách làm khá tối ưu. Tuy nhiên, đối với các ứng dụng tương đối lớn, mặc dù có thể cắt dữ liệu thành nhiều trường nhưng việc lưu trữ một lượng lớn dữ liệu là một điều không thực tế. Dữ liệu lưu trữ trong các phim sẽ làm tăng kích thước file phim và dung lượng bộ nhớ cần thiết khi nạp chương trình. Ngoài ra , việc lưu trữ dữ liệu bên trong phim cũng làm cho chúg không thể truy nhập được từ bên ngoài. Trong trường hợp này, tốt nhất là ta nên lưu trữ dữ liệu vào các file ngoài và khi cần ta có thể khôi phục một bản ghi dữ liệu từ file để xử lý.
Director cung cấp cho ta hai phương tiện để đọc và ghi các file dạng text, đó là thư viện FileIO Xobject và thư viện FileIO Xtra.
FileIO Xtra nằm trong thư mục Xtras. Các fileIO Xtra làm việc khác với Xobject. Xobject chỉ cho phép đọc hoặc ghi vào một file. Để thêm vào một file, ta dùng chế độ append. Chế độ append sẽ đặt file được thêm vào cuối file đã mở. Còn Xtra cung cấp đồng thời cả chế độ đọc và ghi. Chế độ append bị bỏ đi. Ta sẽ dùng phương thức setPosition để ghi vào một vị trí xác định trong file. Ta có thể dùng getLength để chuyển đến cuối file hiện tại.
Ta mở một file bằng cách tạo ra một thể hiện mới của FileIO Xtra bằng lệnh new và gán nó cho một biến. Ta có thể mở nhiều file. Đoạn mã sau sẽ mở một file đang tồn tại
on readFile
filePath = the moviePath & "demoSaveFile"
--tạo ra một instance của fileIO Xtra
fileIOInstance = xtra("FileIO").new()
-- error trap for missing file Xtra
if not fileIOInstance.objectP then
alert "File IO Xtra missing"
exit
end if
-- mở file để đọc
fileIOInstance.openFile(filePath, 0)
--trạng thái được trả về bởi fileIO Xtra báo trạng thái của lênh FileIO
if fileIOInstance.status() = 0 then
-- mở file và đọc thành công
fileText = fileIOInstance.readFile()
fileIOInstance.closeFile()
-- cho nội dung file vào field
member("file contents").text = fileText
else
-- Nếu có lỗi
member("file contents").text = "Error: " & fileIOInstance.error(fileIOInstance.status())
end if
end
Chương 3: Lập trình hướng đối tượng bằng Lingo
Director cho phép ta lập trình theo kiểu hướng đối tượng như trong các ngôn ngữ khác, tạo thuận lợi để phát triển một ứng dụng.. Ta có thể dùng script cha để tạo các đối tượng script mà có thể hoạt động như là các đối tượng độc lập.
Lingo có thể tạo nhiều bản copy hay instance (thực thể) của một script cha. Mỗi instance của một script cha được gọi là một đối tượng con (đối tượng con). Ta có thể tạo các đối tượng con theo nhu cầu khi phim chạy. Director không giới hạn số đối tượng con có thể tạo ra từ cùng một script cha. Ta có thể tạo nhiều đối tượng con tuỳ theo dung lượng bộ nhớ.
Chương này trình bày cơ bản về cách viết script cha , tạo và sử dụng các đối tượng con.
I. So sánh với các ngôn ngữ hướng đối tượng khác
Nếu đã quen với một ngôn ngữ lập trình hướng đối tượng khác như là Java hay C++, ta có thể dễ dàng hiểu được các khái niệm về script cha . Những thuật ngữ mà Director dùng để mô tả script cha và đối tượng con tương ứng các thuật ngữ trong lập trình hướng đối tượng:
Script cha tương ứng với class (lớp)
đối tượng con tương ứng với instance (thực thể)
Property variable tương ứng với instance variable hay member variable (biến thành phần)
Handler tương ứng với method (phương thức)
Ancestor script tương ứng với the Super class hay base class (lớp gốc)
II. Cơ bản về Script cha và đối tượng con (child object)
Một script cha là một tập các hàm xử lý và thuộc tính được dùng để xác định một đối tượng con; chính nó không phải là một đối tượng con. Một đối tượng con là một thể hiện đầy đủ và độc lập của script cha. Các đối tượng con của cùng một script cha có các hàm xử lý và các thuộc tính tương tự nhau, vì vậy các đối tượng con trong cùng một nhóm trả lời các sự kiện và thông báo tương tự nhau.
Thông thường, script cha được dùng để xây dựng các đối tượng con. Những đối tượng con này khi phim đòi hỏi cùng một cơ chế xử lý được chạy đồng thời nhưng khác nhau về tham số.
Bởi vì tất cả đối tượng con của cùng một script cha có các hàm xử lý giống nhau, những đối tượng con đáp ứng các sự kiện theo cách tương tự nhau. Tuy nhiên, bởi vì mỗi đối tượng con chứa các giá trị độc lập cho các thuộc tính khai báo trong script cha, nên mỗi đối tượng con có thể hoạt động khác nhau.
Lấy ví dụ,, ta có thể tạo một script cha trong đó mô tả các text field có thể soạn thảo được với các thuộc tính như màu, chữ… Bằng cách thay đổi các giá trị của các thuộc tính trong các đối tượng con cụ thể, ta có thể thay đổi các đặc điểm của chúng trong khi phim đang chạy mà không ảnh hưởng đến nhau.
Sự khác nhau giữa đối tượng con (child object) và behavior (hành vi)
Mặc dù đối tượng con và behavior tương tự nhau vì chúng có thể có nhiều thể hiện, chúng cũng có nhiều điểm khác biệt. Sự khác biệt lớn nhất giữa đối tượng con và behavior là behavior được gán với sprite. Các đối tượng behavior được tự động tạo ra khi sprite được tạo ra. Ngược lại, đối tượng con phải được tạo ra một cách tường minh bởi một hàm xử lý.
Behavior và đối tượng con khác nhau ở cách chúng được gán với sprite. Director tự động gán một behavior với một sprite, nhưng ta phải gán một đối tượng con bằng lệnh Lingo.
Viết một script cha
Một script cha chứa các lệnh Lingo cần thiết để tạo các đối tượng con và xác định các hành động và thuộc tính cho chúng. Trước hết ta cần xác định xem các đối tượng con sẽ hành động như thế nào. Sau đó ta có thể viết một script cha để thể hiện. Trong script cha, khai báo các biến và các thuộc tính, sau đó khởi tạo chúng trong hàm on new. Viết thêm các hàm xử lý để điều khiển các hành động của các đối tượng con.
Dùng biến me
Thông thương, một script cha tạo ra nhiều đối tượng con, và mỗi đối tượng con có hơn một hàm xử lý. Thuật ngữ me là một biến tham số đặc biệt. Nó luôn phải là tham số đầu tiên được khai báo trong mỗi hàm xử lý trong một script cha.
Biến me báo cho các hàm xử lý trong đối tượng con rằng chúng chỉ thao tác trên những thuộc tính của nó chứ không phải là của đối tượng khác. Theo cách này, khi một hàm xử lý trong một đối tượng con tham chiếu đến các thuộc tính, thì sẽ dùng các giá trị của thuộc tính bên trong chính nó.
Tạo một đối tượng con
Đối tượng con tồn tại hoàn toàn trong RAM; chúng không được lưu lại cùng với phim. Chỉ có script cha và ancestor script tồn tại trên đĩa.
Để tạo một đối tượng con mới, ta dùng hàm new và gắn đối tượng con với một tên biến hay vị trí trong một list để có thể truy nhập đến sau này.
Để tạo ra một đối tượng con và gán với một biến, dùng cú pháp:
set variableName = new(script "scriptName", argument1,
, argument2, argument3...)
trong đó scriptName là tên của script cha và argument1, argument2, argument3... là các tham số ta truyền cho đối tượng con bằng hàm on new .
hàm new() tạo một đối tượng con mà lớp cơ sở của nó là scriptName. Sau đó nó gọi hàm on new trong đối tượng con với các tham số xác định.
Ta có thể gọi một hàm tạo mới ở bất kỳ đâu trong một phim. Có thể đặt các giá trị ban đầu của đối tượng con bằng cách thay đổi các tham số đầu vào trong hàm new().
Mỗi đối tượng con chỉ yêu cầu đủ bộ nhớ để lưu các giá trị hiện tại của các thuộc tính của nó và tham chiếu đến script cha. Bởi vì thế, trong hầu hết các trường hợp, ta có thể tạo ra và duy trì bao nhiêu đối tượng con tuỳ thích.
Muốn tạo đối tượng con mà không phải khởi tạo các giá trị thuộc tính, dùng hàm rawNew(). Hàm rawNew() thực hiện mà không gọi hàm on new. Trong trường hợp khi mà cần nhiều đối tượng con, rawNew() cho phép ta tạo các đối tượng trước và chỉ gán các giá trị khi cần dùng đến.
Câu lệnh dưới đây tạo ra một đối tượng con từ script cha Car mà không khởi tạo các giá trị thuộc tính và gán vào biến car1:
car1 = script("Car").rawNew()
Để khởi tạo các thuộc tính đối tượng con, gọi hàm on new :
car1.new
Kiểm tra các thuộc tính của đối tượng con
Ta có thể kiểm tra giá trị của thuộc tính trong đối tượng con bằng cách sử dụng cú pháp: objectName.PropertyName. Ví dụ, dòng lệnh sau gán vào một biến x giá trị của thuộc tính carSpeed của đối tượng con được gán vào biến car1:
x = car1.carSpeed
Gọi các thuộc tính của đối tượng từ bên ngoài có thể có ích khi cần thông tin về một nhóm các đối tượng, như là tốc độ trung bình của tất cả các xe trong một cuộc đua. Ta cũng có thể dùng các thuộc tính của một đối tượng để xác định hành vi của đối tượng khác phụ thuộc vào nó.
Ngoài ra có thể kiểm tra xem một đối tượng con chứa một hàm cụ thể nào đó hay kiểm tra xem nó xuất phát từ script cha nào. Điều này có ích ta có nhiều đối tượng xuất phát từ nhiều script cha tương tự nhau nhưng có vài điểm khác biệt nhỏ.
Ví dụ, ta muốn tạo một kịch bản trong đó một một trong vài script cha có thể được dùng để tạo một đối tượng con. Ta có thể xác định xem một đối tượng con được tạo ra từ script cha nào bằng hàm script(), hàm này trả lại tên script cha.
Câu lệnh sau kiểm tra xem có phải đối tượng car1 được tạo ra từ script cha Car:
if car1.script = script("Car") then
beep
end if
Ta cũng có thể lấy một danh sách các hàm xử lý trong một đối tượng con bằng cách dùng hàm handlers(), hay kiểm tra xem một hàm xử lý tồn tại trong một đối tượng đối tượng con bằng hàm handler().
Các lệnh sau gán một danh sách các hàm xử lý đối tượng con car1 vào biến myHandlerList:
myHandlerList = car1.handlers()
Danh sách có dạng như sau:
[#start, #accelerate, #stop]
Còn các lệnh sau lại dùng hàm handler() để kiểm tra xem có hàm xử lý on accelerate trong đối tượng con car1:
if car1.handler(#accelerate) then
put "The child object car1 contains the handler named “
on accelerate."
end if
Phần II: Công nghệ shockwave trên internet
Chương 4 : Dịch vụ thông tin World Wide Web
Trong thời gian gần đây, một trong những dịch vụ hấp dẫn và được quan tâm nhiều nhất trên Internet chính là World Wide Web. Đây là dịch vụ thông tin mới ra đời nhưng lại phát triển nhanh nhất, tạo nên một tiềm năng to lớn trong việc phổ biến thông tin toàn cầu, góp phần thúc đẩy xã hội loài người bước vào kỷ nguyên mới của khoa học kỹ thuật, kỷ nguyên của Công nghệ thông tin. Trong chương này, tôi xin được trình bày những đặc điểm khiến cho World Wide Web đã trở nên quan trọng đến như vậy.
I. Nguồn gốc ra đời của World Wide Web
World Wide Web ra đời từ một dự án nghiên cứu phát triển tại phòng thí nghiệm vật lý hạt nhân châu Âu vào năm 1989. Nhóm nghiên cứu do Tim Berners-Lee và Robert Calliau đứng đầu, đã phát triển và đưa ra một giao thức truyền và nhận các tệp siêu văn bản (Hypertext) theo mô hình Client/Server, gọi tắt là HTTP (HyperText Transfer Protocol) để phục vụ cho việc trao đổi thông tin trên Internet. Sau đó nhóm phát triển đã công bô rộng rãi thư viện chương trình nguồn của giao thức này cho các nhà phát triển và các tổ chức nghiên cứu Internet để họ phát triển các phần mềm Web Client nhằm hiểu được và hiển thị các tệp Hypertext. Kể từ đó, thuật ngữ World Wide Web hay gọi gọn hơn là Web đã ra đời và được công nhận rộng rãi trên Internet như là một từ chỉ tới một dịch vụ phát triển mạnh mẽ nhất và hấp dẫn nhất. Các tổ chức và các công ty sử dụng Internet đã thành lập nên một uỷ ban (W3 Consortium) để đưa các tiêu chuẩn cho World Wide Web và chuẩn hoá các cấp độ (Levels) cho ngôn ngữ HTML.
Như vậy, World Wide Web được định nghĩa như là một dịch vụ thông tin toàn cầu nhằm cung cấp các tư liệu thông tin đa phương tiện thông qua một giao thức mức cao được gọi là HTTP. Các tài liệu trên World Wide Web được viết bởi ngôn ngữ HTML. Sau khi các tài liệu được chuyển tới Client, các phần mềm Web Browser sẽ diễn dịch lại tài liệu này và trình bày các thông tin dưới nhiều dạng khác nhau như văn bản, hình ảnh, âm thanh, phim số hoá...
II. Kiến trúc của World Wide Web
World Wide Web được xây dựng theo mô hình Client/Server, tức là người ta sẽ thiết lập một máy phục vụ cho việc lưu giữ các tài liệu Hypertext gọi là Web Server. Phía người sử dụng, có một máy tính cùng với các phần mềm có khả năng hiểu được các tài liệu HTML và giao tiếp được với máy Server gọi là Web Client hoặc Web Bowser. Khi người sử dụng yêu cầu một tài liệu nào đó, thì Web Server se phục vụ cho Web Bowser tài liệu đó và Web Bowser sẽ hiển thị nó lên màn hình với các khuôn dạng thích hợp.
Dưới đây là mô hình Client/ Server của World Wide Web:
HTTP
HTTP
Yêu cầu thông tin của Client được gửi lên Internet
Internet và WWW là một mạng máy tính để chuyển dữ liệu giữa các máy tính với nhau
Server HTTP nhận yêu cầu, xử lý nó và gửi kết quả về cho Client thông qua Internet
Mô hình Client/Server của WWW
Web Server
Một Web Server là một phần mềm được sử dụng ở máy phục vụ, nó luôn "lắng nghe" những yêu cầu của người sử dụng từ một cổng truyền thông TCP/IP nào đó (ngầm định là cổng 80). Khi phía máy khách yêu cầu một trang Web, máy Server sẽ tìm trong tài nguyên của mình xem có đáp ứng được đòi hỏi đó không, nếu có thể nó sẽ gửi trả kết quả về phía Client, các kết quả trả về thường là các trang HTML chứa văn bản thuần tuý hoặc là các dạng dữ liệu đa phương tiện như các tệp hình ảnh, âm thanh...
Web Browser
Web Browser là một phần mềm được dùngở phía người sử dụng, nhiệm vụ của nó là khởi tạo các con trỏ địa chỉ URL (sẽ được giải thích ở phần tiếp theo) để gửi tới cho Wen Server. Web Browser sẽ diễn dịch nội dung dưới ngôn ngữ HTML và trình bày chúng cho người sử dụng dưới nhiều hình thức phong phú. Hiện nay, các Web Browser chủ yếu dùng giao diện đồ hoạ với người dùng để trình bày tài liệu một các hấp dẫn hơn.
Ngoài các chức năng như trên, ta còn có thể thực hiện nhiều thao tác thông thường khác như là lưu tệp tin lên đĩa; sử dụng E-mail; hoặc sử dụng để biên soạn một tài liệu HTML nguồn (Web Editor).
Gopher Server
Web Server
Gopher Server
Gateway
Các Server khác
Web Browser
HTTP
Gopher
FTP
Chức năng của Web Browser
Khái niệm HTTP
Các Web Server và Web Browser giao tiếp với nhau thông qua một giao thức gọi là giao thức truyền siêu văn bản (HyperText Transfer Protocol), và gọi tắt là giao thức HTTP.
Khi Client gửi một yêu cầu về phía Web Server thì giữa Client và Server sẽ hình thành một đường kết nối logic dựa trên giao thức HTTP. Khi kết thúc quá trình trao đổi giữa Web Server và Web Browser (khi Web Server đã phục vụ xong yêu cầu của Web Browser) thì sự kết nối này sẽ chấm dứt. Như vậy, mối liên hệ giữa Client và Server chỉ được thiết lập và tồn tại trong quá trình trao đổi với nhau. Điều này có một lợi điểm rất lớn là giảm được sự lưu thông trên hệ thống mạng.
Khi dữ liệu được truyền từ Web Server về phía Client thì giao thức HTTP sẽ thêm vào phần đầu đề của khối dữ liệu một thông tin header tuân theo tiêu chuẩn MIME (Multipurpose Internet Mail Extension) để phục vụ cho việc trao đổi thông tin một cách đa dạng. Những tài liệu HTML sẽ có phần đầu đề theo dạng "Text/Html", các dạng dữ liệu khác có phần đầu đề riêng của mình; ví dụ như văn bản thuần tuý có phần đầu đề là "text/plain", tệp ảnh GIF sẽ có phần đầu đề là "Image/Gif"... Khi Client gửi một yêu cầu tới Web Server, nó sẽ gửi theo một danh sách tất các các dạng MIME mà nó có thể hiểu được, dựa vào đó mà Web Server chỉ phục vụ những dữ liệu mà Client đó có khả năng hỗ trợ. Khi nhận được tài liệu, trình Browser sẽ dựa vào mô tả MIME cuẩ tài liệu đó để có cách trình bày thích hợp.
Khái niệm HTML
HTML được viết tắt từ cụm từ HyperText Markup Language, tạm dịch là "ngôn ngữ đánh dấu siêu văn bản", dùng để xây dựng nên các trang Web. Các tài liệu HTML cho phép ta mô tả về cấu trúc cũng như định dạng của một tài liệu, tạo ra sự tích hợp giữa các dạng thông tin khác nhau như hình ảnh; âm thanh, phim số hoá... vào trong một tệp tin đơn giản. Nó cho phép ta mô tả các URL để tạo ra liên kết tới các dịch vụ khác nhau trên Internet. Đây là công cụ rất mạnh để xây dựng các ứng dụng và tích hợp thông tin trên mạng Internet.
III. Tích hợp các dịch vụ thông tin trong WWW
Một trong những mục đích thiết kế chính của World Wide Web (Web) là khả năng hỗ trợ được các giao thức hiện thời của các ứng dụng sẵn có trên Internet. Chính vì vậy mà Web có thể hiểu được và hỗ trợ rất nhiều các dịch vụ sẵn có trên Internet như FTP, Gopher, E-mail... Điều này làm cho World Wide Web được chấp nhận và sử dụng rộng rãi.
World Wide Web và Gopher
Web có khả năng hỗ trợ mọi đặc điểm của Gopher, bao gồm khả năng hiển thị một menu Gopher, trình bày nội dung của Gopher Server. Ngoài ra, Web còn có khả năng xử lý các yêu cầu của dịch vụ Gopher và hiển thị lên trên các Browser tương tự như các Gopher Client thông thường khác. Người dùng có thể chọn một đề mục trên menu, và Web Server sẽ hiển thị các thông tin tương ứng cho đề mục ấy...
Để truy nhập tới Gopher ta có thể tạo ra một URL với cú pháp như sau:
Dịch vụ
Địa chỉ
Cổng giao tiếp
Đường dẫn
Gopher://
www.ac.vn
:70
/path/dataname
Tên của dịch vụ Gopher
Địa chỉ IP hoặc tên của máy Server
Cổng giao tiếp với Gopher, ngầm định là cổng 70
Chỉ đến thư mục chứa thông tin của Gopher Server
World Wide Web và FTP
Hầu hết các Web Browser đều tích hợp khả năng truyền tệp vào trong chương trình của mình (có nghĩa là không cần thêm chương trình ngoài). Khi người sử dụng truy nhập FTP ở trong Web thì Web Client sẽ hiển thị một cây thư mục tương tự như trên các FTP Client thông thường khác. Người sử dụng có thể dạo qua các cây thư mục này và lấy các tệp từ cây ._.
Các file đính kèm theo tài liệu này:
- DAN307.doc