lõi ngôn ngữ trung gian của ActionScript.

Size: px
Start display at page:

Download "lõi ngôn ngữ trung gian của ActionScript."

Transcription

1 LỜI NÓI ĐẦU Khi quyết định nếu cuốn sách trong tay bạn sẽ là tài nguyên tốt cho thư viện của bạn. Nó có thể giúp bạn biết tại sao chúng tôi, những tác giả đã viết ra cuốn sách đặc biệt này. Chúng tôi là hai lập trình viên sử dụng Flash trong toàn bộ mọi ngày làm việc của chúng tôi, nhưng chúng tôi cũng là những giáo viên. Kết hợp, chúng tôi đã dạy hàng nghìn sinh viên ở nhiều trường đại học, dễ dàng quá trình đào tạo, các hội nghị, và lúc đó chúng tôi đã chia sẻ một số king nghiệm quan trọng. Chúng tôi đã nhất quán nói rằng nhiều đặc trưng cuốn sách ActionScript phù hợp với nhóm người bắt đầu. Trước tiên chúng tôi đã rất ngạc nhiên thực sự đã vượt quá quan điểm, nhưng sau đó chúng tôi đã nhận thức rõ rằng chúng tôi không đủ thông tin để tạo thành các đánh giá. Chúng tôi không sử dụng tài nguyên người mới bắt đầu trong công việc của chúng tôi và chỉ có chương trình giảng dạy cá nhân để dựa vào. Nên, chúng tôi bắt đầu nghiên cứu làm thế nào chúng tôi có thể lấp đầy sự thiếu hụt này và cung cấp một cuốn sách cho sinh viên của chúng tôi để thực sự giúp họ bên ngoài lớp học. Chúng tôi đã nói với rất nhiều sinh viên, các nhóm người sử dụng, và những người dạy và đã bắt đầu phác thảo ra một cuốn sách mà chúng tôi nghĩ đưa ra những gì chúng tôi đã học được trong thực tiễn. Khi ActionScript 3.0 được phát hành, nhóm số người quan tâm tăng đột ngột. Một loạt các phản ứng từ tình trạng bị kích động đến kính sợ, như việc học ActionScript 3.0 bẻ cong đi sẽ trở nên dễ dàng. Nói về Platform Flash tách mảnh thành Flex ( người phát triển ) và Flash ( Người thiết kế ) gây cho nhiều người thiết kế và người mới lập trình không rõ ràng cho đến bây giờ về tương lai của chúng. Khi Flash CS3 Professional vừa được phát hành, nhu cầu cần cho tài nguyên hướng dẫn không được giải quyết (và trong nhiều trường hợp, còn tăng thêm), và chúng tôi đã biết nó là thời gian để phát triển cuốn sách mà bạn đang nắm giữ. Chúng tôi hy vọng cuốn sách này sẽ giúp những người dùng Flash từ những người muốn tìm hiểu đến những người hoảng sợ, từ nhưng người đang háo hức tới nhưng người đã có kinh nghiệm nắm lấy khả năng và hiệu xuất của ActionScript 3.0. Chúng tôi hy vọng những trang này sẽ làm giảm đi sự chuyển sang từ mọi thứ ở phiên bản trước đó, bất cứ thứ gì, ActionScript phải được sử dụng, cái lớn nhất trong cấu trúc là thay đổi từ ngôn ngữ khi bắt đầu chính nó. Cuốn sách này được hướng vào những người thiết kế và phát triển Flash với ActionScript trong thời gian đầu, cũng như người mới lập trình có thể tìm thấy sự nhạy bén để hiểu biết ActionScript 3.0. Mặc dù chúng tôi cảm thấy bìa cuốn sách khá là cơ bản, cả sự hiểu biết về giao diện Flash và số lượng nhỏ của kinh nghiệm viết kịch bản nắm được. Chúng tôi tin rằng chúng tôi đã giải thích rõ ràng trong tài liệu này và đủ ngắn gọn để người đọc bắt đầu, nên nếu bạn là người mới bước vào lập trình, chúng tôi chào mừng bạn! Tuy nhiên, nếu bạn có một chút trọng yếu, chúng tôi khuyên bạn nên lướt qua chương 2 để xem nếu bạn nghĩ rằng chúng tôi đã cung cấp đủ quy tắc cốt lõi lập trình để lấp đầy lỗ trống trong sự hiểu biết của bạn, nhưng hai chương đầu cung cấp cở sở để cho xây dựng những chương khác. Cũng vậy, nếu bạn là lập trình viên tương đối có kinh nghiệm với ActionScript 2.0, có thể bạn muốn nhìn qua một vài chương thích thú trước khi quyết định dù cuốn sách này là dành

2 cho bạn hay không. Chúng tôi làm nổi bật vấn đề chuyển từ ActionScript 2.0 sang ActionScript 3.0, nhưng muốn bạn vui vẻ với đặc điểm và không gặp khó khăn với phương pháp chúng tôi đã thông qua trước khi bạn quyết định tin dùng cuốn sách này. Chúng tôi cố gắng để dạy các nguyên tắc cơ bản sau mỗi chương trong một mẫu, số chương, và tổng số trang đã phân loại dễ dàng. Trong nhiều trường hợp, cần một khoảng thời gian để đọc xuyên xuốt 2 phần tiếp theo mới chắc chắn rằng đây là những điều mà cuốn sách mang lại cho bạn. Không giống như các cuốn sách ActionScript 3.0 khác mà chúng tôi đã từng xem, cuốn sách này không dựa nhiều trên nguyên tắc lập trình hướng đối tượng. Nếu bạn không quen với sự hạn chế này, đừng lo lắng. Bạn có cuốn sách thích hợp trong tay bạn và bạn sẽ học thêm với lần lượt mỗi chương. Chúng tôi biểu thị khái niệm bao chùm lên chương sử dụng tập trung cú pháp có thể thực hiện được trong timeline, và dần dần đưa vào khái niệm OPP cùng với phương pháp đó. Năm chương đầu tiên bao gồm đưa ra các event mới trong ActionScript 3.0 và cách thức hiển thị nội dung (the display list) không đưa thêm vào số lượng ít các nội dùng đó là lớp hay liên quan đến hướng đối tượng. Bắt đầu trong chương 6, chúng tôi cung cấp thêm đưa ra sự hướng đối tượng, bắt đầu với lập trình hướng đối tượng cơ bản, và tiếp tục chín chương còn lại với việc lựa chọn lớp hay lập trình hướng đối tượng áp dụng cho các ví dụ. Nếu bạn đã hứng thú trong chính bạn với các ví dụ về lập trình hướng đối tượng từ giai đoạn đầu, toàn bộ các ví dụ trong các chương chính cũng có thể dùng được trong các lớp mẫu khi tải xuống được mã nguồn. Điều này không chỉ cung cấp bước nhảy ban đầu cho những thứ với một vài kinh nghiệm lập trình hướng đối tượng, nhưng nó cũng đáp ứng cơ hội tiếp thu kiến thức nếu bạn tự tìm ra sự tiến xa hơn một chút để tiếp nhận sự thay đổi (curve). Tốt nhất, nét đặc trưng mới Document Class của Flash CS3 Professional cho phép bạn bắt đầu sử dụng lớp nhanh hơn trước đây, cho phép một lớp đáp ứng hầu như phục vụ cho (stand-in) timeline chính của nhiều file.fla. Toàn bộ bạn có được để sử dụng nó là gõ vào tên của lớp trong Flash Property Inspector ( nếu bạn không thể đợi để học thêm, hãy bước sang đoạn The Document Class trong chương 1). Cuối cùng, chúng tôi đã thiết kế một dự án đã triển khai liên quan trặt trẽ với cuốn sách này. Bắt đầu với chương 7, chương đầu tiên theo sau là lập trình hướng đối tượng cơ bản, có thể download mã nguồn đặc trưng gói lớp cho mỗi chương. Các lớp bao gồm các phương thức tiện ích và các thuộc tính mà sẽ được sử dụng trong các project bổ sung. Khi bạn cảm thấy yên tâm (comfortable) với cú pháp của ActionScript 3.0, và nguyên tắc cơ bản của lập trình hướng đối tượng, bạn có thể củng cố (reinforce) những gì bạn đã học được bằng cách xây dựng project. Những file có thể sử dụng được website đồng hành (companion) của cuốn sách, mà chúng tôi sẽ nói về trong một lúc nào đó. Chúng tôi đã cố gắng để thiết kế cuốn sách chứa đựng nhiều yếu tố cần thiết (essentials) về ActionScript như chúng tôi có thể tính đến (include), dựa vào (given) phạm vi và khuôn khổ của nó. Phần I: Sự bắt đầu. Phần I bắt đầu với chương 1, thảo luận về ActionScript 1.0, 2.0, và 3.0, và sự khác nhau thế nào của các version được sử dụng trong Flash CS3 Professional ứng dụng và Flash Player. Nó kết thúc(concludes) với chương 2 xem xét việc xây dựng khối đó là nguyên tắc cơ bản cốt

3 lõi ngôn ngữ trung gian của ActionScript. Phần II: Đồ họa và sự tương tác Chương 3 bắt đầu(leads off) phần II, là đoạn dài nhất của cuốn sách, với sự giải thích về các từ vựng cơ bản của ActionScript: propertises, methods, và events (kể cả các nét riêng biết khác của ActionScript 3.0). Chương 4 tập trung nhiều vào nội dung hiển thị, chương 5 bao chùm (covers) các điều khiển timeline, và chương 6 đưa ra lập trình hướng đối tượng. Chương 7 thảo luận đối tượng hoạt hình sử dụng ActionScript, và chương 8, chương 9 nói về (explain) việc vẽ với code. Phần III: Văn bản Chương 10 là chương duy nhất của phần 3 và tập trung và định dạng văn bản, và hỗ trợ HTML, và sử dụng định kiểu trình bày trang (cascading style sheets). Phần IV: Âm thanh và Video Chương 11 sẽ mở ra phần IV với sự thảo luận về âm thanh. Thêm vào việc vận dụng (manipulating) âm thanh bên trong (internal) và bên ngoài(external), nó tác động (touches) trên metadata của ID3 và đưa đến kết quả (culminate) với sự vận dụng (exercise) để hình dung (visualization) âm thanh hiệu quả, việc lấy ra một mẫu sóng âm trong khi đang phát lại. Chương 12 bao (wraps up) phần IV bằng việc thể hiện (demonstrating) làm thế nào để chơi cả video với và không có thành phần nào, giống như làm thế nào để đặt phụ đề video của bạn để tiếp cận và nhiều thứ tiếng được hỗ trợ. Phần V: Vào/Ra. Phần V tập trung vào việc loading tài nguyên vào Flash và gửi dữ liệu ra một server hay các client khác. Chương 13 bao gồm loading các file SWF, images, và dữ liệu mã hóa URL, giống như việc truyền thông giữa ActionScript 3.0 và ActionScript 1.0/2.0 load các file SWF, và thảo luận ngắn về các vấn đề(issues) bảo mật. Chương 14 bao gồm XML và chuẩn mới để làm việc với XML làm cho công việc dễ dàng như với các đối tượng, phương thức, và thuộc tính ActionScript. Phần VI:Lập trình thiết kế và tài nguyên. Chúng tôi trình bày phần IV trong cuốn sách. Chương 15 cần xem một chút phương pháp lập trình, hướng đối tượng mẫu thiết kế, và tài nguyên để nghiên cứu thêm nữa. Cuốn sách tập trung vào ActionScript 3.0, nó áp dụng cho hầu hết các phân đoạn của Flash platform, nhưng nó được trình bày trong môi trường Flash CS3 Professional. Như vậy nó không bao gồm Flex, AIR, Flash Media Server, hay các công nghệ platform Flash khác. Thêm nữa, trong khi nó không chứa đựng kỹ thuật lập trình hướng đối tượng, nó không chỉ ra trong tài liệu theo chiều xâu hơn. Để biết thêm thông tin về điều này, vui lòng xem phần trước, How This Book Is Organized Như mục cấp độ văn bản, cuốn sách này có thể hiểu được khó khăn mà giới hạn về phạm vi chúng tôi đưa ra. Duyệt qua bảng nội dung sẽ cho bạn các ý tưởng hay của chủ đề chúng tôi

4 sẽ đề cao và, trong một vài trường hợp, sẽ tốt cho những thứ mà chúng tôi đã bao hàm trong tài liệu. Tuy nhiên, cái đó là một chút đáng chú ý của ActionScript mà không được thảo luận theo mức độ trung bình và nâng cao. Nó bao gồm sự kết nối cơ sở dữ liệu, biểu thức thông thường, lập trình cho thiết bị mobile, dịch vụ Web, truy cập từ xa, và tạo các thành phần cho riêng bạn. Chúng tôi không nói rằng đây là một tài liệu tham khảo. Nếu bạn là một lập trình viên ActionScript đã có kinh nghiệm có thể tìm kiếm nhanh chóng với phiên bản 3.0 của ngôn ngữ. Chúng tôi khuyên bạn rằng nên đọc cuốn ActionScript 3.0 Cookbook, của tác giả Joey Lott, Keith Peters, and Darron Schall(O Reilly). Nếu bạn xem tham khảo toàn bộ cuốn sách, chúng tôi khuyên bạn thử cuốn sách Essential ActionScript 3.0 của Colin Mook(O Reilly). Cuốn sách của chúng tôi có thể phục vụ hữa ích cho những người như đã nói ở tiêu đề, đặc biệt nếu bạn không phải là người dùng cao cấp, nhưng nó không thay thế bởi cái khác được. Phần I: Bắt đầu. Chương 1: Tổng quan ActionScript. Chương 2: Cốt lõi ngôn ngữ cơ bản. Phần I bắt đầu cuốn sách này với tập hợp(collection) tổng quan cơ bản, trải qua chương 1 và 2. Nó bắt đầu với cái nhìn khái quát về ActionScript, cung cấp một danh sách các đặc trưng nổi bật, giải thích tóm tắt các thủ tục với lại lập trình hướng đối tượng, và một chú ý quan trọng đó là cuốn sách được sắp xếp thế nào. Nó kết luận với việc xem lại cốt lõi ngôn ngữ cơ bản, hầu hết chúng còn lại phù hợp với toàn bộ các version của ActionScript. Tài liệu bắt đầu cuốn sách đưa ra như một lời giới thiệu ActionScript là ngôn ngữ mới, hay làm mới chúng với những ai đã quen thuộc với nó, và cho phép bạn sau đó tập trung vào ActionScript 3.0 cú pháp cụ thể.

5 Chương 1: Tổng quan về Action Script Trong chương này: -ActionScript 3.0 là gì? -Flash Platform -Lập trình thủ tục và hướng đối tượng -Document Class -Tính tương thích của Code -Những gì tiếp theo? Khi bạn muốn biết những gì về ActionScript để bắt đầu công việc với version mới, một cái nhìn tổng quan tóm tắt về sự phát triển của nó sẽ cho bạn hiểu thấu bên trong khi sử dụng nó đặc biệt liên quan tới Flash Player và làm thế nào nó vận dụng(handles) với các phiên bản khác của ActionScript. Giới thiệu ngắn gọn chương này sẽ cho bạn cái nhìn nhanh hơn ở đây ActionScript 3.0 phù hợp với tiến trình làm việc của bạn(workflow), và sẽ bao gồm: 1. ActionScript 3.0 là gì? Nó được trông đợi (expected) rằng một phiên bản mới của ActionScript sẽ mang lại những tính năng mới. Tuy nhiên, phiên bản này đã được viết lại từ đầu và thậm chí được xử lý tách biệt từ các phiên bản ActionScript trước đó tại runtime. Điều này cố ý đẩy nhanh (splintering) Flash Player làm tăng sự thi hành một cách đáng kể, nhưng cũng mang đến cho nó những giới hạn như nhiều phiên bản ActionScript tác động đến nhau. Flash Platform. Vào thời điểm viết cuốn sách này, ActionScript 3.0 là ngôn ngữ lập trình bên trong của Flex và AIR (ứng dụng Adobe Inegrated Runtime). Sự khác nhau trong trình dịch và môi trường cụ thể là do ngăn ngừa mọi file viết trong ActionScript 3.0 làm việc tại mọi khía cạnh của Flash Platform, nhưng nguyên tắc cơ bản thực sự của nhiều ngôn ngữ cũng như nhau ở mọi nơi. Ngôn ngữ lập trình hướng thủ tục và hướng đối tượng. Nhiều chú ý (great deal of) tập trung vào lập trình hướng đối tượng (object oriented programming_opp) có tiềm năng với ActionScript 3.0, và khả năng và sức mạnh của ngôn ngữ thực sự phát huy (shine) trong phạm vi này. Tuy nhiên, bạn sẽ chuyển sang ActionScript 3.0 dễ dàng không có nghĩa là là bạn trở thành một chuyên gia OPP. Nó vẫn có thể được sử dụng tập hợp cấu trúc hàm nó mô tả cách lập trình hướng thủ tục, để viết các dự án ActionScript 3.0. Ngoài ra, sử dụng Flash CS3, nó vẫn có thể viết code trong timeline, hơn nữa coding chỉ riêng (exclusively) với các lớp bên ngoài. Nếu bạn thích lập trình hướng đối tượng, cải tiến (enhancements) thành phần cơ sở của lập trình hướng đối tượng trong ActionScript 3.0 làm nó trở nên mạnh mẽ hơn và mang lại cho nó những tính năng quan trọng khác, ngôn ngữ lập trình hướng đối tượng cở bản (như Java) và thực hiện việc chuyển ngôn ngữ dễ dàng một chút. The Document Class. Lập trình hướng đối tượng không dành cho mọi người, nhưng dành cho những người bắt đầu trên chặng đường này, Flash CS3 cung cấp một lối vào đơn giản cho các ứng dụng lập trình hướng đối tượng bằng cách tạo một lớp tài liệu(document class). Một thuộc tính Properties Inspector, bạn chỉ cần chỉ rõ lớp ngoài là điểm bắt đầu của bạn, và

6 không có script trong timeline được yêu cầu. Tính tương thích của code để lại. Bởi vì ActionScript 3.0 không thể trộn lẫn với các phiên bản trước đó cả ngôn ngữ trong các file giống nhau, sự phát triển các dự án hỗ trợ code cũ là không được. Chúng tôi sẽ giới thiệu ngắn gọn các vấn đề phức tạp và thảo luận về chúng rộng và xâu hơn trong các chương tiếp theo. ActionScript 3.0 là gì? Mặc dù ngôn ngữ kịch bản bên trong của các version Flash mới chứa đựng nhiều thứ sẽ giống với việc sử dụng các phiên bản trước đó, nó chắc chắn được nghĩ tới là ActionScript 3.0 với mọi thứ hoàn toàn mới, với một vài lý do rất đơn giản. Trước tiên, một vài thứ khá là khác biệt, như là mẫu event và các thành phần được hiển thị. Thứ hai, sự thay đổi tinh tế có thể chạy với mọi ngôn ngữ và yêu cầu một vài chú ý cho đến khi chúng thích hợp với bản chất thứ hai. Điều này luôn là các mối quan tâm nhỏ, giống như coi nhẹ sự thay đổi tên của thuộc tính. Và quan trọng nhất là, mặc dù, ActionScript 3.0 đã được viết lại từ đầu và sử dụng code khác hơn các phiên bản trước của ngôn ngữ. Sự tối ưu này mang lại sự thi hành tăng lên khá ấn tượng, nhưng nó có nghĩa là code ActionScript không thể pha trộn với các version trước của ngôn ngữ trong file đó được. Cái mới nhất của Version này, mặc dù, không thể đe dọa được bạn. Nó đúng là con đường nghiên cứu khó khăn với ActionScript 3.0 so với các version trước đó, nhưng điều đó thường là một chức năng cho tính mạnh mẽ của chính nó hơn các phiên bản trước gây khó khăn. Điển hình, điều đó là sự điều chỉnh lại cho phù hợp mà người dùng phải thích ứng với cách làm việc mới với mọi thứ. Để giúp bạn có thể nhận được sự thay đổi, đây là một vài điều đáng chú ý của các đặc tính mới của ActionScript 3.0. Ghi nhớ điều này có thể giúp bạn thực hiện nó dễ dàng hơn để chấp nhận sự thay đổi, đặc biệt khi sự thay đổi ban đầu có thể gây chán nản hay quá phức tạp. Một vài đặc điểm mới được lựa chọn bao gồm: Thêm các lỗi được thông báo. ActionScript 3.0 yêu cầu sự nghiêm ngặt kiểu dữ liệu của các biên, các tham số, các giá trị hàm trả về, và nhiều thứ nữa. Kiểu dữ liệu được thảo luận ở Chương 2, nhưng sự sôi nổi giảm bớt để nói về sự thông dịch các loại dữ liệu bạn mong đợi làm việc trong một vài trường hợp cụ thể. Sự kiểm tra kiểu dữ liệu được giói thiệu trong ActionScript 2.0 nhưng là các tùy chọn trước đây. Tăng sự ép buộc kiểu dữ liệu cải thiện sự kiểm tra các lỗi và cung cấp nhiều thông tin hơn trong khi coding cho phép bạn xác định đúng vấn đề. Thêm nữa, ActionScript 3.0 bây giờ đòi hỏi kiểu dữ liệu tĩnh với runtime. Điều này cải thiện tính tin cậy của kiểu dữ liệu trong runtime, và cũng cải thiện sự thi hành và giảm bộ nhớ sử dụng bởi vì kiểu dữ liệu được lưu trữ trong máy code hơn buộc phải đặt địa chỉ động trong runtime. Sự cải tiến cú pháp. Vấn đề cú pháp đã được thống nhất và quét dọn toàn bộ ngôn ngữ. Ví dụ như, tên thuộc tính đã được làm sáng sủa trong một vài trường hợp, và đã làm cho nhất quán bằng cách loại bỏ đi đầu gạch dưới, bạn sẽ được xem trong chương 3. Hơn nữa, tính phức tạp, sự tinh tế của cách tiếp cận giống hoặc tương tự các tác vụ đã được làm nhất quán, giống như khi loading

7 các tài sản bên ngoài (được thảo luận ở chương 13) hay sự liên kết tới URL (như là xem toàn bộ cuốn sách) Cấu trúc hiển thị mới. Nhiều phương thức trước đó đã tự động thêm một vài thứ vào môi trường hiển thị bây giờ đã được thống nhất. Danh sách hiển thị mới đơn giản hóa quá trình xử lý một cách đáng kể và cũng làm nó dễ dàng hơn để chuyển sang thứ tự trực quan kiểu nạp chồng, cũng như cha, con và anh chị em ruột có mối quan hệ thứ bậc, các đối tượng được hiển thị. Như một chuyên đề lớn được được giới thiệu ActionScript 3.0, chúng ta sẽ thảo luận với độ dài trong chương 4. Cấu trúc sự kiện mới Vẫn cùng ví dụ về sự cải tiến tính bền vững, toàn bộ các event bây giờ được giải quyết bằng các sự kiện lắng nghe (event listener) thực chất sự lắng nghe cho một event cụ thể xuất hiện, và sau đó tác động trở lại tương ứng. Cái kiểu event mới cũng mạnh mẽ hơn, cho phép các sự kiện chuột và bạn phím truyền xuyên suốt nhiều đối tượng trong danh sách hiển thị. Kiểu event được thảo luận ở chương 3. Cải tiến cách trình bày XML. Trước đây xử lý cồng kềnh, sự làm việc phức tạp với tài liệu XML bây giờ là dễ dàng với ActionScript 3.0. Thông qua chuẩn thông thường được dựa vào E4X, ActionScript bây giờ xem các đối tượng XML một cách thông minh hơn và quen thuộc. Phương pháp mới cho phép bạn sử dụng cùng cú pháp dấu chấm với chuỗi các đối tượng liên quan cùng nhau. Nhiều lựa chọn kịch bản. Phương thức xử lý văn bản mới bây giờ cho phép nhiều điều khiển nhỏ thao tác trên text. Bây giờ bạn có thể tìm text của một dòng nói riêng trong một văn bản, số các ký tự trong một dòng, và các ký tự với chỉ xác định (như là dưới chuột). Bạn cũng có thể tìm số chỉ mục trong văn bản của ký tự đầu tiên trong một đoạn, và thậm chí cũng tìm ra tối thiểu xung quanh phạm vi hình chữ nhật với bất kỳ ký tự nào. Toàn bộ các lựa chọn này không chỉ làm việc với văn bản dễ dàng, nhưng nó còn cho phép một sự tích hợp vừa khít với các dòng và các ký tự trong một trường và phạm vi trình diễn các phần tử của chúng. Text được thảo luận trong chương 10. Các biểu thức thông thường mới. Cùng với cái lợi ích cho xử lý văn bản là hỗ trợ cho các biểu thức thông thường. Các biểu thức thông thường giống như sự thao tác với text. Thay vì cụ thể chỉ thao tác bằng tay, các xâu đã biết của các ký tự, bây giờ bạn có thể thao tác văn bản sử dụng các ký tự đại diện (wild cards), các loại ký tự (số, chữ, các dấu chấm câu, ), ký tự trắng (các dấu cách, tabs, returns), các ký tự lặp lại, và các cái khác. Một ví dụ đơn giản của biểu thức thông thường sử dụng có thể tìm thấy trong chương 10. Thêm các lựa chọn quản lý âm thanh. Các khả năng mới về âm thanh của ActionScript nằm trong số những thay đổi đáng chú ý của

8 ngôn ngữ. Trên một mức độ thực tế, chúng cải tiến truy cập tới cả với các âm thanh riêng lẻ và toàn bộ âm thanh đang playing. Các âm thanh bây giờ được đặt thành các kênh, làm chúng dễ dàng hơn để làm việc với nhiều âm thanh riêng lẻ, nhưng cũng hội tụ toàn bộ các âm thanh suốt một âm thanh pha trộn để tập hợp điều khiển. Bạn có thể bây giờ cũng lấy được biên độ và tần số phổ dữ liệu từ các âm thanh trong lúc phát lại. Âm thanh được thảo luận trong chương 11. Cách truy cập mới dữ liệu thô. Cần cao cấp hơn nữa, bây giờ bạn có thể truy cập dữ liệu nhị phân ở runtime. Các byte riêng lẻ của dữ liệu có thể đọc trong khi download, trong khi âm thanh chơi lại, hay trong khi thao tác với dữ liệu ảnh bitmap, cho tên một vài ví dụ. Các byte đó có thể được lưu trữ trong một danh sách lớn và vẫn được truy cập nhanh và có hiệu quả. Chúng tôi cũng sẽ thể hiện một ví dụ của kỹ thuật này trong chương 11 khi đang thảo luận âm thanh ảo. Tự động phạm vi quản lý mới. Trong ngôn ngữ lập trình, từ phạm vi là đôi lúc được sử dụng để xác định khu vực mà một đối tượng tồn tại. Một tài sản Flash, như là movie clip, có thể là một phần của Flash movie nhưng không khác. Ví dụ, một movie clip con có thể lồng vào bên trong một trong hai movie clip được tìm thấy trong timeline chính. Cái movie clip được lồng đó tồn tại trong một clip nhưng không khác. Phạm vị của nó, do đó, được hạn chế bởi chính cha của chúng. Các cấu trúc lập trình có sự giới hạn phạm vi, cũng như, và những thách thức là phải đảm bảo công việc của bạn trong khoảng phạm vi đúng khi định vị các cấu trúc đó. ActionScript 3.0 rất đơn giản hóa điều này bằng cách tự động theo dõi phạm vi với chương trình của bạn. Được cải tiến lập trình hướng đối tượng. Các cấu trúc lập trình hướng đối tượng cũng đã được cải tiến trong ActionScript 3.0 với bao gồm cả các lớp đóng và các namespace mới, nằm trong các thứ khác nữa. Chúng tôi sẽ thảo luận khía cạnh của lập trình hướng đối tượng trong chương này, cũng như trong chương 6, và cũng cấp các ví dụ lớp cơ bản khắp cả cuốn sách. Cái mới trong ActionScript 3.0, toàn bộ các lớp được mặc định niêm phong, bao gồm chỉ có các thuộc tính và các phương thức được xác định thời gian tạo tồn tại trong lớp ở timeline. Nếu bạn tìm thấy sự cần thiết để thay đổi các lớp đó ở runtime bằng cách thêm các thuộc tính, ví dụ, bạn có thể vẫn thực hiện bởi các lớp chức năng. Thêm vào đó, các namespace, bao gồm cả xác định các namespace tùy ý, cho phép điều khiển tốt hơn sự thao tác trên các lớp và XML. 2. Platform của Flash. Nó quan trọng để lưu ý trong cuốn sách này tập trung chủ yếu trên sự phát triển ứng dụng ActionScript 3.0 sử dụng môi trường phát triển tích hợp Flash CS3 Professional(IDE). Mặc dù, ActionScript 3.0 là ngôn ngữ lập trình cho ứng dụng Flash Platform, cũng như, đặc biệt là Flex và AIR (ứng dụng Adobe Integrated Runtime). Điều này nghĩa là các kỹ năng kịch bản bạn phát triển trong Flash CS3 sẽ được phần lớn áp dụng cho các khu vực khác của nền Flash Platfrom, sự mở rộng của bạn đạt đến như một lập trình viên. Hiện có, mặc dù, một vài thứ quan trọng khác để hiểu sự nghiên viễn cảnh lớn của

9 kịch bản ứng dụng. Chúng tôi sẽ cho bạn chỉ một chút ví dụ ngắn gọn ở đây để xem xét. Để bắt đầu với, Flash và Flex có trình biên dịch khác nhau nên nó không đảm bảo rằng project của bạn sẽ dịch đúng trong cả hai ứng dụng đó. Bạn có thể sử dụng Flex Builder (the trình biên dịch Flex) để biên dịch code ActionScript các file SWF không có Flex framework, và load chúng vào Flash CS3 sinh ra được các project. Bạn cũng có thể load Flash CS3 biên dịch được các file SWF thành một project Flex. Mặc dù, ngay khi bạn rời khỏi cốt lõi ngôn ngữ cần thiết, mọi thứ bắt đầu được chú ý. Ví dụ, Flex không có tài nguyên của Flash IDE để tạo các tài sản trực quan (giống như movie clips) và bởi các dấu hiệu giống nhau, Flash không hỗ trợ nhúng tag được sử dụng bởi Flex để bao gồm các tài sản. Điều này nghĩa là các code giống nhau không thể luôn luôn được sử dụng cùng nhau khi các trực quan tùy ý được yêu cầu. Cũng vậy, kiến trúc thành phần là khác nhau, bao gồm một định dạng khác nhau và sự thiết lập thành phấn khi thực hiên không khớp nhau. Vấn đề với các tài sản trực quan đã có một vấn đề tranh luận kịch liện khi đó, và sự tiến bộ bắt đầu làm để làm giảm bớt đi một chút làn sóng đó. Adobe đã phát hành một bản vá cho Flex 2, và Flex 3 được kiểm tra công khai tại thời gian của bài viết này, sự cải tiến sự tương thích của các thành phần. Mặc dù, nó sẽ hầu như chắc chắn một khoảng trước khi chuyển code sang và từ ứng dụng này sẽ là một xử lý yên tâm, nếu nó xảy ra trơn chu. Một bước nhanh, mặc dù vậy, sự phát triển AIR thích hợp hơn của đường quan hệ. Adobe đang tiếp tục công việc trên sản phẩm AIR bắt đầu trong Flash CS3. Mọi thứ giữ lại trong trí nhớ đó là các kỹ năng ngôn ngữ ActionScript 3.0 bạn phát triển sẽ giảm nhẹ sự chuyển của bạn giữa các ứng dụng trong Flash Platform, thậm chí nếu bạn phải làm việc với các công cụ hoặc các trình biên dịch khác đến kết luận với một sản phẩm đã kết thúc. 3. Lập trình hướng thủ tục và lập trình hướng đối tượng Nhiều cuộc tranh luận đã tạo ra nhiều lý lẽ tán thành và phản đối của lập trình hướng thủ tục với lại lập trình hướng đối tượng. Để bàn đến ngắn gọn điều này, ở đây là một nền nhỏ bé liên quan đến sự tiến hóa của ActionScript. ActionScript được bắt đầu như một một ngôn ngữ lập trình tuần tự, nghĩa là kịch bản bị giới hạn một trình tự tuyến tính của các lệnh Flash làm những gì theo kiểu từng bước. Phướng pháp này đối với kịch bản là không thực sự mềm dẻo và không đẩy mạnh được sự dùng lại. Như ngôn ngữ được tiến hóa, nó trở thành một ngôn ngữ lập trình hướng thủ tục. Giống như lập trình trình tự, lập trình hướng thủ tục dựa trên từng bước thiết lập của các lệnh nhưng giới thiệu một cấu trúc hơn, phương pháp mô đun đối với kịch bản. Các thủ tục, trong một tình trạng khác giống như hàm (hay, thỉnh thoảng là thủ tục con), có thể được thực thi lại và lại lần nữa khi cần từ các phần khác của một project, không có sự copy và paste vào trên trình tự các lệnh. Tính mô đun này đẩy mạnh được sự dùng lại, và làm code dễ dàng hơn cho việc soạn thảo và có hiệu quả hơn. Những người viết kịch bản trong việc tìm kiếm một mức độ lớn hơn đảm bảo của tính mô đun và sử dụng lại được đổ về lập trình hướng đối tượng. Ngôn ngữ lập trình hướng đối tượng tạo các chương trình mà là một tập hợp của các đối tượng. Các đối tượng là trường hợp riêng lẻ của một lớp tập hợp của code đó là độc lập và không thay đổi cốt lõi hay phá

10 vỡ mỗi cái khác. Chia code thành các bao gói nhỏ, được biết thích đáng như một sự đóng gói, là một dấu hiệu phân biệt của ngôn ngữ lập trình hướng đối tượng. Một đặc điểm quan trọng khác nữa của lập trình hướng đối tượng là tính kế thừa, hay khả năng lấy các lớp từ các lớp cha, qua một số đặc điểm cụ thể từ cha. Một ví dụ cổ điển về cấu trúc lập trình hướng đối tượng, và sự kế thừa một cách cụ thể, định nghĩa một tập các phương tiện vận tải (vehicle) chuyên trở. Bạn phải bắt đầu với một lớp chung Vehicle bao gồm đặc điểm chung của toàn bộ các phương tiện, như là cơ bản sự di chuyển. Bạn phải sau đó tạo lớp phụ: GroundVehicle, WaterVehicle, và AirVehicle. Các lớp này có thể thay đổi hay đưa vào một vài đặc điểm cụ thể cho vận chuyển bằng ground(đường bộ), water (đường thủy), air (đường hàng không) theo thứ tự, nhưng không đủ để thể hiện các phương tiện trong thực tế. Xa hơn nữa được xuất phát từ các lớp có thể là Car và Motorcycle (giảm từ GroundVehicle), Boat và Submarine (giảm từ WaterVehicle) và Plane và Helicopter (giảm từ AirVehicle). Phụ thuộc trên sự phức tạp của hệ thống của bạn, bạn có thể làm sôi nổi trên quy trình này, việc tạo các mẫu riêng lẻ với sự thiết lập riêng biệt cho nhiên liệu tiêu thụ, ma sát, và... Với bạn có thể cho rằng hầu như chắc chắn, phương pháp này để phát triển thêm các khả năng, tính mềm dẻo, và hứa hẹn khả năng sử dụng lại. Lợi ích này, giữa những cái khác, thỉnh thoảng vị trí lập trình hướng đối tượng là phương pháp tốt nhất cho một vấn đề. Tuy nhiên, điều đó là một khuynh hướng trong số các lập trình viên cảm thấy lập trình hướng đối tượng là giải pháp tốt cho toàn bộ các vấn đề hay, thực tế, chỉ một duy nhất một giải pháp. Điều này là không hoàn toàn đúng. Lập trình hướng đối tượng thường tốt nhất cho các dự án lớn, hay cho làm việc với một nhóm các lập trình viên, nhưng nó có thể thường vượt quá mức cần thiết cho các dự án nhỏ. Cuốn sách này cố gắng hướng dẫn sử dụng cả hai cách lập trình hướng thủ tục và lập trình hướng đối tượng thích hợp ở đây. Sử dụng các thực hành hướng đối tượng là mục tiêu tốt và cái đó chúng ta sẽ khuyến khích trong cuốn sách này. Tuy nhiên, chúng tôi sẽ trước tiên cố gắng tập trung trên các tài liệu cho mỗi chương, cú pháp nổi bật, và mở rộng làm thế nào và tại sao mỗi chủ đề sẽ được hướng dẫn trong code. Trong điều kiện tổng quát, chúng ta sẽ tập trung trên lập trình hướng thủ tục trước khi vào chương 6, chương này cung cấp với sự chuyển tiếp giữa thực hành hướng thủ tục và hướng đối tượng. Sau chương 6, bắt đầu mỗi chương sẽ tập trung các chủ đề bắt đầu được thảo luận, không có sự xung đột xung quanh cấu trúc lớp lập trình hướng đối tượng. Khi thích hợp, tuy nhiên, mỗi chương sẽ kết thúc với một ví dụ áp dụng lập trình hướng đối tượng. Điều này là phương pháp thích hợp để trình bày tài liệu cho toàn bộ những người dùng có thể trong cả hai cách lập trình hướng thủ tục và lập trình hướng thủ tục. Nó là điều chúng tôi hy vọng, không quan tâm đến kỹ năng và kinh nghiệm của bạn, bạn sẽ thực hiện các chủ đề tại nhà, và sau đó làm việc trong timeline, hay trong các lớp dựa trên trình độ hiện tại của bạn. 4. Document Class Nếu bạn lựa chọn bạn sẽ muốn để bắt đầu tư duy đòi hỏi ngay bây giờ trong lập trình hướng đối tượng, chúng tôi sẽ thể hiện cho bạn làm thế nào để dễ dàng nắm được một bước trong hướng đó. Flash CS3 đã đưa vào một đặc điểm đó là sự kết hợp đơn giản hóa một lớp chính, hay tập trung đi vào ứng dụng của bạn với FLA của bạn. Nó được gọi là document class và

11 nó làm toàn bộ công việc của class cho bạn. Điều này nghĩa là bạn không cần bất cứ code nào trong timeline và có thể soạn thảo toàn bộ các ví dụ trong Flash hay hệ soạn thảo bên ngoài hay môi trường phát triển do bạn lựa chọn. Hãy bắt đầu với một chương mô tả ví dụ mà bạn có thể sử dụng trong timeline. Nó không làm gì hơn là sử dụng phương thức trace() để đặt một từ trong Output panel chỉ panel đó chấp nhận text đưa ra từ file của bạn. trace("flash"); Để tạo một document class, bạn sẽ tạo một loại bao bọc quanh phương thức trace() trong cú pháp class đúng. Tạo một file ActionScript mới (đúng hơn là một FLA document) và gõ vào bên dưới document class như sau: 1 package { 2 3 import flash.display.movieclip; 4 5 public class Main extends MovieClip { 6 7 public function Main() { Dòng đầu tiên, cùng với dấu kết thúc dòng 12, xác định package của lớp. Một package là một cấu trúc bắt buộc mà đảm bảo rằng class của bạn được biết để biên dịch. Tiếp theo, bạn phải import bất cứ lớp nào mà bạn cần để sử dụng trong package. Một document class về cơ bản cung cấp một lối tắt cho việc tạo một trường hợp của một movie clip hay sprite (một đối tượng Flash mà chỉ là một frame movie clip) và thêm nó vào danh sách hiển thị để nó có thể hiển thị được bởi Flash Player. (Điều này chỉ đúng khi đó chỉ là hiển thị, như trong trường hợp này. Chúng ta sẽ bao hàm sự vận dụng danh sách hiển thị trong chương 4.) Toàn bộ các document class phải xuất phát từ một trong hai lớp MovieClip hay Sprite (các lớp tùy chọn khác mà không là các document class thì không cần được mở rộng từ MovieClip hay Sprite nếu điều đó là không thích hợp). Trong ví dụ này sử dụng MovieClip nên bạn phải import lớp MovieClip, xem trong dòng 3. Dòng 5, cùng với dấu kết thúc ở dòng 11, là sự xác định lớp. Tên của nó là tùy ý nhưng, khi đặt tên nó, bạn sẽ cần bao gồm một vài quy tắc cơ bản và theo quy ước. Tên sẽ là một từ mà chưa tồn tại trong ActionScript, nó sẽ bắt đầu với một ký tự chữ cái (hơn là một số hay ký tự khác), và nó là loại chữ in hoa. Class phải là public, nghĩa là các lớp khác có thể truy cập tới constructor, và nó phải mở rộng từ MovieClip hay Sprite, như đã thể hiện ở trước đó. Dòng 7, cùng với dấu kết thúc ở dòng 9, là constructor lớp. Đây là hàm chính mà tự động

12 chạy khi tạo một trường hợp của lớp này. Nó cũng phải public và phải cùng tên với lớp. Các hàm khác (nếu có) có thể, và phải, có các tên duy nhất. Toàn bộ những cái còn lại là được thêm vào các phương thức riêng lẻ được yêu cầu trong trường hợp này. Constructor phải đưa Flash ra Output panel, bởi vậy thêm dòng dưới này vào dòng 8: 7 public function Main() { 8 trace("flash ); 9 Khi được kết thúc, bạn phải save file trong cùng một thư mục file FLA của bạn ngay bây giờ. (Sau đó, bạn sẽ học cách làm thế nào để đặt các file trong các vị trí khác.) Bạn phải cho file cùng tên với lớp, nhưng thêm.as làm phần mở rộng. Cho nên, file này sẽ được đặt tên là Main.as. Bây giờ tạo một file FLA mới, chọn ActionScript 3.0 với phiên bản ngôn ngữ lập trình của nó, và save nó trong cùng thư mục trước đó bạn đã tạo file class. Tên của FLA là không quan trọng. Cuối cùng, mở Proterties Inspector và thêm tên document class của bạn, không phải tên của chính document đó. Trong trường hợp này, gõ vào Main thay vì gõ vào Main.as, giống như hình 1-1. Hình 1-1 thêm một document class vào FLA của bạn. Bây giờ xem trước file của bạn. Cũng sẽ tạo một trường hợp của class Main (nó mở rộng từ MovieClip và, bởi vậy, chạy giống như một movie clip) và thêm nó vào danh sách hiển thị. Lớp sẽ đưa Flash ra output panel, và kiểm tra ứng dụng của bạn sẽ hoàn thiện. Trong tương lại, bạn có thể cố gắng code timeline của chúng ta trong document class theo riêng bạn. Ban đầu, bạn chắc sẽ không biết các lớp đó cần import hay làm thế nào tạo bất cứ sự thay đổi nào có thể cho các biến hay các cấu trúc tương tụ để tuân theo cú pháp của lớp. Tuy nhiên, toàn bộ code ví dụ sẽ luôn đi cùng với các class để kiểm tra. Bạn có thể sử dụng các file này bất cứ lúc nào bạn muốn cho tới khi bạn có được định dạng cho document class. 5. Tính tương thích của code Tôi muốn kết thúc chương này với một sự báo trước nho nhỏ. Bạn không thể pha trộn code ActionScript 1.0 hay 2.0 với code ActionScript 3.0 trong cùng SWF. Bạn không thể làm được điều này nếu bạn đang học từ đầu, nhưng bạn có thể chạy trong hoàn cảnh này nếu bạn cố gắng update các project để lại bằng việc thêm vào code ActionScript 3.0. Nếu bạn cần chạy một hỗn hợp rời rạc ActionScript 3.0 và phiên bản trước đó của ngôn ngữ, như là một di sản bên trong một vỏ giao diện mới, bạn có thể làm điều đó bằng cách loading một SWF. Một file ActionScript 3.0 có thể load một SWF đã được tạo trong ActionScript 1.0

13 hay 2.0, nhưng nó không thể truy cập được các biến hoặc hàm cũ của SWF. Do ý định và mục đích, cùng là không đúng trong quá trình đảo ngược. Một SWF cũ không thể load một SWF ActionScript 3.0. Trong chương 13, chúng ta sẽ thảo luận làm thế nào để truyền thông giữa sự riêng biệt của các SWF sử dụng trong quá trình xử lý cụ thể. Bây giờ, tuy nhiên, chỉ nhắc nhở chính bạn một lần nữa đó là bạn không thể phối hợp ActionScript 3.0 với các phiên bản của ngôn ngữ trong cùng một file. Những gì tiếp theo? Bây giờ bạn đã biết một chút về ActionScript 3.0 và Flash Platform, nó là một thời gian để xem các cái cơ bản của ngôn ngữ. Bằng cái nhìn tổng quan các khái niệm phiên bản độc lập khi bắt đầu, chúng ta có thể tập trung vào cú pháp mới trong các chương sau. Nếu bạn có nhiều kinh nghiệm với ActionScript 1.0 hay 2.0, bạn có thể bạn muốn bỏ qua tài liệu này. Trong chương tiếp theo, chúng ta sẽ thảo luận: Các khái niệm cơ bản mang đến cho bạn một tốc độ nhanh hơn, bao gồm việc sử dụng phương thức trace() như là công cụ chuẩn đoán để xem phản hồi tức thời từ script của bạn. Sử dụng các biến để lưu dữ liệu, bao gồm các mảng và các đối tượng tùy ý mà cho phép bạn dễ dàng quản lý thêm các giá trị, và loại dữ liệu của các dữ giá trị này để cải thiện các thông báo lỗi. Các cấu trúc logic như là các điều kiện để quyết định làm và các vòng lặp cho việc đơn giản hóa các nhiệm vụ lặp đi lặp lại. Các hàm mà có thể tách biệt code bên trong các khối thuận tiện điều đó sẽ chỉ được thực hiện khi được chỉ dẫn. Các cách định địa chỉ các đối tượng Flash với ActionScript, bao gồm sử dụng các đường dẫn tương đối hay tuyệt đối, và lối tắt định nghĩa là this.

14 Chương 2: Các nguyên tắc cốt lõi của ngôn ngữ cơ bản Trong chương này: -Nhiều thể khác nhau cơ bản -Các biến và các kiểu dữ liệu -Các điều kiện. -Các vòng lặp. -Mảng. -Hàm. -Các đối tượng tùy chọn. -Từ khóa this. -Địa chỉ tuyệt đối và tương đối. -Những gì tiếp theo? Nó là một sự thật rằng ActionScript 3.0 là một bản viết lại hoàn thiện của ngôn ngữ kịch bản bên trong của Flash, và nó cũng đúng là ActionScript 3.0 không chia xẻ cùng môi trường code cơ bản như các phiên bản trước của ActionScript. Nhưng đó là toàn bộ ở đằng sau các scene. Sự thật là, toàn bộ các version của ActionScript tới nay nói chung chia xẻ khá ít. Điều đó không để nói rằng ngôn ngữ đang không có sự phát triển. Tất nhiên, mỗi version mới của ActionScript giới thiệu một lô các đặc trưng mới được cung cấp, là đúng với sự tiến triển của hầu hết các ngôn ngữ. Và, khi sự giải quyết là viết lại ActionScript 3.0 từ đầu, tận dụng chính điều hiện tại này để sắp xếp gọn gàng (tidy up) một vài thứ hỗn độn (messy) mà vẫn tồn tại từ những version trước đó như: tên, nghiêm ngặt hơn, và yêu cầu thực hiện tốt nhất như là các tùy chọn, và sự tổ chức lại event và hệ thống hiển thị. Toàn bộ sự phát triển này, tuy nhiên, không loại bỏ trên các chuẩn mà ActionScript đã từng dựa lên, và hầu hết cơ bản ngôn ngữ giữ nguyên không bị ảnh hưởng. Với mục đích tập trung trên các tùy chọn mới ActionScript 3.0 giai đoạn sau, chúng tôi muốn bao hàm một vài thứ của các nguyên tắc quan trọng hơn lên trước. Chúng tôi không có ý định không để ý tới các khái niệm này trong phần còn lại của cuốn sách. Tuy nhiên, bởi vì chúng là các nguyên tắc cốt lõi, bởi vậy, được sử dụng thường xuyên, chúng tôi hy vọng giải thích chúng đủ chi tiết ở đây và sử dụng ít thời gian nhất cho chúng khi chúng ta tiến hành. Nếu bạn đã thoải mái với ActionScript và đang đọc văn bản này để bắt đầu học version 3.0, bạn có thể muốn giữ lại, hay chí ít là đọc lướt, chương này. Nó là bởi không có nghĩa là một sự bao hàm toàn điện cho sự bắt đầu một khóa học. Cuốn sách này không thừa nhận rằng bạn là người từng trải (versed) với mọi phiên bản trước đó của ActionScript, nhưng quy mô và mục đích cần chúng ta nắm lấy mọi sự hiểu biết cơ bản của các khái niệm script tổng quát. Nếu bạn chưa sẵn sàng, vui lòng xem trên Lời giới thiệu để có ý tưởng tốt về việc cuốn sách này danh cho ai, cũng như một vài tham khảo khác nếu bạn cần thêm thông tin cần thiết để hiểu vấn đề. Bạn có thể sử dụng chương này, tuy nhiên, cái cần tập trung tham khảo khi khác khá niệm lập trình cần được giải thích. Trong trang này, chúng ta sẽ xem xét những chủ đề sau: Các thể khác nhau cơ bản. Để nhận biết một vài mục và kỹ thuật được sử dụng trong toàn

15 bộ cuốn sách là không đảm bảo cần thiết cho mỗi mục, chúng tôi sẽ bắt đầu với một vài yếu tố cần thiết (essential). Các biến và các kiểu dữ liệu. thông tin phải được lưu trữ trong những cái chứa đựng được gọi là các biến nếu nó được gọi lại để sử dụng sau đó, và sự khai báo mà kiểu của dữ liệu sẽ được lưu trữ trong mỗi biến có thể giúp Flash kiểm tra các lỗi trong khi phát triển. Các điều kiện. Trong nhiều trường hợp, khi một quyết định phải làm trong khi (in the course of) một sự thực thi của script, một điều kiện được sử dụng để đánh giá (evaluate) kết quả (outcome) của một quy định thiết lập của các điều kiện. Chúng ta sẽ xem các mẫu điều kiện if và switch. Các vòng lặp. Khi bạn phải thực thi trong một chỉ lệnh trong nhiều lần, nó đôi lúc có ích để làm trong một cấu trúc vòng lặp. Chúng ta sẽ xem cấu trúc vòng lặp for được sử dụng thông thường, nhưng đồng thời nhiều khả năng để các vòng lặp rõ ràng, kể cả frame và các event timer. Mảng. trong khi một biến có thể chứa đựng chỉ một giá trị đơn giản, nó có khả năng thường xuyên, hay thậm chí cần thiết, để lưu trữ hơn một giá trị trong một biến. Hình dung một danh sách các hàng hóa, với một vài mục, được viết trên một mảnh giấy đơn giản. Mảng là một cấu trúc dữ liệu mà cho phép bạn lưu trữ nhiều giá trị trong một biến. Hàm. Hàm là yếu tố cần thiết cho nhiều ngôn ngữ lập trình, và cho phép bạn thực thi code chỉ khi bạn đã sẵn sàng để làm như vậy, và sử dụng lại code đó có hiệu quả. Các đối tượng tùy chọn. Một đối tượng tùy chọn có thể xem xét như một loại biến đặc biệt mà cho phép bạn lưu trữ nhiều thông tin, một cách dễ dàng và nhất quán để truy lục dữ liệu. Các đối tượng cũng có thể rất hữu ích cho sự đơn giản hóa các nhiệm vụ của việc truyền nhiều tham số giá trị tùy ý vào một hàm. This. Từ khóa this được sử dụng như một tham chiếu nhanh (shorthand), ý nghĩa cơ bản của đối tượng hay phạm vi trong một script. Điều này sẽ trở nên rõ ràng trong tình huống, nhưng việc hiểu từ khóa làm việc thế nào có thể giữ lại cho bạn nhiều sự lặp lại và giảm bớt sự cần thiết cho các tham chiếu phức tạp trong các script của bạn. Địa chỉ tuyệt đối và tương đối. ActionScript có thể tham chiếu các địa chỉ tới các đối tượng của nó sử dụng các đường dẫn tuyệt đối, như sự bắt đầu từ timeline gốc và kể cả mọi đối tượng giữa nó và cái đích của bạn, hay các đường dẫn tương đối, như đi từ một cái gốc (cha) và xuống dưới là các anh em, không có vấn đề là bạn ở đâu. Lần nữa, chương này không có nghĩa là chỉ thực hiện chỉ sự tham khảo để mang đến cho bạn sự nhanh nhất nếu bạn hoàn toàn không có chút kinh nghiệm nào với ActionScript. Nó sẽ giống như cung cấp những phần chính bạn cần như các cơ bản khác như ở đây script được lưu trong Flash đã được bỏ qua một số lý do. Như được diễn tả trong phần giới thiệu, để bắt đầu một cuốn sách trên Flash, chúng tôi đề nghị Flash CS3 Professional, The Missing Manual, được xuất bản bởi O Reilly, nhà xuất bản cuốn sách này. Tài nguyên để hoàn thiện thêm ActionScript, chúng tôi thành thật khuyên bạn sử dụng Essential ActionScript 3.0 bởi Colin Moock, cũng được xuất bản bởi O Reilly. Sau đó quyết định tham khảo từ trung bình tới nâng cao, nhưng gần như ba khoảng thời gian kích cỡ của cuốn sách, nó cũng về căn bản hoàn thiện hơn. Toàn bộ các phần, chương này, cùng với bối cảnh và bổ sung sự giải thích được trình bày sau các chương, sẽ cung cấp cho bạn đủ hiểu các chủ đề và có các ví dụ đang làm việc.

16 1. Nhiều thể khác nhau cơ bản Một vài chủ đề hầu như chắc chắn không đòi phần được dành cho để bàn luận về chúng nhưng sẽ vẫn đề cập thích đáng để chúng sử dụng trong toàn bộ cuốn sách. Chúng tôi sẽ gồm cả một vài ví dụ ở đây, chỉ có khi đã có sự bắt đầu của chúng tôi. Sự thi hành tuần tự Phổ biến, ActionScript thực thi từ trên xuống dưới, từ trái sang phải theo thứ tự, mỗi dòng thực thi nó sau đó cái khác, sự làm việc từ trái qua phải. Một vài thứ có thể thay đổi thứ tự trong một số cách tinh tế, nhưng nó cơ bản là các quy tắc đáng tin cậy. Ví dụ, nguyên nhân sự thực thi theo trình tự của script nguyên bản để dừng trong khi thủ tục nhỏ đang được thực hiện. Khi thủ tục con đã hoàn thành, sự thực thi của script nguyên bản tiếp tục từ bên trái của nó. Các bước này sẽ được giải thích trong tình huống, trong toàn bộ script của cuốn sách này. Sử dụng dấu ; Chính thức sử dụng dấu chấm phẩy trong ActionScript là để thực thi hơn một lệnh trên một dòng đơn. Điều này là hiếm có trong script thông thường, và chúng tôi sẽ xem kỹ thuật này khi bàn luận tới các vòng lặp. Tuy nhiên, dấu chấm phẩy cũng được sử dụng để cho biết sự kết thúc một dòng. Điều này không đòi hỏi, nhưng nó được đề nghị cho sự rõ ràng và dễ dàng có thể chuyển sang học các ngôn ngữ khác mà dấu chấm phẩy là kết thúc một dòng được đòi hỏi. Sự đánh giá một biểu thức Nó giúp ích để chú ý rằng bạn thường thường không giải một phương trình khi thấy một biểu thức với các giá trị giống nhau bên trái và bên phải của dấu bằng. Ví dụ nếu bạn thấy một vài thứ giống như x = x + 1, nó không giống như bạn giải phương trình để tìm giá trị x, dòng này là sự gán một giá trị mới vào x bằng cách cộng thêm 1 vào giá trị trước đó của nó. Sử dụng lệnh trace Nghĩa là có sự phản hồi nhanh, trong một ví dụ, hay như một kỹ thuật kiểm tra và sự gỡ rối khi đang viết các script, nó rất hữu ích để sử dụng lệnh trace. Lệnh này đặt các text liên quan ra Output panel của giao diện Flash. Hiểu một cách nôm na là, điều này là một tùy chọn chỉ có thể sẵn dùng tại thời gian đó, không sử dụng tại runtime. 2. Các biến và các kiểu dữ liệu Các biến là sự thể hiện tốt nhất như là các cái chứa đựng trong cái mà bạn thay thế thông tin cho những lần gọi sau. Hình dung nếu bạn không lưu trữ mọi thông tin cho lần sau sử dụng. Bạn không thể sửa lại các giá trị đã được mô tả các thông tin trước đó (như là tên của những người dùng hay các mật khẩu), các script của bạn sẽ chịu đựng một sự thực hiện khó khăn theo cách lặp lại những cái không cần thiết cho tính toán, và bạn sẽ không thể mang những kinh nghiệm để thực hiện những bổ sung tiếp theo cho một nhiệm vụ. Tổng quát, bạn sẽ không thể làm bất cứ yêu cầu dữ liệu nào cho ứng dụng của bạn để nhớ được. myvariable = 1; Đó chỉ là một vài quy tắc và sự thực hành tốt để xem xét tên các biến khi nào. Chúng có thể

17 chỉ là mộ từ, có thể gồm cả các ký tự alpha dài với kí hiệu dollar ($) hay dấu gạch dưới (_), nó không bắt đầu bằng một số, và không là một từ khóa hay từ dành riêng trong ActionScript Để chắc chắn giúp bạn sử dụng các biến thích hợp, ActionScript sẽ theo dõi chúng và cảnh báo cho bạn nếu bạn cố gắng thi hành một hành động không thích hợp trên chúng, mặt khác khi sử dụng chúng không đúng. Ví dụ, nếu bạn cố gắng thi hành một phép toán học trên một đoạn text, Flash sẽ đưa ra một cảnh báo để bạn có thể chỉnh đúng vấn đề. Để làm điều này, Flash phải chỉ ra những gì bạn muốn lưu trữ trong mỗi biến. Điều này được hoàn thành bởi việc khai báo biến trước khi sử dụng nó với từ khóa var, và đưa ra kiểu dữ liệu để lưu trữ trong đó bởi đi theo sau tên của biến với một dấu (:) và kiểu dữ liệu. Cụ thể, ví dụ trước đây để ghi nhớ số 1 phải viết như thế này: var myvariable:number = 1; Đó là bao gồm một vài kiểu dữ liệu, nhưng được giới hạn, chúng được liệt kê trong bảng 2-1: Bảng 2-1. Các loại biến. Kiểu dữ liệu Ví dụ Diễn tả Number 4.5 Bất cứ số nào, bao gồm cả giá trị số thực. int -5 Là số nguyên uint 1 Là số nguyên không âm. String hello Text hay một xâu các ký tự. Boolean true Có giá trị true hay false. Array [2, 9, 17] Lưu hơn 1 giá trị trong một biến. Object myobject Cấu trúc cơ bản của toàn bộ ActionScript, nhưng cũng là mẫu tùy chọn từ đó có thể được sử dụng để lưu nhiều giá trị như là một mảng. Cũng có nhiều sự thêm vào các kiểu dữ liệu mà diễn tả các class được sử dụng trong biến. (như đã thảo luận trong Chương 1, nghĩ rằng các class như là các script ở bên ngoài mà điển hình là tra lại thông tin cho script của bạn và làm việc như các số của một tổ hợp lớn để tạo ứng dụng của bạn ). Ví dụ, dòng code sử dụng class MovieClip (xây dựng trong Flash) để tạo một MovieClip tại runtime: var mymc:movieclip = new MovieClip();

18 Nó là không thực tế để có thể liệt kê toàn bộ các kiểu dữ liệu ở đây, nhưng chúng tôi sẽ tham khảo các kiểu dữ liệu thường xuyên trong toàn bộ cuốn sách, và nó sẽ trở thành bản năng thứ hai để sử dụng chúng. Trong các phiên bản trước của ActionScript, sự khai báo và kiểu dữ liệu các biến là tùy ý. Tuy nhiên, trong ActionScript 3.0, điều này thực hiện là bắt buộc. Điều này có thể cảm thấy cồng kềnh nhưng chẳng bao lâu nữa, điều này sẽ trở thành bản năng thứ hai, và bạn sẽ có được sự đánh giá đúng về các trường hợp lỗi ngay lập tức và cung cấp các đặc điểm phản hồi này. Như chúng tôi bắt đầu đi xâu hơn trong cuốn sách, bạn sẽ học được các biến đó áp dụng cho toàn bộ phạm vi (thực ra là nơi mà biến đó tồn tại, như là timeline chính của Flash, hay các class cụ thể) hay là vị trí để các cấu trúc code cụ thể. Chúng ta sẽ trao đổi điều này trong các code ví dụ. Chú ý: Trong toàn bộ cuốn sách, các code ví dụ code là cú pháp được đánh màu tương tự như trong giao diện màu scripts trong Flash. Điều này giúp cho nhận dạng các mục như là cá phần của từ vựng ActionScript (như là từ khóa và các định danh) và làm chúng dễ dàng để xem các lời bình luận (diễn tả các đoạn văn bản mà không thực thi) và các string. 3. Các điều kiện Bạn sẽ thường cần để làm để giải quyết trong script của bạn, sự chọn lựa để làm một cái gì dưới một tình huống, và cái khác cho một tình huống khác. Những trạng thái này luôn được đặt bởi các điều kiện. Đơn giản là, một kiểm tra được tạo, hỏi điều một điều kiện là đúng. Nếu điều kiện là đúng, các giá trị kiểm tra là true, và do đó code cụ thể được thực thi. Nếu điều kiện không đúng, những hành động khác được thực hiện hay xen kẽ code được thực thi. if Hầu hết các mẫu phổ biến của điều kiện là câu lệnh if. Cấu trúc cơ bản của câu lệnh là từ khóa if, được đi theo sau bởi các dấu ngoặc đơn trong đó có các điều kiện để kiểm tra, và các dấu ngoặc móc bên trong đó để thực thi các câu lệnh khi mà giá trị của câu lệnh trả về true. Ba dòng đầu tiên trong ví dụ thiết lập một sự kiện. Giá trị câu lệnh if cho các sự kiện.(giá trị ban đầu thiết lập các sự kiện sẽ được sử dụng cho điều này và các ví dụ sau trong phần này). var a:number = 1; var b:string = "hello"; var c:boolean = false; if (a == 1) { trace("option a"); Để đánh giá sự đúng đắn của kiểm tra bên trong ngặc đơn, các điều kiện thường sử dụng các toán tử so sánh và logic. Toán tử so sánh để so sánh hai giá trị, như là bằng (==), nhỏ hơn (<), và lớn hơn hoặc bằng (>=), một vài trường hợp nữa. Một toán tử logic đánh giá sự đúng đắn của biểu thức. Bao gồm trong cái này là AND (&&), OR ( ), và NOT (!). Điều này cho phép bạn phát biểu if (điều này and điều đó) là đúng, hay if điều này hoặc điều đó là đúng, hay if điều này không đúng. Ví dụ, sau đây sẽ cho giá trị là false, bởi vì cả hai điều kiện là không đúng. Như kết quả, không có gì trace ra trong Ouput panel.

19 if (a == 1 && b == "goodbye") { trace("options a and b"); Trong ví dụ này, sự kiểm tra sẽ đánh giá đúng, bởi vì một trong hai điều kiên (cái trước tiên) là đúng. Như kết quả option a or b sẽ được trace. if (a == 1 b == "goodbye") { trace("option a or b"); Cuối cùng, sau đây cũng sẽ trả về giá trị đúng, bởi vì toán tử NOT đúng khi mà giá trị c xác định là không đúng. (Nhớ rằng, đó là câu lệnh if, cốt lõi của nó, là kiểm tra giá trị đúng ). if (!c) { trace("not option c"); Toán tử NOT cũng được sử dụng như một phần của toán tử so sánh. Khi mà phối hợp với một dấu bằng, cả hai nghĩa là, không bằng. Bởi vậy, sau đây sẽ là sai bởi vì a bằng 1, và không có gì được trace. if (a!= 1) { trace("a does not equal 1"); Sự thêm vào khả năng có thể được thêm vào câu lệnh if bằng cách thêm vào một lựa chọn vô điều kiện khác ( đúng không cho vấn đề gì), sự lựa chọn thiết lập code được thực thi không cho vấn đề mà giá trị đã được kiểm tra, đơn giản bởi vì kiểm tra không được thông qua. Với code mới như sau được thêm vào ví dụ trước, sự trace cuối cùng sẽ xảy ra. if (a!= 1) { trace("a does not equal 1"); else { trace("a does equal 1"); Cuối cùng, câu lệnh có thể chỉ thiết thực bằng sự thêm vào một điều kiện lựa chọn khác (hay thêm một kiểm tra), để cấu trúc. Trong ví dụ này, sự trace thứ hai sẽ xảy ra. if (a == 2) { trace("a does not equal 1"); else if (a == 1) { trace("a does equal 1"); Lệnh if được yêu cầu chỉ có if, chỉ một lựa chọn else có thể được sử dụng, và mọi số kiểm tra else if thêm vào có thể được sử dụng. Trong toàn bộ các trường hợp, tuy nhiên, chỉ một kết quả có thể thực hiện từ cấu trúc đó. Xem xét ví dụ sau, trong ba kết quả có khả năng thực hiện là cái đầu tiên và thứ hai chúng là đúng, và cái cuối cùng vì nó không là một trường hợp nào khác. if (a == 1) { trace("option a"); else if (b == "hello") {

20 trace("option b"); else { trace("option other"); Trong trường hợp này, chỉ option a có thể xuất hiện trong Output panel bởi vì trước tiên sẽ kết thúc cấu trúc if. Nếu bạn cần thêm hơn một sự thực thi xảy ra, bạn sẽ cần sử dụng hai hay nhiều hơn các điều kiện. Cấu trúc sau, là ví dụ, sự thực thi trước tiên trace trong mỗi if, bởi sự thiết kế này. if (a == 1) { trace("option a"); if (b == "hello") { trace("option b"); else { trace("option other"); Chú ý: Sự kiểm tra trong ví dụ sử dụng một cặp dấu bằng. điều này là toán tử so sánh hỏi rằng, điều này có bằng?. Sự khác biệt này là vô cùng quan trọng bởi vì ngẫu nhiên sử dụng một dấu bằng sẽ là nguyên nhân đưa ra kết quả không ngờ tới. Một dấu bằng là một toán tử gán và gán bằng giá trị bên phải của biểu thức cho đối tượng ở bên trái của biểu thức. Bởi vì sự gán này xuất hiện, nên sự kiểm tra sẽ luôn luôn trả lại giá trị là true. switch Một lệnh if có thể thực hiện đơn giản hay sự phức tạp nếu cần. Tuy nhiên, cấu trúc if dài có thể gây khó khăn để đọc và có thể đôi lúc sẽ tốt hơn khi sử dụng câu lệnh swith. Thêm nữa, câu lệnh sau có một đặc trưng là cho phép bạn điều khiển nhiều cấu trúc lệnh if được thực thi khi mà giá trị kiểm tra là sai. Hình dung một lệnh if hỏi rằng nếu giá trị a là 1, else if là 2, else if là 3, else if là 4, và... Sự kiểm tra giống như vậy có thể trở nên khó khăn để đọc nhanh. Một cấu trúc lựa chọn xuất hiện như sau: switch (a) { case 1 : trace("one"); break; case 2 : trace("two"); break; case 3 : trace("three"); break; default : trace("other"); break;

21 Trong trường hợp này, one sẽ xuất hiện trong Output panel. Dòng swith chứa đựng đối tượng hay biểu thức bạn muốn kiểm tra. Mỗi dòng lựa chọn cung cấp một giá trị có thể switch (a) { case 1 : trace("one"); case 2 : trace("two"); break; 4. Các vòng lặp Nó khá là cơ bản để thực thi các chỉ dẫn lặp trong các script của bạn. Tuy nhiên, kể cả dùng nhiều dòng, dòng này copy sau dòng khác, là không hiệu quả để soạn thảo và bảo dưỡng. Bao bọc việc lặp thực hiện trong một cấu trúc lặp hiệu quả là vai trò của các vòng lặp. một vòng lặp lập trình có lẽ chỉ là những gì bạn nghĩ nó là: Sử dụng để đi qua một cấu trúc và sau đó lặp trở lại để bắt đầu và thực hiện lại nó. Đây là một loại vòng lặp, và loại bạn chọn để sử dụng có thể giúp quyết định số lần chỉ thị lặp được thực thi thế nào. Vòng lặp for. Loại đầu tiên của cấu trúc lặp chúng ta sẽ xem xét vòng lặp for. Vòng lặp này thực hiện nội của nó một số lần có hạn. Ví dụ, bạn có thể muốn tạo một grid gồm 25 movie clip hay kiểm tra xem 5 radio button đã được lựa chọn chưa. Trong ví dụ trước tiên, chúng ta muốn đánh dấu nội dung ra Output panel 3 lần. Để lặp qua một sự xử lý thực tế, trước tiên phải bắt đầu với một giá trị khởi đầu, như là 0, để bạn biết bạn không đánh dấu vết mọi thứ ra Output panel. Bước tiếp theo là kiểm tra xem liệu có phải bạn đã vượt qua giới hạn của bạn. Dòng đầu tiên, 0 không vượt quá giới hạn 3 lần. Bước tiếp theo là in vết nội dung, và bước cuối cùng là tăng giá trị khởi đầu của bạn, và ghi điều đó bạn đã được in vết nội dung yêu cầu. Quá trình từ bắt đầu cho tới khi, cuối cùng, bạn sẽ vượt quá giá trị giới hạn của vòng lặp. Cú pháp cơ bản của vòng lặp for là như sau:for (var i:number = 0; i < 3; i++) { trace("hello"); Đầu tiên bạn có thể để ý là sự khai báo biến và kiểu đếm, i. Đây là một phương pháp phổ biến vì biến i thường chỉ được sử dụng cho sự đếm và, bởi vậy, được tạo ngay tại chỗ và không được sử dụng lại. Nếu bạn đã khai báo và định kiểu số đếm trước đó, bước đó có thể bỏ qua ở đây. Tiếp theo là vòng lặp kiểm tra. Trong trường hợp này, biến đếm phải có giá trị nhỏ hơn 3. Cuối cùng, hai dấu cộng là tương đương với với i = i + 1, hay cộng thêm 1 vào giá trị hiện tại của i. Kết quả là 3 sự xuất hiện của từ hello trong Output panel. Nó cũng có thể đếm xuống bằng cách đảo lại giá trị trong các bước 1 và 2, và sau đó giảm giá trị biến đếm:

22 for (var i:number = 3; i > 0; i--) { trace("hello"); Có nhiều cách khác nhau, miễn là giá trị của i là lớn hơn 0, sự thực hiện vòng lặp, và trừ đi 1 từ giá trị biến đếm mỗi lúc. Điều này ít phổ biến hơn, và làm việc trong trường hợp này bởi vì vòng lặp chỉ in vết một string. Tuy nhiên, nếu bạn cần sử dụng giá trị thực tế của i trong vòng lặp, điều đó cần có thể ra lệnh dù bạn có tăng hay giảm đếm. Ví dụ, nếu bạn tạo 10 movie clip và gọi chúng là mc0, mc1, mc2, và.v.v.., nó có thể là một số đếm rõ ràng. Chú ý: Chú ý mỗi ví dụ vòng lặp chính thức sử dụng dấu chấm phẩy để thực thi hơn một bước trong một dòng đơn.. Vòng lặp while Một loại vòng lặp khác mà bạn thích sử dụng là vòng lặp while. Thay vì thực thi nội dung của chính nó trong một sự giới hạn số lần lặp, nó thực thi miễn là những thứ còn lại là đúng. Một ví dụ, hãy xem một số trường hợp đơn giản của sự lựa chọn một số ngẫu nhiên. Sử dụng phương thức random() của class Math, ActionScript sẽ chọn một số ngẫu nhiên lớn hơn hoặc bằng 5. Với cơ bản 50% sự may rủi của sự chọn lựa một số trong mỗi lúc, bạn có thể kết thúc với sự lựa chọn sai một vài lúc trong một dòng. Để đảm bảo rằng bạn có một số hạn định, bạn có thể thêm điều này vào script của bạn: var num:number = 0; while (num <.5) { num = Math.random(); Sự bắt đầu với một giá trị mặc định là 0, num sẽ nhỏ hơn.5 lúc đầu trong vòng lặp. Một số ngẫu nhiên sau đó được đặt vào biến num và, nếu nó nhỏ hơn.5, vòng lặp sẽ thực thi một lần nữa. Điều này sẽ đi tiếp cho tới khi một số ngẫu nhiên mà lớn hơn.5 được quyết định, do đó kết thúc vòng lặp. Một cảnh báo cho vòng lặp. Nó rất là quan trọng để hiểu rằng, mặc dù gọn gàng và tiện lợi, các cấu trúc lặp không là phương thức tốt nhất sử dụng để hoàn tất một kết quả. Điều này là bởi vì các vòng lặp đòi hỏi rất nhiều bộ xử lý. Khi một vòng lặp bắt đầu xử lý của nó, mọi thứ sẽ thực thi cho tới khi vòng lặp đó kết thúc. Chính lý do này, nó có thể khôn ngoan để tránh các vòng lặp for và while khi các cập nhật cơ bản tạm thời được yêu cầu. Trong trường hợp khác, khi một vòng lặp phục vụ như một sự khởi tạo cho một sự xử lý được cập nhật chỉ khi lúc sự hoàn thành nó, như là việc tạo grid 25 movie clip đã nói trước đây, bạn sẽ giảm đi một vài vấn đề. Script bắt đầu vòng lặp, 25 clip được tạo ra, vòng lặp được kết thúc, một frame cập nhật có thể xuất hiện, và bạn thấy toàn bộ 25 clip. Tính năng của break là không tồn tại với lệnh if và, nếu sử dụng với các lựa chọn khác có hiệu quả với swich để thêm các chuỗi phức tạp cho nhiều lệnh if. Lệnh switch phải có một swith, và một case, các tùy chọn khác sẽ trong default, và tùy chọn break cho mỗi case và default. Break cuối cùng không cần, nhưng có thể thích hơn để đảm bảo tính kiên định.

23 Tuy nhiên, nếu bạn muốn mỗi 25 clip ló ra, lần lượt từng cái một, các cập nhật cơ bản tạm thời ban đầu không thể xuất hiện trong khi bộ xử lý đang được sử dụng trong vòng lặp. Trong hoàn cảnh này, một vòng lặp được hoàn tất bởi các phương thức khác mà không gây trở ngại cho sự cập nhật bình thường trước đó muốn có thể xảy ra. Hai vòng lặp, các vòng lặp frame và timer, là phổ biến để sử dụng cho các mục đích này. Một vòng lặp frame là dễ dàng lặp một frame event, sự thực thi một chỉ dẫn mỗi lúc trở lại ban đầu được cập nhật. Một vòng lặp timer là tương tự, nhưng nó không bị ràng buộc bởi nhịp độ của frame. Thay vì, một timer event được thúc đẩy bằng một timer độc lập thiết lập một tần số. Trong cả hai trường hợp, các event xuất hiện trong sự kết hợp với những event khác trong các hàm thông thường của file, để cập nhật trực quan, như một ví dụ, có thể tiếp tục xuất hiện. Cả hai vòng lặp timer và frame sẽ được giải thích, hoàn thiện với các ví dụ, trong chương tiếp theo. Cảnh báo. Sử dụng các vòng lặp while chú ý cho tới khi bạn tiện lợi với chúng. Nó dễ dàng để viết ra ngẫu nhiên một vòng lặp vô hạn không bao giờ kết thúc, nó sẽ là nguyên nhân code của bạn dừng trong các dòng của nó. Không thử code này trong code của chính bạn, nhưng đây là một một ví dụ cự kỳ đơn giản thể hiện rõ nhất một vòng lặp vô hạn: var flag:boolean = true; while (flag) { trace ("infinite loop"); Như bạn thấy từ ví dụ này, biến flag vẫn đúng, cho nên, vòng lặp không bao giờ thất bại. 5. Mảng Các biến cơ bản chỉ có thể chứa đựng một giá trị. Nếu bạn thiết lập một biến là 1 sau đó cùng thiết lập là 2 ở dòng sau, giá trị đã bị gán lại, và giá trị của biến đó trở thành 2. Tuy nhiên, đó là một vài lần khi bạn cần một biến chứa hơn một giá trị. Giả sử một tập hợp hàng tạp hóa bao gồm 40 sản phẩm. Với các biến để giải quyết các vấn đề này định nghĩa 50 biến và đặt chúng tương ứng với một sản phẩm tạp hóa. Đó tương đương với 50 mẫu được viết ra trên mặt của của nó. Điều này là vô cùng cồng kềnh và chỉ có thể tạo được bởi người viết trong quá trình xử lý là cố định và bạn có thể gọi lại và quản lý toàn bộ tên các biến mỗi lúc bạn muốn truy cập các mục sản phẩm. Tương với một mảng, tuy nhiên, rất là giống việc làm thế nào chúng ta xử lý điều này trong thực tế. Một danh sách gồm 50 mục hàng tạp hóa được viết trên một khối của trang giấy. Bạn có thể thêm vào danh sách trong khi lưu trữ tại đó, qua mỗi mục nó sẽ được thu nhận,và bạn chỉ cần quản lý một khối trên trang. Việc tạo một mảng khá dễ dàng. Bạn có thể đặt lại một mảng bằng cách thiết lập một biến (kiểu Array) để dấu chấm phẩy ngăn cách danh sách mỗi mục, bao quanh bởi một cặp ngoặc đơn. Bạn có cũng có thể tạo một mảng rỗng bằng cách sử dụng class Array. Cả hai kỹ thuật được minh họa như sau: var myarray:array = [1, 2, 3] var yourarray:array = new Array();

24 Trong cả hai trường hợp, bạn có thể thêm vào, hay loại bỏ từ các mảng trong lúc thực hiện. Ví dụ, bạn có thể thêm vào một giá trị vào một mảng sử dụng phương thức push(), nó đẩy giá trị vào cuối mảng. Tóm lại, một phương thức là hành động thực thi bởi một đối tượng, trong trường hợp này là sự thêm một vài thứ vào mảng và sẽ được thảo luận chi tiết trong các chương tiếp theo. Bạn có thể loại bỏ một phần tử cuối của một mảng sử dụng phương thức pop(). var myarray:array = new Array(); myarray.push(1); trace(myarray) // 1 xuất hiện ở Output panel myarray.push(2); // hiện giờ mảng có 2 phần tử: 1, 2 trace(myarray.pop()); // phương thức pop() loại bỏ phần tử cuối cùng, nó hiển thị giá trị của 2 trace(myarray) // nó chỉ còn lại một phần tử trong mảng, 1, nó được hiển thị Đó là có nhiều hay các phương thức mảng khác, cho phép bạn thêm hay loại bỏ đằng trước mảng, hay đơn giản các nội dung của nó, kiểm tra vị trí của một phần tử được tìm thấy trong mảng, so sánh giá trị lại với một giá trị điều khiển, hay nhiều phương thức khác nữa. Chú ý: Cả hai phương thức được thêm vào cuối của biến mảng myarray với một dấu chấm ngăn cách hai cái. Điều này là cú pháp được sử dụng để định hướng mẫu đối tượng tài liệu Flash, và một vài lúc được tham chiếu là sử dụng dấu chấm cú pháp. Về cơ bản, một xâu hệ thống cùng với một chuỗi các phần tử, từ lớn nhất đến nhỏ nhất, và bao gồm các đối tượng thích đáng để giao cho xử lý. Trong trường hợp này, phần tử lớn nhất thích đáng là phẩn tử của chính mảng và, ở bên dưới cái đó là mỗi phương thức. Xem xét ví dụ khác, ở đây bạn muốn kiểm tra chiều rộng của một movie clip nó đó trong movie clip khác, phần tử lớn nhất sẽ là cha, hay chứa đựng movie clip, sau đó đến movie clip đặt trên, và sau đó đến chiều rộng của nó: mc1.mc2.width; Cú pháp dấu chấm này sẽ hầu như được sử dụng cho mọi ví dụ đưa vào cuốn sách, và nó sẽ sớm trở nên khá dễ dàng để hiểu được rằng những gì được tham chiếu bởi đối tượng. Bạn cũng có thể thệm hoặc lấy các giá trị từ vị trí trong mảng, bằng cách sử dụng cặp dấu ngoặc vuông và trong đó là các chỉ số, hay vị trí của mảng bạn cần. Để làm điều đó, bạn phải hiểu rằng ActionScript sử dụng các mảng phần có phần tử bắt đầu là 0, nó có nghĩa là giá trị đầu tiên tại vị trí 0, thứ hai tại vị trí 1, tiếp theo tại vị trí 2, v..v Như ví dụ, để lấy giá trị đang tồn tại ở vị trí thứ 4 từ mảng, bạn phải yêu cầu phần tử tại vị trí 4. var myarray:array = ["a", "b", "c", "d", "e"] trace(myarray[4]) //"e" xuất hiện ở Output panel Đây là các loại khác nhau của mảng, như là mảng của mảng (các mảng bên trong các mảng có thể tương tự như cấu trúc database) và các mảng kết hợp (nó lưu trữ không chỉ giá trị tuyến tính, nhưng cũng là một cặp các phần tử - giá trị và tên thuộc tính để thể hiện giá trị đó), như ví dụ. Tuy nhiên, vì các ràng buộc, chúng ta tập trung trên các loại mảng phổ biến:

25 mảng tuyến tính. Những cái khác sử dụng các cấu trúc mảng sẽ được làm rõ trong các chương tiếp theo. 6. Hàm. Hàm là một phần không thể thiếu của việc lập trình mà trong đó chúng được bao bọc bên trong các khối có thể được thực thi khi cần. Chúng cũng cho phép các khối code được sử dụng lại và sửa chữa hiệu quả, không cần copy, paste, và sửa chữa lặp lại nhiều lần. Không có hàm, toàn tộ code sẽ được thực thi trong trình tự tuyến tính từ lúc bắt đầu đến lúc kết thúc, và sửa đổi những yêu cầu thay đổi rất là đơn giản xuất hiện sự lặp lại code. Việc tạo một hàm đơn giản yêu cầu hơn một chút xung quanh code bạn muốn để thực hiện với một cú pháp đơn giản cho phép bạn đưa ra một khối bởi một cái tên nào đó. Sự thực hiện hàm nào đó yêu cầu sau đó chỉ là bạn gọi hàm bằng cái tên đó. Cấu trúc sau đây thể hiện một hàm mà lưu dấu vết một string ra Output panel. Hàm này được định nghĩa và sau đó, để minh họa quá trình, được gọi ngay lập tức. (Trong các kịch bản thực tế, các hàm luôn được gọi tại một vài thời điểm khác nhau hay từ các vị trí khác nhau, như khi người sử dụng click vào một button với chuột chẳng hạn). Đầu ra được mô tả trong chú thích của hàm đó. function showmsg(){ trace("hello"); showmsg(); //hello Nếu sử dụng lại code và thực thi code chỉ khi cần là ưu điểm của các hàm, bạn đã biết một sự hữu ích để làm tăng thêm sự thực thi tuyến tính của ActionScript bởi vì nó cho phép bạn nhóm code của bạn trong các thủ tục con mà có thể thi hành tại bất cứ thời điểm nào và tại bất kỳ thứ tự nào. Tuy nhiên, bạn có thể cũng làm nhiều hơn với các hàm để thu được khả năng lớn hơn. Ví dụ, cho rằng bạn cần thay đổi mục đích của các hàm nhỏ trước đó. Hãy nói là bạn cần đánh dấu 10 thông điệp khác nhau. Để làm điều đó không cần những tính năng mới, bạn có thể tạo 10 hàm và thay đổi string mà gửi ra Output panel cho mỗi hàm. Tuy nhiên, điều này có thể dễ hoàn thành dàng hơn với việc sử dụng các đối số, hay là các biến địa phương mà chỉ tồn tại trong bản thân các hàm đó. Bằng cách thêm vào một đối số khi khai báo hàm, trong trường hợp này string đối số là msg, bạn có thể truyền một giá trị vào trong đối số đó khi bạn gọi hàm. Bằng cách sử dụng đối số trong thân hàm, nó sẽ giữ bất cứ giá trị nào được gửi đi. Trong ví dụ này, hàm lưu dấu vết chữ hello mỗi lúc nó được gọi. Thay vì, nó lưu vết bất cứ text nào được gửi vào trong đối số của nó khi hàm được gọi. Khi sử dụng các đối số, điều này là cần thiết để kiểu dữ liệu trong Flash biết làm thế nào để tác động và có thể đưa ra nhiều cảnh báo cần thiết để thông báo bạn các lỗi. function showmsg(msg:string) { trace(msg); showmsg("goodbye"); //goodbye

26 Nó cũng có thể trả về một giá trị từ hàm, làm tăng sự tiện dụng của nó. Có thể trả về một giá trị từ script khi nó được gọi nghĩa là hàm có thể thay đổi khả năng vào và ra của chính nó. Bao gồm như là các ví dụ theo sau để chuyển một nhiệt độ từ giá trị độ C sang độ F và từ độ F sang độ C. Trong cả hai trường hợp, một giá trị được đưa vào trong hàm và một kết quả tính toán được trả lại cho script. Ví dụ trước tiên ngay lập tức lưu vết các kết quả ra, trong khi ví dụ thứ hai lưu giữ giá trị trong một biến. Để làm theo trong thực tế áp dụng trong khi bạn có thể vận dụng ngay vào giá trị trả về hay lưu trữ và xử lý nó vào thời gian sau đó. function celtofar(cel:number):number { return (9/5)*cel + 32; trace(celtofar(20)); //68 function fartocel(far:number):number { return (5/9)*(far - 32); var celdeg:number = fartocel(68)); trace(celdeg); //20 Chú ý rằng, khi trả về một giá trị từ một hàm, bạn sẽ cũng khai báo kiều dữ liệu của giá trị trả về. Điều này cũng thu được giống như cách khi áp dụng một kiểu dữ liệu khác với dấu hai chấm bởi kiểu dữ liệu cụ thể cho hàm đó và mẫu này là được đặt giữa dấu ngoặc đơn đóng các tham số và dấu ngoặc móc mở của hàm. Khi bạn sử dụng để thực hành, nó là tốt nhất để chỉ rõ void cho kiểu trả về khi hàm của bạn không trả về một giá trị nào. 7. Các đối tượng tùy chọn Chỉ sau một khoảng thời gian ngắn làm việc với ActionScript, bạn sẽ hiểu rõ những thứ bạn được nhúng bên trong các đối tượng. Hầu hết các thực thể riêng biệt trong ActionScript là con cháu của các lớp đối tượng và giữ cách xử sự trong một kiểu nhất quán tin cậy. Điểm chính của cách xử sự này là khả năng cho một đối tượng có các thuộc tính (nó là các phần tử về cơ bản mô tả cấu tạo nên các thành phần của đối tượng như là chiều rộng, vị trí, sự quay, ), các phương thức (nó là hành động của đối tượng có thể thi hành), và các event (các event tùy chọn như là click chuột, hay một phím nhấn, có thể gây ra các xử lý khác trong tiến trình làm việc với script). Bạn cũng có thể tạo các đối tượng tùy ý và định nghĩa các thuộc tính, phương thức, và các event của riêng bạn. Để giải thích điều này, chúng ta sẽ tạo một đối tượng tùy ý gọi mặt phẳng và cho nó các thuộc tính để chỉ mức độ nghiêng, cuộn, trượt. Các thuộc tính này là điều kiện để miêu tả sự quay vòng mà trong không gian 3D. Nếu bạn nghĩ chính bạn được ngồi trong một mặt phẳng, mức độ nghiêng là góc quay mà sẽ gây ra để tiến mặt phẳng đi lên và xuống. Sự cuộn là góc quay mà mà sẽ gây ra cho mặt phẳng để quay tròn tiến về phía trước cùng với độ dài của mặt phẳng, giữ mặt tiến về trước như bạn lên liên tục xuyên suốt dãy bậc thang giữa hai đầu. Cuối cùng, sự trượt là góc quay mà tới từ phía trước vuông góc xuyên qua điểm bạn ngồi trên mặt phẳng, nguyên nhân mặt phẳng quay tròn trong một mặt phẳng quay ở đây mặt trước sẽ không còn là bề mặt trước nữa.

27 Không có điều kiện cho mặt phẳng, sự nghiêng, quay, và trượt là phần của thư viện ActionScript. Tuy nhiên, bằng cách tạo một đối tượng tùy ý, chúng ta sẽ tạm thời tạo chúng có thể dùng được với script của chúng ta nếu chúng luôn luôn có. Bước trước tiên trong tiến trình là tạo một đối tượng. Nó được tạo, chúng ta có thể thêm vào và đặt các thuộc tính: var plane:object = new Object(); plane.pitch = 0; plane.roll = 5; plane.yaw = 5; Các giá trị này sẽ gửi cho mặt phẳng trong sự quay chậm bằng tay sang bên phải. Chúng có thể gọi mọi lúc, bởi câu try vấn các thuộc tính giống như cách tạo nó. trace(plane.pitch); //0 Sự tạo một đối tượng tùy ý chứa đựng các thuộc tính là một cách tác động hiệu quả cao đó là gửi nhiều tham số tùy chọn trong một hàm. ActionScript 3.0 không thích có một biến kiểu number của một tham số hay các giá trị cho các tham số này. Nếu bạn định nghĩa 5 tham số, nó sẽ nghĩ rằng 5 tham số sẽ bỏ qua nếu bạn chọn để bỏ qua mọi thứ, nó cũng dễ dàng truyền vào những số không biết của giá trị các tham số từ đầu đến cuối một tham số cố định mà chứa đựng một đối tượng. Bạn có thể phân tách sau đó các giá trị từ đối tượng này trong hàm, khởi chạy để bắt đầu các giá trị của các thuộc tính cụ thể mà bỏ qua. Đây là một ví dụ, sử dụng đối tượng Plane được tạo trước đó. function showplanestatus(obj:object):void { trace(obj.pitch); trace(obj.roll); trace(obj.yaw); ; showplanestatus(plane); //0 //5 //5 8. Từ khóa this Từ khóa this là một tham chiếu đến đối tượng containing của một phương thức. Khi mà script thực hiện, từ khóa this tham chiếu đối tượng có chứa các script. Bên trong lòng phương thức, từ khóa this tham chiếu các phiên bản lớp có chứa các phương thức gọi. Mặc dù một chút chưa rõ để bắt đầu với ActionScript, this có thể là người bạn của bạn. Nó cơ bản là cách dùng nhanh cho bất kỳ đối tượng hay phạm vi nào bạn đang làm việc lúc này. Phạm vi là khu vực hay khoảng không gian trong khi mà một đối tượng tồn tại. Ví dụ, một movie clip trong timeline của Flash. Mỗi đối tượng này có một khu vực duy nhất, nên một biến hay hàm được định nghĩa trong movie clip sẽ không tồn tại trong timeline chính, và ngược lại. Nó là dễ dàng nhất để hiểu cách sử dụng this trong ngữ cảnh, nhưng ở đây là hai ví dụ để bạn bắt đầu. Nếu bạn muốn tham chiếu tới chiều rộng của movie chứa trong movie clip được gọi là mc từ trong timeline chính, bạn phải theo cách này:

28 this.mc.width; Nếu bạn muốn tham chiếu tới timeline chính từ movie clip trong đó, bạn phải viết thế này: this.parent.mc.width; Trong cả hai trường hợp, this là điểm tham chiếu từ cái bạn bắt đầu đường dẫn của bạn. Nó khá phổ biến để đưa vào từ khóa khi kéo xuống từ phạm vi hiện tại (như là trong ví dụ đầu tiên). Điều này là bởi vì Flash phải hiểu những gì lớp cha thực sự là một cha của nó trong thứ tự bắt đầu đi theo thứ tự cấp bậc. Hình dung một gia đình hợp nhất từ một vài gia đình thành viên, bao gồm các anh, em họ và nhiều thế hệ, hiện tại, và bạn thấy rằng mẹ, cha, hay ông bà của bạn. Nếu bạn chỉ cần nói cha mẹ, mọi cha mẹ khác sẽ được biết. Nếu bạn thay vì nó cha mẹ tôi hay cha mẹ của mẹ tôi, điều đó sẽ đủ cụ thể để bạn đứng đầu hướng từ bên phải. 9. Absolute versus Relative Addresses (Địa chỉ tuyệt đối và tương đối) Giống như HĐH có các thư mục (folder) hay cấu trúc file của 1 website, bạn có thể tham chiếu đến 1 đối tượng trong flash bằng đường dẫn trực tiếp hoặc các đường dẫn có liên quan tới các đối tượng có liên quan đến đối tượng cần tham chiếu (đường dẫn gián tiếp). Thật dễ dàng nếu dùng đường dẫn trược tiếp đến một đối tượng đã biết chính xác bất kì trong flash, tuy nhiên điều đó có vẻ cứng nhắc và sẽ không còn đúng nếu rõ nghĩa và có tính mềm dẻo khi viết chương trình. Ta có thể xem 2 ví dụ sau: Ở cả 2 bảng thì mã lệnh được viết ở Main timeline của flash và tham chiếu đến mc2 nằm trong mc1 của flash nhưng cách viết khác nhau * Bảng 2-2 thì bắt đầu từ timeline chính của Flash (lv0) chỉ tiếp đến mc1 rồi đến mc2 (tăng dần level) Mã lệnh trace(this.mc1.mc2.x) đưa ra tọa độ x của mc2 nằm trong mc1 được đặt ở timeline chính của flash * Bảng 2-3 Theo mình hiểu thì đặt mã lệnh ở MovieClip thứ 3 sau đó up lên khung hình chính (nơi có mc1) và down xuống MovieClip 2 nằm trong MovieClip 1

29 Chương 3: Các thuộc tính, phương thức và sự kiện Trong chương này: - Các thuộc tính kế thừa - Các thuộc tính - Các event - Các phương thức - Sự truyền event - Frame và các event Timer - Xóa đi các event listener - Những gì tiếp theo? Thêm vào nền tảng cốt lõi ngôn ngữ cơ bản đã thấy ở chương trước, bạn sẽ tìm ra nhiều thứ trong script của bạn viết ra sử dụng các thuộc tính, phương thức, event. Điều này là cơ bản để xây dựng nên các khối script thực hiện nhiệm vụ và cho phép bạn nhận và thiết lập các đặc điểm, đưa ra hướng dẫn và tác động trở lại để nhập từ nhiều phần tử Flash. Các thuộc tính. Các thuộc tính có một chút là hơi giống với các tính từ trong những từ diễn tả đối tượng hiện tại để sửa đổi và truy vấn. Ví dụ, bạn có thể kiểm tra hay thiết lập chiều rộng của một button. Hầu hết các thuộc tính là đọc và ghi, trong những trường hợp có thể cả thu được và gán các giá trị của chúng. Một vài thuộc tính, tuy nhiên là chỉ đọc, nó có nghĩa là bạn có thể yêu cầu thông tin nhưng không được thay đổi các giá trị của chúng. Các phương thức. Các phương thức có một chút giống với động từ. Chúng được sử dụng nói cho đối tượng để làm một vài thứ, như là chơi hay dừng. Trong một vài trường hợp, các phương thức có thể được sử dụng để đơn giản hóa sự thiết lập của các thuộc tính. Bạn phải sử dụng một phương thức được gọi là set-size(), ví dụ như, để đồng thời thiết lập chiều rộng và chiều cao của một vài thứ. Các phương thức khác là duy nhất, như là navigatetourl(), nó chỉ dẫn cho trình duyệt hiển thị một trang web. Các Event. Các event là vật tương tác để khởi sự một hành động bạn viết ra, thiết lập các thuộc tính và gọi các phương thức. Cụ thể như, một người sử dụng phải click chuột vào button, mà kết quả sau đó trong một event mouse. Event đó sau đó gây ra một hàm thực thi, thi hành các hành động mong muốn. Event handlers(bộ quản lý sự kiện) là phần tử trung gian giữa các event và thậm chí là gọi các hàm. ActionScript 3.0 đã thống nhất sự quản lý các event trong hệ thống nhất quán được gọi là event listeners, nó thiết lập để lắng nghe cho sự xuất hiện của event cụ thể và tác động trở lại phù hợp. Trong chương này, bạn sẽ xây dựng một tiện ích mà sẽ giải thích cho mỗi cấu trúc ActionScript. Bằng cách tạo các event cho chuột và bàn phím, bạn sẽ vận dụng một vài thuộc tính phổ biến, cũng như thực thi một vài phương thức. Rất nhiều các phần tử ActionScript có các thuộc tính, phương thức và event. Để rõ ràng hơn, chúng tôi sẽ tập chung chính vào movie clip. Sử dụng movie clip để làm trung tâm thảo luận của chúng ta sẽ tạo nó dễ dàng hơn để tham khảo hệ thống trợ giúp của Flash, tài nguyên trực tuyến, và các văn bản bổ sung để thêm vào các thông tin, như bạn thấy để các thuộc tính khác có thể vận dụng.

30 1. Các thuộc tính kế thừa Một điều quan trọng trong tất cả để hiểu khi tham khảo các thuộc tính là các phần tử ActionScript thường chia sẻ các thuộc tính phổ biến với các phần tử khác. Một lý do cho điều này đó là chúng liên hệ với nhau trong một vài phương diện, như là con cháu cùng một cha mẹ. Trong trường hợp này, con kế thừa các thuộc tính từ cha của nó. Chúng ta đã giới thiệu khái niệm này một chút ở trong chương 1 khi mà chúng ta nói về các class. Xem xét các ý tưởng đó là một cô con gái, bởi sự khác nhau giới tính với cha cô ấy, một vài tính cách, hay thuộc tính, đó là khác biệt từ người cha. Tuy nhiên, họ cũng chia sẻ một vài đặc điểm chung như là mắt, màu tóc. Chúng ta sẽ xem sự chia sẻ thuộc tính xâu hơn trong toàn bộ cuốn sách này, nhưng bây giờ, toàn bộ bạn cần biết là ActionScript tham chiếu thường được sắp xếp bởi các class, và nó cũng sẽ không cần thiết và cồng kềnh để liệt kê các thuộc tính giống nhau cho nhiều class liên quan. Sự xem xét movie clip, ví dụ, mọi phần tử Flash có thể được hiển thị trên stage, movie clip nằm trong số chúng. Có thể có tọa độ x, y hay vị trí trên stage. Sự liệt kê các thuộc tính này cho mọi mục sẽ mất rất nhiều không giản và làm tài nguyên thêm chút khó khăn để đi qua toàn bộ. Để đơn giản hóa mọi thứ, thuộc tính x và y là kiểu được liệt kê các thuộc tính kế thừa, là đúng trong hệ thống Flash trợ giúp. Để xem các thuộc tính kế thừa, ví dụ, trong hệ thống trợ giúp Flash, chỉ click vào link Show Inherited Public Properties sẽ tìm ra ngay lập tức bên dưới tiêu đề Public Properties. 2. Properties (thuộc tính) Nếu bạn nghĩ rằng các thuộc tính theo các cách mà để mô tả một đối tượng, chúng trở thành bản tính thứ hai. Yêu cầu thông tin một movie clip ở đây là, ví dụ như, sự thiết lập chiều rộng mô tả ở các bước đó cả hai đều sử dụng các thuộc tính. Trong chương 2, chúng ta sẽ thảo luận ngắn gọn về mẫu đối tượng và cú pháp dùng dấu chấm đưa ra thứ tự và cấu trúc cho ActionScript cũng như là nhiều ngôn ngữ script và ngôn ngữ lập trình khác. Sự tham chiếu một thuộc tính bắt đầu với một trường hợp cụ thể - gọi movie clip hình vuông của chúng ta là box bởi vì bạn phải quyết định các phần tử bạn muốn truy vấn tới hay thay đổ. Nếu chúng ta xem xét một file kiểm tra chỉ duy nhất với một movie clip trong nó, ví dụ cụ thể như là box, toàn bộ những thứ còn lại là sự tham chiếu thuộc tính và một trong hai sự thiết lập hay nhận về giá trị. Để bắt đầu, chúng tôi sẽ thể hiện cho bạn cấu trúc để làm 5 thay đổi thuộc tính movie clip trong bảng sau. Sau đó, khi chúng tôi giải thích làm thế nào để điều khiển các event trong các phần tiếp theo, chúng ta sẽ thay đổi các thuộc tính này tương tác với nhau. Theo sau các ví dụ giả sử rằng một movie clip một hình vuông trong stage, và có một tên cụ thể là box. Hình 3-1 giải thích sự thay đổi cơ bản bằng mỗi thuộc tính. Màu sáng của hình vuông là màu của stage khi movie clip được chuyển dịch đi.( thuộc tính alpha thể hiện trạng thái cuối cùng). Nét đứt thuộc tính visible là chỉ thể hiện box là khi không visible.

31 Bảng 3-1 thể hiện 6 thuộc tính movie clip với cú pháp ví dụ và chú ý về việc mỗi đơn vị của thuộc tính. Nếu bạn có kinh nghiệm với các version trước đó của ActionScript, bạn có thể để ý thấy một vài sự chuyển đổi trong cú pháp thuộc tính. Trước tiên, các thuộc tính không bắt đầu bằng dấu gạch dưới. Điều này có ích là đảm bảo tính chắc chắn với ActionScript 3.0. Còn hơn là cú pháp thuộc tính không ổn định, có dấu gạch dưới hay không có dấu gạch dưới đừng ở đằng trước. Thứ hai, một vài dải giá trị được sử dụng từ bây giờ là 0-1. Ví dụ bao gồm cả scalex, scaley, và alpha. Thay vì sử dụng 50 để thiết lập một giá trị 50%, cụ thể là 0.5 Cuối cùng, trước tiên gọi phương thức sử dụng các thuộc tính scalex và scaley, hơn là _xscale và _yscale, nó tương tự như AS1/AS2. Điển hình là các thuộc tính AS3 sẽ đưa ra các bản x, y của thuộc tính như là một hậu tố, để tham chiếu tới thuộc tính dễ dàng hơn. Bảng 3-1 thể hiện cú pháp thiết lập một thuộc tính. Sự truy đến giá trị của thuộc tính, cũng được biết như sự trả về thuộc tính, nó rất là dễ dàng. Ví dụ, nếu bạn muốn đưa ra giá trị alpha của box, hay lưu trữ nó vào một biến, bạn có thể ghi cả hai như sau: trace(box.alpha); var balpha:number = box.alpha; Bạn có thể cũng sử dụng toán tử gán để dễ dàng cập nhật lại các giá trị. Như code bên dưới thêm 20 đơn vị và giá trị rotation hiện tại của box. box.rotation += 20; 3. Events (sự kiện) Các event làm cho thế giới Flash đi một vòng thế giới. Chúng chịu trách nhiệm cho sự thiết lập các script của bạn trong hoạt cảnh, bởi ví chúng được thực thi. Một nút có thể được tác động bởi sự kiện chuột, text fields tác động với các sự kiện bàn phím gọi các hàm bạn viết là thông qua các sự kiện tùy chọn. Các sự kiện thì đa dạng. Thêm vào nữa các sự kiện hiển nhiên như là chuột và bàn phím nhập vào, hầu hết các lớp ActionScript đều có các sự kiện đó. Ví dụ, các sự kiện được bắn ra khi xem một video, làm việc với text, và thay đổi kích thước stage. Đòi hỏi các sự kiện này điều khiển ứng dụng của bạn, bạn cần phải tìm ra sự xuất hiện của chúng. Trong các version trước đó của ActionScript, có nhiều cách để bắt sự kiện. Bạn có thể áp

32 dụng một script tự động cho một button, ví dụ, cách giải quyết là sử dụng on(release). Như kỹ năng ngôn ngữ, bạn có thể tạo các sự kiện xử lý và áp dụng chúng từ xa sử dụng các tên cụ thể (instance names để chỉ tên các đối tượng), việc sử dụng mybutton.onrelease là một ví dụ. Cuối cùng, bạn có thể sử dụng các sự kiện lắng nghe, chủ yếu với các thành phần hay các đối tượng tùy chọn. Trong ActionScript 3.0, việc bắt sự kiện được đơn giản hóa bằng cách dựa vào một phương pháp để xử lý toàn bộ các event, nó là sử dụng việc lắng nghe các sự kiện không quan tâm đến kiểu sự kiện hay làm thế nào để sử dụng được nó. Lớp EventDispatcher để giám sát việc lắng nghe sự kiện không phải là mới, nhưng nó đã được cải tiến và bây giờ chịu trách nhiệm để xử lý phần lớn các sự kiện trong AS3. Class EventDispatcher cho phép bạn lắng nghe sự xuất hiện các sự kiện bằng cách đặt việc lắng nghe các sự kiện vào trong dịch vụ, loại bỏ toàn bộ code của bạn bằng việc loại bỏ sự lắng nghe từ dịch vụ, và điều chỉnh các sự kiện khi bạn cần một sự kiện xuất hiện cụ thể lúc nào. Bạn có thể cũng kiểm tra xem một đối tượng lắng nghe đã được thiết lập cho sự kiện hay chưa, điều này chúng ta sẽ rõ hơn sau khi chúng ta nói về sự lan truyền sự kiện. Using Event Listeners (Sử dụng các Event Listener) Các khái niệm việc lắng nghe sự kiện khà là đơn giản. Hình dung rằng bạn đang trong hội trường chứa 100 người. Chỉ một người trong khán thính giả đã đưa ra hướng dẫn làm thế nào để trả lời khi người thuyết trình hỏi một câu hỏi cụ thể. Trong trường hợp này, một người đã được nói cho nghe một sự kiện cụ thể, và hành động theo hướng dẫn đã được cung cấp khi sự kiện này xuất hiện. Bây giờ hình dung nhiều người trả lời cần phải được lên kế hoạch. Ví dụ, khi người thuyết trình cần sân khấu, ánh sáng phải bị mờ đi. Khi người thuyết trình nhấn lên một thiết bị cầm tay, một thiết bị nghe nhìn phải tiến lên trước video trong trình diễn. Khi mỗi video kết thúc, người thuyết trình phải tác động lại bằng cách giới thiệu vật trưng bày tiếp theo trong bài diễn thuyết. Cuối cùng, khi một khán thính giả giơ tay lên, một người trợ diễn thuyết sẽ mang một chiếc microphone tới giúp cho khán thính giả trong việc hỏi câu hỏi của họ. Đây là toàn bộ sự tác động trở lại của các sự kiện cụ thể đó xuất hiện trong quá trình diễn thuyết. Một vài thứ đã được lên kế hoạch và hướng tới người tiếp nhận cụ thể như là gây ra tác động của kỹ thuật viên để tiến để đưa lên video tiếp theo trong trình tự. Những cái khác không được lên kế hoạch, chẳng hạn như khi nào, hoặc thậm chí nếu một thính giả có một câu hỏi. Mỗi nhóm thích hợp trong những thứ hỗn độn đã được nói nói sự kiện đó lắng nghe và làm thế nào hành động lại khi và sự kiện đó xuất hiện. Tạo một sự kiện lắng nghe, nó hầu hết là cơ bản, và khá là không phức tạp. Điều đó làm cho việc xử lý mọi thứ trở nên đơn giản hơn là thêm vào khả năng cho hệ thống và có thể được sử dụng các ưu điểm của bạn. Bước chính đầu tiền là định nghĩa một chủ thể của việc lắng nghe, chúng có thể đã được nói để lắng nghe cho một sự kiện cụ thể. Một ví dụ dễ dàng để hiểu đó là một button có thể được nói cho biết lắng nghe một sự kiện chuột có thể tác động với script trước đó. Khi bạn đã định nghĩa được một phần tử mà có thể lắng nghe cho một sự kiện, bước chính tiếp theo là chọn một sự kiện thích hợp cho phần tử đó. Ví dụ, nó cần xác minh cho một nút để lắng nghe một sự kiện chuột, nhưng nó cần xác định ít hơn cho cùng button để lắng nghe

33 đến khi kết thúc một video hay đưa trở lại trạng thái ban đầu của stage. Nó có thể thích hợp hơn cho video player để lắng nghe khi kết thúc đoạn video, và stage lắng nghe bất cứ sự kiện định lại kích cỡ ban đầu. Mỗi phần tử tương ứng có thể sau đó hành động, hay chỉ dẫn cho cái khác hành động, khi một event xuất hiện nó là bước chính thứ ba trong sự thiết lập một listener. Để định nghĩa sự chỉ dẫn đó phải được thực thi khi một sự kiện xuất hiện, bạn dễ dàng để viết một function và nói cho các sự kiện lắng nghe một tham số để gọi hàm khi mà các sự kiện xuất hiện. Các function đó sự dụng tham số để nhận thông tin các sự kiện mà được gọi nó, cho phép hàm sử dụng một vài từ khóa của dữ liệu trong quá trình nó thực thi. rotate_right_btn.addeventlistener(mouseevent.mouse_up, onrotateright); function onrotateright(evt:mouseevent):void { box.rotation += 20; Để liên kết chúng cùng nhau, phương thức addeventlistener() được sử dụng để định nghĩa sự kiện và chỉ định chức năng để thực thi các đối tượng đó được hỗ trợ cho việc lắng nghe. Hãy trở lại ví dụ với button, button này có thể lắng nghe cho sự kiện mouse up. Button được gọi là rotate_right_btn, và chức năng có thể thực thi là onrotateright(). Code như thế này: rotate_right_btn.addeventlistener(mouseevent.mouse_up, onrotateright); function onrotateright(evt:mouseevent):void { box.rotation += 20; Trong dòng 1, bạn bắt đầu với tên của button và sau đó thêm phương thức addeventlistener(). Phương thức yêu cầu 2 tham số bắt buộc. Tham số đầu tiên là sự kiện mà bạn muốn lắng nghe. Mỗi sự kiện bạn sẽ cố gắng bắt lại, nó là sự kiện gắn kèm(built-in) hay là một event tùy chọn của bạn, ban đầu trong lớp đó định nghĩa sự kiện đó, và chính các sự kiện luôn được định nghĩa như một hằng số trong lớp đó. Ví dụ, lớp MouseEvent chứa đựng các hằng số mà ám chỉ các sự kiện chuột như là mouse up và mouse down. Ví dụ này sử dụng hằng số MOUSE_UP để tham chiếu đến sự kiện mouse up. Một ví dụ khác gồm có hằng số ENTER_FRAME trong lớp Event, mô phỏng cập nhật bắt đầu play và sự kiện KEY_UP trong lớp KeyboardEvent để bắt giữ người dung nhập từ bàn phím.. Chúng ta sẽ xem cả hai sự kiện này sau trong chương này. Tham số thứ hai là hàm có thể được gọi khi mà sự kiện đã nhận được. Trong ví dụ này, một tham chiếu đến hàm onrotateright(), được định nghĩa từ dòng 2 đến dòng 4, đã được thiết lập. Bạn hầu như chắc chắn quen thuộc với cấu trúc của hàm từ sự thảo luận về hàm trong chương 2. Để xem lại, nội dung của hàm được định nghĩa bằng cặp dấu ngoặc nhọn. Trong trường hợp này, dòng 3 thêm 20 đơn vị cho giá trị rotation(phép quay) hiện tại của movie clip box. Cũng được giải thích trong chương 2, giá trị void mà theo sau tên hàm và dấu ngoặc chỉ cho biết rằng không có giá trị gì được trả về bởi hàm đó. Những gì không được giải thích đầy đủ là các đối số của hàm mà nhận từ các sự kiện đó. Không giống như các hàm tùy chỉnh, đối số trong các hàm lắng nghe sự kiện phải được yêu cầu. Trong đoạn code ví dụ sau, nó được đặt tên tùy là evt và nhận thông tin về phần tử phát động sự kiện. Nếu hữu ích, bạn có thể truyền thông tin từ tham số này để sử dụng trong hàm, điều này bạn sẽ thấy bên dưới đây. Tham số phải được gõ để các dữ liệu dự kiến. Điều này

34 sẽ giúp cho bạn tìm ra các lỗi nếu một sự kiện gõ không đúng loại nhận được. Trong trường hợp này, bởi vì chúng ta đang lắng nghe cho MouseEvent, đó là loại dữ liệu được sử dụng cho tham số đó. Để minh họa điều này, hãy xem các ví dụ sự kiện chuột khác. Tuy nhiên lúc này, chúng ta sẽ xem nhiều sự kiện, và truyền các thông tin từ các đối số để hiển thị một vài lợi ích của cấu trúc này. mymovieclip.addeventlistener(mouseevent.mouse_down, onstartdrag); mymovieclip.addeventlistener(mouseevent.mouse_up, onstopdrag); function onstartdrag(evt:mouseevent):void { evt.target.startdrag(); function onstopdrag(evt:mouseevent):void { evt.target.stopdrag(); Trong ví dụ này, 2 sự kiện lắng nghe được chỉ định cho một movie clip. Một lắng nghe cho sự kiện mouse down, cái khác lắng nghe cho mouse up. Mỗi chúng gọi các hàm khác nhau. Tuy nhiên trong cả hai hàm, thuộc tính target của sự kiện, nó được tìm từ tham số của hàm, được sử dụng để định nghĩa các phần tử nhận được từ sự kiện chuột. Điều này cho phép hàm ở dòng 3 bắt đầu việc kéo movie clip mà đã được click, cả hai không chỉ rõ movie clip bởi chính tên của nó (hiểu rằng nó thông qua target chứ ko chỉ ra đối tượng movie clip cụ thể). Cách tiếp cận chung này rất hữu ích bởi vì nó làm cho hàm trở nên mềm dẻo hơn. Hàm có thể tác đụng lên bất cứ item thích hợp mà được click hay được truyền qua đối số của nó. Nói cách khác, giống như hàm có thể bắt đầu và dừng việc kéo bất kỳ movie clip mà cùng sự lắng nghe đã được thêm vào. Trong các file mã nguồn đi kèm, file start_stop_drag.fla thể hiện điều này bằng cách thêm dòng dưới này vào sau ví dụ trước: mymovieclip2.addeventlistener(mouseevent.mouse_down, onstartdrag); mymovieclip2.addeventlistener(mouseevent.mouse_up, onstopdrag); Một cách dễ dàng bởi việc thêm vào các movie clip để thực hành, và chỉ định sự lắng nghe, bạn có thể kéo và thả mỗi movie clip. Using Mouse Events to Control Properties Sử dụng Mouse Event để điều khiển các thuộc tính. Bây giờ chúng ta có thể kết hợp cú pháp chúng ta bao hàm trong phần Thuộc tính và Sự kiện, thiết lập điều khiển tương tác trên các thuộc tính. Trong thư mục chương 03 kèm theo mã nguồn cho cuốn sách này, bạn sẽ tìm một file gọi là props_events.fla. Nó chứa đựng những gì hơn là movie clip box, và 2 button trong thư viện đó được sử dụng để lặp lại sự thay đổi 4 thuộc tính đã thảo luận dễ dàng hơn. Movie clip chứa đựng các con số thể hiện các frame của nó là thấy được trong bất kỳ thời gian nào, và một tên đối tượng của mỗi button sẽ tương ứng với mục đích đó. Bao gồm move_up_btn, scale_down_btn, rotate_right_btn, fade_up_btn, and toggle_visibility_btn, giữa những cái khác. Bắt đầu phần chính của chương dự án chứa đựng một vài button mà sẽ thay đổi các thuộc tính của movie clip trung tâm. Hình 3-2 thể hiện bản thiết kế của file.

35 Hình 3-2. Bản thiết kế của file props_events.fla Bắt đầu với sự di chuyển, chúng ta cần định nghĩa một hoặc nhiều hàm để cập nhật vị trí của movie clip. Đây là hai cách cho nhiệm vụ này. Trước tiên là tạo một hàm cho toàn bộ sự di chuyển mà sử dụng điều kiện để quyết định làm thế nào để phản ứng lại mỗi sự kiện. Chúng ta sẽ giải thích những thứ đó khi chúng ta thảo luận về sự kiện bàn phím. Bây giờ, chúng ta sẽ đơn giản nhằm vào cách định nghĩa một hàm cơ bản riêng rẽ cho mỗi loại di chuyển như thể hiện ở ví dụ 3.1 Ví dụ 3-1. props_events.fla function onmoveleft(evt:mouseevent):void { box.x -= 20; ; function onmoveright(evt:mouseevent):void { box.x += 20; ; function onmoveup(evt:mouseevent):void { box.y -= 20; ; function onmovedown(evt:mouseevent):void { box.y += 20; ; Trước đó các hàm đã được định nghĩa, toàn bộ bạn phải làm là thêm sự lắng nghe tương ứng cho các button. move_left_btn.addeventlistener(mouseevent.mouse_up, onmoveleft); move_right_btn.addeventlistener(mouseevent.mouse_up, onmoveright); move_up_btn.addeventlistener(mouseevent.mouse_up, onmoveup); move_down_btn.addeventlistener(mouseevent.mouse_up, onmovedown); Việc xử lý đơn giản này sau đó được lặp đi lặp lại cho mỗi button trên stage. Việc còn lại là script tập hợp các thuộc tính và việc lắng nghe sự kiện đã nói ở trên để hoàn thành bản demo đã được thể hiện ở hình 3-2.

36 scale_up_btn.addeventlistener(mouseevent.mouse_up, onscaleup); scale_down_btn.addeventlistener(mouseevent.mouse_up, onscaledown); rotate_left_btn.addeventlistener(mouseevent.mouse_up, onrotateleft); rotate_right_btn.addeventlistener(mouseevent.mouse_up, nrotateright); fade_in_btn.addeventlistener(mouseevent.mouse_up, onfadein); fade_out_btn.addeventlistener(mouseevent.mouse_up, onfadeout); toggle_visible_btn.addeventlistener(mouseevent.mouse_up, ontogglevisible); function onscaleup(evt:mouseevent):void { box.scalex += 0.2; box.scaley += 0.2; ; function onscaledown(evt:mouseevent):void { box.scalex -= 0.2; box.scaley -= 0.2; ; function onrotateleft(evt:mouseevent):void { box.rotation -= 20; ; function onrotateright(evt:mouseevent):void { box.rotation += 20; ; function onfadein(evt:mouseevent):void { box.alpha += 0.2; ; function onfadeout(evt:mouseevent):void { box.alpha -= 0.2; ; function ontogglevisible(evt:mouseevent):void { box.visible =!box.visible; ; 4. Methods (Các phương thức) Các phương thức, các động từ của ngôn ngữ ActionScript, những hướng dẫn của chúng tương ứng với các đối tượng để hành động. Ví dụ, bạn có thể ra lệnh cho một movie clip dừng lại bằng cách sử dụng phương thức stop() của nó. Giống như các thuộc tính, các phương thức xuất hiện sau cú pháp là dấu chấm đó là một quy tắc của ActionScript, sau đó các đối tượng gọi phương thức. Ví dụ, nếu movie clip box trong timeline chính sử dụng phương thức stop(), cú pháp sẽ trông như thế này: box.stop(); Using Keyboard Events to Call Methods Sử dụng các sự kiện bán phím gọi các phương thức. Việc bắt giữ các sự kiện bàn phím rất là đơn giản hơn là bắt sự kiện chuột, với một ngoại lệ

37 đáng chú ý: đích nhắm tới của việc lắng nghe sự kiện là không theo tuần tự đối tượng bạn mong muốn để điều khiển. Khi làm việc với text, text field được điều khiển, thực vậy sự phục vụ như là đích nhắm tới của các sự kiện bàn phím. Khi sự điều khiển các movie clip, tuy nhiên trạng thái là chính nó thường là một sự hữu ích, đối tượng nhận sự kiện bàn phím tập trung vào đó. Sự thêm vào việc lắng nghe các trạng thái nghĩa là bạn có thể xử lý toàn bộ các phím sự kiện với một sự lắng nghe đơn giản, và sau đó tách ra duy nhất các phím sự kiện được đòi hỏi với một điều kiện, đưa ra các hướng dẫn phù hợp. Để đơn giản cú pháp phần cuối cùng của việc giải thích script, Chúng tôi sẽ sử dụng mẫu switch của câu lệnh điều kiện. Câu lệnh switch, xem lại trong chương 2, nó đơn giản hơn cả việc sử dụng cấu trúc điều kiện if/else-if. stage.addeventlistener(keyboardevent.key_down, onkeypressed); Chúng ta sẽ bắt đầu bằng việc thêm vào việc lắng nghe cho các trạng thái. Trong trường hợp này, chúng ta sẽ xem sự kiện key down, nó được cụ thể bằng việc sử dụng một hằng số giống như hầu hết các sự kiện được định nghĩa trước đó, nhưng lúc này nó là một phần của lớp KeyboardEvent. Khi sự kiện xuất hiện, việc lắng nghe sự kiện của chúng ta sẽ gọi hàm onkeypressed(). Tiếp theo, chúng ta sẽ định nghĩa hàm onkeypressed(), để sử dụng kiểu giá trị đối số nhận được như KeyboardEvent. Cuối cùng, chúng ta phân tách thuộc tính keycode từ thông tin sự kiện đưa tới đã được lưu vào đối số evt. keycode là số duy nhất được chỉ định cho mỗi phím và cho phép bạn xác định các phím đó đã được nhấn hay chưa. Một giá trị keycode được chỉ định cho mỗi phím, để giá trị này không thể được sử dụng cho trường hợp phím kiểm tra như là chữ hoa S có cùng keycode như là chữ thường s. Nếu bạn cần phân tách các trường hợp chính xác, sử dụng charcode, nói chỉ có các giá trị duy nhất cho mỗi trường hợp. Để chỉ cụ thể mỗi phím, chúng ta sẽ sử dụng các hằng số đã được định nghĩa trong lớp KeyBoard, hơn là phải nhớ mỗi giá trị số keycode. Điều này tạo cho nó sự dễ dàng để tham chiếu đến các phím Enter/Return như là Keyboard.ENTER, phím mũi tên bên trái như là Keyboard.LEFT,.v..v Chúng ta sẽ sử dụng 5 phím để gọi 5 phương thức. Khi mỗi phím chỉ định được nhấn, nó sẽ thực thi các phương thức tương ứng, và sau đó nhảy ra ngoài câu lệnh switch. Chúng ta cũng thêm vào một trạng thái giá trị mặc định khi đó sẽ chỉ ra keycode của các phím khác được nhấn. Phấn script cuối cùng trông như thế này: function onkeypressed(evt:keyboardevent):void { switch (evt.keycode) { case Keyboard.ENTER: box.play(); break; case Keyboard.BACKSPACE: box.stop(); break; case Keyboard.LEFT: box.prevframe(); break;

38 case Keyboard.RIGHT: box.nextframe(); break; case Keyboard.SPACE: box.gotoandstop(3); break; default: trace( keycode:, evt.keycode); ; Bốn phương thức đầu tiên là dựa trên sự điều hướng các tùy chọn, chơi, dừng lại, hay là gửi movie clip tới frame trước hay sau timeline của nó. Phương thức cuối cùng gửi movie clip tới frame thứ 3 và dừng việc chơi lại của nó. Chúng ta sẽ xem điều này và sự điều hướng tùy chọn chi tiết hơn trong chương 5 khi chúng ta thảo luận về điều khiển timeline. Code này có thể thấy trong file methods_events.fla trong mã nguồn kèm theo, cũng như các file kết hợp, props_methods_events.fla, nó bao gồm cả các thuộc tính và phương thức ví dụ trong chương này. Cảnh báo Sự phụ thuộc trong sự thiếp lập của bạn, nhiều phím sự kiện sẽ không có hàm thích hợp trong Flash khi sử dụng điều khiển Control>Test Movie. Điều này có lẽ không gây lỗi nhưng thay vào đó kết quả của Flash Player sử dụng các phím tắt bàn phím giống như ứng dụng Flash làm. Để kiểm tra phím sự kiện, đơn giản sử dụng Control>Disable Keyboard Shortcuts trên menu điều khiển để vô hiệu hóa các phím tắt trong Player (điều đó là sau khi yêu cầu Test Movie). Để đảm bảo rằng lại cho phép các phím tắt, hay bạn không muốn có thể sử dụng cmd+w (với hệ điều hành Mac) hay Ctrl + W (với Windows) để đóng cửa sổ, hay sử dụng các phím tắt tương tự. Như một sự lựa chọn, bạn có thể kiểm tra movie trong một trình duyệt. 5. Event Propagation (Lan truyền sự kiện) Đến nay trong chương này, chúng ta đang làm việc với các đối tượng trong danh sách hiển thị. Chúng ta sẽ giải thích danh sách hiển thị nhiều chi tiết hơn trong chương tới nhưng về bản chất danh sách hiển thị chứa đựng toàn bộ các đối tượng cơ bản trong file của bạn. Nó bao gồm stage, mọi file SWF được load, các hình, các nút v.v, cho đến toàn bộ các clip lồng nhau. Các đối tượng trong danh sách hiển thị là một phần của các luồng sự kiện đặc biệt thường được quy cho như là luồng sự kiện. Khi mà đích của các sự kiện nào đó, bao gồm cả sự kiện chuột và bàn phím là trong danh sách hiển thị, sự kiện này không gửi ngay lập tức đến đích sự kiện. Thay vào đó, nó được gửi đến danh sách hiển thị, và sự kiện lan truyền từ đầu danh sách xuống đích sự kiện và sau đó nổi (làm việc theo hướng của nó) ngược trở lại toàn bộ sách hiển thị lần nữa. Xem xét hai movie clip (mc2 và mc3) trong movie clip (mc1) đó trên stage. Tiếp nữa, hình dung rằng đích của sự kiện được lồng vào movie clip mc2. Khi sự kiện được yêu cầu xuất hiện, nó không gửi ngay lập tức tới mc2, nhưng đúng hơn là danh sách hiển thị. Trước tiên,

39 stage nhận sự kiện, sau đó mọi thứ xác đáng được load được các file SWF (bao gồm cả timeline chính, trong ví dụ này), sau đó movie clip cha mc1, và sau đó là đích của sự kiện mc2. Sau khi sự kiện nhận được qua đích đến, nó sau đó truyền ngược trở lại danh sách hiển thị mc2, root, và stage. Hình 3-3 miêu tả quá trình, thể hiện sự kiện chuột gửi từ trên danh sách hiển thị là stage, làm theo cách của nó đi qua timeline chính và movie clip cha cho tới khi nó tìm thấy đích sự kiện, và sau đó nổi lên trở lại qua lại danh sách hiển thị. Hình 3-3. Quá trình lan truyền sự kiện Sự lan truyền sự kiện có thể được sử dụng cho các ưu điểm lớn với một chút hoạch định. Ví dụ, hãy nói cả hai movie clip lồng vào nhau được thiết kế để tác động lại các sự kiện mouse over và mouse out. Bất cứ khi nào người dùng cuộn chuột lên trên một trong các clip đó, nó sẽ thay đổi giá trị alpha chỉ ra sự tương tác. Trong trường hợp này, thông thường bạn có thể phải gắn sự lắng nghe cho mỗi sự kiện cho mỗi movie clip. Đoạn code ví dụ sau, và hình 3-4 thể hiện kết quả, ở đây mỗi movie clip được thể hiện bởi một thư mục: folder0 và folder1. Ví dụ 3-2 thể hiện code file ví dụ. Ví dụ 3-2. event_propagational1.fla folder0.addeventlistener(mouseevent.mouse_over, onfolderover); folder0.addeventlistener(mouseevent.mouse_out, onfolderout); folder1.addeventlistener(mouseevent.mouse_over, onfolderover); folder1.addeventlistener(mouseevent.mouse_out, onfolderout); function onfolderover(evt:mouseevent):void { evt.target.alpha = 0.5; function onfolderout(evt:mouseevent):void { evt.target.alpha = 1; Hình 3-4 trình bày cách lắng nghe sự kiện, nó lắng nghe cho sự kiện mouse over và mouse out được gắn vào cả hai folder. Khi chuột ở trên một folder, giá trị alpha của nó thay đổi.

40 Hình 3-4. Sự tác động thay đổi giá trị alpha sử dụng sự kiện mouse over and mouse out Bây giờ hình dung rằng đang sử dụng cùng cách đó cho mọi folder, xem ở hình 3-5. Mã có thể khá là bao quát với toàn bộ sự lắng nghe cho mỗi folder. Tuy nhiên, với sự lan truyền sự kiện, nó có thể được gắn việc lắng nghe movie clip cha, folder_group (được đánh dấu bằng đường nét đứt). Sự kiện sẽ đổ xuống qua danh sách hiển thị, và hàm lắng nghe sự kiện thông thường đơn giản sẽ phân tách đối tượng đó với đích mong đợi. Mã đó bao gồm được rút gọn hơn nhờ có sự lan truyền sự kiện. folder_group.addeventlistener(mouseevent.mouse_over, onfolderover); folder_group.addeventlistener(mouseevent.mouse_out, onfolderout); function onfolderover(evt:mouseevent):void { evt.target.alpha = 0.5; function onfolderout(evt:mouseevent):void { evt.target.alpha = 1; Xem lại hình 3-5, các folder được đánh số từ trái qua phải, từ trên xuống dưới, bắt đầu từ 0. Hình dung rằng sự di chuyển chuột của bạn trên folder0. Đích của sự kiện được gửi tới danh sách hiển thị đó là folder0, nó sẽ lan truyền qua danh sách đến khi nó tới được folder0, và sau đó nó sẽ quay trở lại. Tương tự như vậy, nếu bạn đưa chuột lên trên folder5 hay là folder10, hàm lắng nghe sự kiện sẽ biết folder nào là đích tới bằng thuộc tính phân tách target của sự kiện, và giá trị alpha tương ứng với mỗi folder sẽ được thay đổi. Điều này được thấy trong file mã nguồn event_propagation2.fla. Hình 3-5 tái tạo lắng nghe sự kiện không được gắn cho mỗi folder, nhưng thay vào đó là movie clip cha (được thể hiện bằng nét đứt) bên trong nó là mỗi folder được đặt. Theo cách mà sự kiện lan truyền, sự kiện mouse over và mouse out tự động được gửi tới danh sách hiển thị ở đây chúng được nhận bởi mỗi con của movie clip đích.

41 Hình 3-5. Sử dụng movie clip cha để lan truyền sự kiện. Cảnh báo rằng Nó quan trọng để mà chú ý đó không phải là toàn bộ sự lan truyền sự kiện qua toàn bộ danh sách hiển thị. Sự kiện Frame là một ví dụ, mà chúng ta sẽ thảo luận trong phần tiếp theo, được gửi đi một cách tự động tới đích của sự kiện. Trước đây dựa trên sự lan truyền sự kiện, kiểm tra tài liệu làm sao để cư xử với sự kiện. Đặc biệt, thuộc tính bubbles là kiểu Boolean mà cho biết có cho sự kiện quay trở lại danh sách hiển thị hay không sau khi tìm thấy đích của nó. Để biết thêm thông tin, hay xem website hướng dẫn, nó bao gồm việc thảo luận về các giai đoạn sự kiện, sự ưu tiên thực thi, dừng sự lan truyền sự kiện và nhiều vấn đề nữa. Chú ý: Thăm dò ý kiến cuốn Essential ActionScript 3.0, chương 12, và 21 để biết thêm các thông tin thảo luận về sự lan truyền sự kiện 6. Frame and Timer Events Chúng tôi đã từng sử dụng sự kiện chuột và bàn phím bởi vì bạn gần như chắc chắn quen thuộc với chúng ở mức độ nào đó, và chúng là ý tưởng phù hợp cho nội dung bài hướng dẫn này. Tuy nhiên, đó là nhiều sự kiện trong ngôn ngữ ActionScript. Khi mà nó không thể chứa đựng mọi thứ, chúng ta sẽ muốn đi quanh chương này với các kiểu sự kiện quan trọng khác: frame và timer. Frame Events (Các sự kiện Frame) Các sự kiện frame không được khởi động bởi người dùng đưa vào, theo cách mà sự kiện

42 chuột và bàn phím. Thay vào đó, chúng xuất hiện tự nhiên như là file Flash chạy. Mỗi thời điểm từ đầu đi vào frame, một script frame đã được thực thi. Điều này nghĩa là các script frame đó thực thi chỉ một lần cho sự tồn tại của frame đó, làm cho chúng trơn chu hơn vị các vị trí thực thi các tác vụ, như là việc khởi tạo. Theo cách khác, để script frame thực thi hơn một lần, việc bắt đầu chơi dời đi và trả về là cùng frame bởi vì sự điều hướng của cấu trúc ActionScript, hay chơi lại vòng lặp trả về lúc đầu frame giá trị 1 khi nó đến điểm cuối cùng của timeline. Tuy nhiên, việc sử dụng lắng nghe sự kiện, bạn có thể nghe được sự kiên enter frame có định kỳ nó hiển thị các đối tượng, bao gồm timeline chính và các movie clip. Sự kiện enter frame được tiến hành cùng bước với khung hình (frame rate). Ví dụ, mặc định khung hình là 12 frame mỗi giây, mặc định trình tự enter frame là 12 lần cho một giây. Việc sử dụng sự kiện enter frame cho phép file bạn cập nhật thường xuyên đặc biệt là điều khiển các tài sản cơ bản (các tài sản ở đây hiểu là các button, movie clip, ) File enter_frame.fla kèm theo code mã nguồn giải thích cho sự kiện này bằng việc cập nhật lại vị trí của bánh xe đạp mỗi khi enter frame. Nó đặt bánh xe đạp đó tại vị trí của chuột và sau đó xem lại công việc cảu bạn với các thuộc tính, quay movie clip con mỗi bánh xe chứa trong đó. Hình 3-6 hình dung rõ tác dụng đó. Như việc bạn di chuyển chuột của bạn tới bên phải stage, bánh xe đạp sẽ chuyển sang phải, và vòng xe sẽ quay theo chiều kim đồng hồ. Code của ví dụ này như dưới đây. Dòng đầu tiên thêm vào lắng nghe sự kiện enter frame vào timeline chính, cụ thể sự kiện sử dụng hằng ENTER_FRAME của lớp Event. Hàm đó thiết lập giá trị hoành độ x của bánh xe đạp và quay tới giá trị hoành độ của chuột. Code này có thể được tìm thấy trong mã nguồn file frame_events.fla. stage.addeventlistener(event.enter_frame,onframeloop); function onframeloop(evt:event):void { cycle.x = mousex; cycle.wheel.rotation = mousex; Hình 3-6. Hình dung mô tả bánh xe chuyển động. Chú ý: Ví dụ này cũng giải thích một kịch bản ngắn được hỗ trợ bởi ActionScript. Khi việc quay cụ thể lớn hơn 360 độ, ActionScript sẽ hiểu và sử dụng đúng giá trị đó, 360 độ là một giá trị quay đủ vong bánh xe, đưa bạn trở lại giá trị 0 (720 độ là gấp hai lần quay vòng quanh

43 và cũng bằng 0). Tương tự, 370 độ tương đương với 10 độ, tức là 10 độ so với 0 độ.điều này cho phép bạn thiết lập việc quay của movie clip bánh xe tới hoành độ x của chuột, không phải lo nghĩ gì về sự di chuyển qua 360 điểm pixel trên stage. Các sự kiện Timer Khác với sử dụng các sự kiện enter frame để khởi phát hành động trên các định kỳ cơ bản là việc sử dụng các sự kiên dựa trên thời gian. Mặc dù nó nằm trong số hầu hết các tùy chọn đơn giản, việc sử dụng sự kiện enter frame dành riêng cho mục đích có sự bất lợi. Ví dụ, Flash Player có thể chỉ chắc chắn đạt được các khung hình một vài nơi khoảng giữa giá trị mặc định là 12 frame cho mỗi giây, và có thể 18 đến 20 khung hình (fps) cao hơn. Quãng đường của bạn sẽ biến đổi, nhưng đó khá là xác đáng khi sự điều hòa CPU là lớn. Quan trọng hơn nữa, tỉ lệ cho mỗi sự kiện enter frame phát ra luôn luôn không nhất quán. Các khác, sự kiện dựa theo thời gian được xác định trong từng mili giây, bởi vậy có thể phát ra nhanh hơn. Hơn nữa, sự kiện dựa theo thời gian không thay đổi kịch bản này sang kịch bản kia, chúng khá là đảm bảo và nhất quán. Với các phiên bản trước đó của ActionScript sử dụng phương thức setinterval() để đi vào các sự kiện liên tục, và phương thức settimeout() để giới hạn sự kiện liên tục đó. ActionScript 3.0 bao chùm sự tiếp cận đó sau những cảnh (scene) của lớp Timer, làm đơn giản hóa quá trình xử lý các timer. Bước trước tiên trong việc sử dụng lớp Timer là tạo một đối tượng của class này, như dưới đây: var timer:timer = new Timer(delay:Number, repeatcount:int); Constructor class cần hai đối số, cái đầu tiên là bắt buộc, và chỉ rõ sự hiển thị trong bao nhiêu mili giây, sau đó sự kiện timer được phát ra. Tham số thứ hai là tùy chọn và là số lần lặp của mỗi sự kiện phát ra. Việc bỏ qua tham số thứ hai sẽ là nguyên nhân sự kiên phát ra vô tận, mỗi lúc sau độ trễ xác định, giống với sự thi hành phương thức setinterval() trước đó. Việc sử dụng giá trị xác thực như là 1, sẽ gây ra cho sự kiện phát ra mọi thời điểm (lặp lại, sau đó thiết lập dừng), giống như thi hành phương thức settimeout(). Trong ví dụ timer_event.fla kèm theo mã nguồn, sự kiện timer (cụ thể là hằng TIMER trong lớp TimerEvent), xuất hiện mỗi giây (1000 mili giây) và gọi một hàm để cộng thêm giá trị quay cho kim đồng hồ bên trong movie clip đồng hồ. Code khá là đơn giản, như thể hiện dưới ví dụ sau: var timer:timer = new Timer(1000); timer.addeventlistener(timerevent.timer, ontimer); timer.start(); function ontimer(evt:timerevent):void { watch.hand.rotation +=5; Điểm quan trọng chú ý là dòng 3. Đối tượng timer của bạn không bắt đầu tự động theo cách bắt đầu khoảng thời gian và dừng trước đó. Điều này cho bạn sự mềm dẻo và điểu khiển sự kiện timer của bạn. Bạn cũng có thể dừng sử dụng timer với phương thức stop(), và reset lại thời gian sử dụng bằng phương thức reset(). Sau đó dừng timer và cũng reset lại số lần lặp lại bằng 0. Ví dụ, nếu bạn được thiết lập cụ thể timer gọi một hàm 5 lần, nhưng reset nó sau đó 3 lần gọi, timer sẽ bắt đầu tính lại từ giá trị 0 hơn là chuyển từ 3 tại thời điểm nó được

44 reset. Hình 3-7 miêu tả code trong ví dụ trước. Sự điều khiển trên việc dừng đồng bấm giây của mỗi lần quay mỗi giây khi một sự kiện timer gọi hàm. Hình 3-7. Sử dụng sự kiện timer cho đồng hồ bấm giây. 7. Removing Event Listeners (Xóa các Event Listeners) Trong khi sự kiện lắng nghe làm cho hầu hết các xử lý sự kiện dễ dàng thêm vào và bảo trì, để lại chúng trong vị trí mà khi không cần có thể tiến hành phá hủy. Từ quan điểm logic, xem xét cái gì có thể xảy ra nếu bạn giữ một sự lắng nghe không mong muốn trong hoạt động. Hình dung rằng một tuần dài đẩy mạnh cho trạm radio 101FM, nó thưởng cho mỗi khách hàng số 101 những ai gõ lưu trữ mỗi ngày trong tuần. Người quản lý của việc lưu trữ thiết lập sự lắng nghe cho sự kiện khách hàng gõ và, khi khách hàng 101 gõ lưu trữ, vô vàn giải thưởng và tiền được tặng cho người chiến thắng. Bây giờ hình dung nếu bạn để lại sự kiện lắng nghe đó trong vị trí sau tuần đẩy mạnh là vượt quá. Vô vàn giải thưởng và tiền sẽ tiếp tục được tặng cho người giỏi, thu phí bất ngờ. Sự kiện không mong muốn không là vấn đề duy nhất, tuy nhiên. Bất cứ sự lắng nghe được tạo chiếm một lượng nhỏ bộ nhớ. Thiếu thận trọng tạo nhiều sự kiện lắng nghe, không dọn dẹp sau ngày sau đó, kết quả có thể rò rỉ bộ nhớ. Bởi vậy, ý tưởng là gỡ bỏ sự lắng nghe khi bạn biết chúng sẽ lâu được sử dụng đến. Để làm điều đó, đơn giản bạn cần sử dụng phương thức removeeventlistener(). Bằng việc chỉ cụ thể cái sở hữu liên quan đến sự kiện và hàm lắng nghe đó được khởi động, bạn có thể gỡ bỏ sự lắng nghe để nó không tác động lâu dài tới các sự kiện sau này. Phương thức removeeventlistener() yêu cầu 2 tham số: Sự kiện và hàm được chỉ định khi sự kiện được tạo. Chỉ cụ thể sự kiện và hàm là quan trọng bởi vì bạn có thể có nhiều sự lắng nghe thiết lập cho cùng sự kiện. Hãy thêm vào ví dụ trước và gỡ bỏ việc lắng nghe sự kiện timer khi quay bàn tay đồng hồ (cái bàn tay ở đồng hồ là cái kim đồ hồ ở hình 3-7 ấy) gặp nhau hoặc vượt quá 25 độ của việc quay. Code mới in đậm. var timer:timer = new Timer(1000); timer.addeventlistener(timerevent.timer, ontimer); timer.start(); function ontimer(evt:timerevent):void {

45 watch.hand.rotation +=5; if (watch.hand.rotation >= 25) { timer.removeeventlistener(timerevent.timer, ontimer); Như đã thảo luận trước đó, điều này có thể được hoàn thành sử dụng số đếm số vòng lặp trong timer giống như thế này: var timer:timer = new Timer(1000, 5); Tuy nhiên, điểm chú ý của ví dụ là thể hiện bạn làm thế nào để gỡ bỏ sự lắng nghe từ luồng logic của bạn và quan trọng tương tự gỡ bỏ từ bộ nhớ, khi nó lâu cần đến. Chúng tôi thảo luận ngắn gọn sự thêm vào kịch bản để gỡ bỏ sự lắn nghe trong Tập hợ dữ liệu vô nghĩa nhưng, trong toàn bộ các trường hợp, nó tốt để thực hiện gỡ bỏ bất kỳ sự lắng nghe mà bạn biết sẽ lâu cần đến. Điều này được giải thích trong file mã nguồn removing_listeners.fla. Những gì tiếp theo? Chương này đã giải thích một vài cách để vận dụng đối tượng Flash nhưng trong trường hợp ví dụ movie clip của chúng tôi, đã giả như là movie clip đã tồn tại trên stage. Điều này có thể chấp nhận được cho tác giả các dự án sử dụng timeline, nhưng là giả định giới hạn. Nếu toàn bộ các file bị ép buộc bằng việc vận dụng chỉ các phần tử vận dụng bằng tay được thêm vào stage lúc thời gian người tạo ra, và chỉ được sử dụng trong cách và thứ tự mà chúng đã được thêm vào từ trước, các file không thể tự dộng như ngôn ngữ ActionScript cho phép. Sắp tới, chúng ta sẽ nó thêm về danh sách hiển thị - một biện pháp hữu hiệu quản lý các tài sản. Việc hiểu cơ bản danh sách hiển thị là phương tiện không chỉ trong việc tự động thêm vào các phần từ trong thời gian chạy, nhưng cũng vận dụng bằng tay các đối tượng trên stage để phát huy tối đa tiềm năng của chúng. Trong chương tiếp theo, chúng ta sẽ thảo luận: - Thêm các con mới vào danh sách hiển thị - Loại bỏ các danh sách con hiển thị - Hoán đổi độ dày của đối tượng trong danh sách hiển thị để thay đổi thứ tự sắp xếp tự động. - Quản lý mối liện hệ thứ bậc của các đối tượng danh sách hiển thị, và làm thế nào để thay đổi mối liên hệ thông qua việc khởi đầu lại.

46 Chương 4: Danh sách của màn hình hiển thị 1.The Sum of Its Parts: (Tổng của những thành phần Display List) Một số thành phần của màn hình hiển thị: _ Shape: Hình dạng của 1 thứ gì đó (hình chữ nhật, đường thẳng...) _ Text: Chữ viết được viết bằng công cụ Type (T) _MovieClip: Có thể là một bitmap được convert qua MC _Bitmap: hình ảnh được đưa vào Flash Hình 4-1 cho thấy các thành phần Hình 4-2 cho thấy rằng màn hình liệt kê của hồ sơ. Và chúng được chia theo trình tự sau: Tại đỉnh của sơ đồ trên là stage (chương trình chính flash-swf) và bạn có thể truy cập đến stage bằng nhiều cách khác nhau từ nhiều đối tượng khác nhau trên màn hình thì stage vẫn là nền tảng. Chúng ta xây dựng mọi thứ trên màn hình (display) từ nó và nó hỗ trợ container (đối tượng chứa đựng trong nó-stage) VD: hiển nhiên stage chứa trong nó nhiều movieclip của chương trình mà chúng ta tạo ra hoặc nhiều bitmap mà chúng ta đưa vào Tương tự Main TimeLine và MovieClip cũng có những đối tượng khác nhau bên trong nó VD: MovieClip có thể có các movieclip nằm bên trong nó mà chúng ta đã học cách truy nhập đến chúng ở chapter 2. Tiếp theo là chính timeline, mà cũng là đề cập đến sử dụng biến thể hiện đối tượng ở màn hình gốc ( nhìn thấy sidebar, _root chống lại root cho nhiều thông tin) một hồ sơ flash yêu cầu một timeline bên trong đó có tất cả tài sản khác của contained. Bởi vì sự truyền lan sự kiện, thông thường sử dụng timeline chính tại một vị trí để thêm những event listener mỗi khi đang viết những đoạn mã trong timeline. Trong ngữ cảnh đó, timeline chính tiêu biểu là

47 referenced sử dụng this identifier (Để biết chi tiết hơn về những sự truy cập đến listener trong sự kiện listener hoặc sự kiện lan truyền, hãy nhìn xem Chương 3. Để biết chi tiết hơn về this, hãy xem chương 2). _root chống lại root Bạn có thể đã biết bạn nên tránh sử dụng _root (biến toàn cục) trong các phiên bản trước của ActionScript. Đó bởi vì giá trị của biến tùy thuộc vào sự thay đổi của chương trình. Trước ActionScript 3.0, biến _root tham chiếu tới timeline chính của file SWF. Không quan tâm file SWFs được tải như thế nào và bao nhiêu. _root tương đương của một địa chỉ tuyệt đối, như việc viện dẫn một hình ảnh trong một website VD: http: // / hình ảnh, hoặc một đường dẫn đến thư mục về máy tính của bạn như C:\directory\file Vì _root là một địa chỉ tuyệt đối, Trong ActionScript 3.0, màn hình liệt kê thay đổi mà thịnh hành lôgic. root bây giờ là một biến thể hiện của đối tượng màn hình (display object), và không phải lúc nào cũng tham chiếu tới timeline chính. Nó sẽ trở nên thích hợp cho nhiều trường hợp. Root (của) một movie load trong một SWF, cũng như thế nếu Movie được load vào trong một file SWF A. Cũng tương tự thế cho root load vào trong SWF B, Liệu có thể nó sẽ đứng một mình hoặc được load vào trong SWF C, vân vân. Display List Classes (lớp danh sách màn hình hiển thị) Chúng ta đã thảo luận về cách sử dụng lớp (class) ở chương 1 và chúng ta đã học cách sử dụng chúng một cách bao quát trong các trường hợp và chúng ta sẽ nghiên cứu sâu vào chúng trong quyễn sách này. Để sử dụng lớp display list classes, Chúng ta cần phải bắt đầu với DisplayObject class và dẫn xuống như hình 4-3 là thứ tự các display list classes. Dưới đây là một số giải thích ngắn ngọn cho các display list classes, chúng sẽ làm cho việc thảo luận của chúng ta trơ nên rõ ràng hơn:

48 DisplayObject Bất cứ cái gì mà có thể tồn tại trong danh sách màn hình (display list) là một đối tượng màn hình, và những lớp chuyên dụng hơn được dẫn xuất ra từ DisplayObject. Shape Cái này là một hình chữ nhật, hình ê-líp, được kẻ, vân vân, tạo ra từ việc vẽ những công cụ vẽ. Bạn hoàn toàn có thể tạo ra 1 shape trong flash rất dễ dàng Video Cái này là một đối tượng màn hình video, ít nhất cũng có thể yêu cầu flash chơi một video, hơn là một thành phần video. InteractiveObject Lớp này bao gồm bất kỳ đối tượng màn hình nào. Người dùng có thể tương tác với việc sử dụng con chuột hoặc bàn phím. Nó chưa được sử dụng để thao tác danh sách màn hình. Bạn có thể làm việc với những đối tượng bên trong nó (có lv thấp hơn) SimpleButton Lớp này được sử dụng để tạo ra một nút mà có tương đương theo chức năng với những nút mà bạn có bên trong giao diện authoring. Tuy nhiên, trong ActionScript 3.0, bạn có thể bây giờ tạo ra những nút trên (về) cẩn thận bởi việc sử dụng những đối tượng màn hình khác điều chỉnh lên trên, qua, xuống, và những trạng thái và những va chạm. TextField Lớp này bao gồm văn bản động và nhập vào những phần tử văn bản, có thể kiểm soát Với ActionScript. DisplayObjectContainer Lớp này tương tự như DisplayObject bên trong mà nó tham chiếu tới nhiều kiểu đối tượng màn hình. Tuy nhiên sự khác nhau ở đây là đối tượng này có thể chứa đựng nhũng đối tượng con (child). Tất cả các Container đối tượng màn hình (DisplayObjectContainer) đều là những đối tượng màn hình, chỉ những đối tượng màn hình mà có thể có đối tượng con bên trong (child) là những Container đối tượng màn hình. Cho ví dụ, một video là một đối tượng màn hình, nhưng nó không thể có các đối tượng con bên trong (child). Một movie clip là một đối tượng màn hình, và nó có thể có đối tượng con bên trong (child), vì vậy nó cũng là một đối tượng màn hình DisplayObjectContainer. Thông thường, bạn sẽ làm việc trực tiếp với lớp này khi việc sử dụng display list, tìm kiếm children hoặc ancestors (các đối tượng trước nó, bao bọc đối tượng đang xét). Thông thường, bạn sẽ thao tác một hoặc nhiều đối tượng khác nhau trong một container. Có bốn loại display object containers Stage Cần phải nhớ, chính Stage là một phần display list, cái này điều hành bất kỳ tương tác nào giữa các đối tượng. Chính nó là một display object container.

49 Sprite Trong ActionScript 3.0, một sprite đơn giản là một movie clip mà không có một timeline. Nhiều mã lệnh thao tác ActionScript tiêu biểu thực hiện sử dụng movie clips chỉ yêu cầu một khung (frame) để tạo ra timeline của movieclip, vì vậy, kích thước và việc quản lý ở trên của TimeLine là không cần thiết. Khi bạn trở nên quen với ActionScript 3.0, và bắt đầu xem xét việc tối ưu hóa thường xuyên hơn, bạn có thể tìm thấy chính nó bằng cách sử dụng sprites hơn là sử dụng các đoạn phim. Loader Lớp này được sử dụng để tải những tài nguyên hoặc cái gì đó dành cho cho danh sách màn hình, bao gồm bitmaps và SWFs khác. MovieClip Nó là movie clip mà bạn có lẽ biết và yêu thích nó như một kết quả việc tạo ra chúng trong giao diện authoring, via ActionScript, hoặc cả hai. AVM1Movie Lớp này để làm việc với SWFs đã load vào flash bằng cách sử dụng ActionScript 1.0 hoặc 2.0. AVM1, (mà đứng cho thực tế ActionScript làm bằng máy 1) được dự trữ cho SWFs mà sử dụng ActionScript 1.0 và / hoặc ActionScript 2.0, Trong khi AVM2 được sử dụng cho SWFs mà sử dụng ActionScript 3.0. Vì người sử dụng flash sử dụng hai cơ sở mã riêng biệt, những máy thực tế khác nhau này không phải là thích hợp với nhau. Lớp AVM1Movie cung cấp một cách thao tác những thuộc tính màn hình của tài nguyên SWFs, nhưng không làm dễ dàng việc truyền dữ liệu giữa ActionScript 3.0 và SWFs cũ hơn. phải được hoàn thành bởi những phương tiện khác, giống như LocalConnections. Chúng ta sẽ thảo luận về chức năng này ở chương 13 MorphShape và StaticText Hai lớp này đại diện một hình dạng tween và phần tử văn bản tĩnh, tương ứng, trực tiếp có thể kiểm soát Via ActionScript. Tuy nhiên, chúng là bộ phận của những lớp màn hình bởi vì chúng thừa kế những thuộc tính, những phương thức, và những sự kiện từ lớp cha mẹ DisplayObject của nó. Cái này làm cho nó là một vị trí để quay một phần tử văn bản tĩnh. Displaying the Display List (hiển thị Display List) Nó đôi khi hữu ích, đặc biệt khi bạn đang tạo ra nhiều màn hình chứa nhiều đối tượng với nhiều sự phức tạp lồng vào những đối tượng - tức là bên trong đối tượng đó chứa đựng nhiều đối tượng khác, để tham chiếu danh sách màn hình và phân tích nội dung của nó, sử dụng hàm script này, bạn sẽ tìm thấy nó trong source, nó có tên trace_display_list.fla function showchildren(dispobj:displayobject):void { for (var i:int = 0; i< dispobj.numchildren; i++) { var obj:displayobject = dispobj.getchildat(i); if (obj is DisplayObjectContainer) { trace(obj.name, obj); showchildren(obj); else { trace(obj);

50 showchildren(stage); Trong VD này hàm sẽ ghi ra toàn bộ những children của stage ở dòng 1 đến dòng 12 là định nghĩa của hàm showchildren, dòng 13 là để gọi nó ra. Từ dòng 2 đến dòng 10 là vòng lặp for, vòng lặp này sẽ kết thúc khi không có nhiều hơn children (chắc là một loại đối tượng màn hình bất kỳ nào đó) trên Display object. Số vòng được lặp sẽ xác định bằng thuộc tính numchildren (có kiểu dữ liệu số nguyên) Dòng 3 chứa giá trị của của mỗi child (có lẽ là số ít của children ) trong danh sách màn hình (display list), mỗi child này được xác định bằng phương pháp (Methods) getchildat() nhằm xác định đối tượng màn hình child thông qua những lần lặp vòng Khó hiểu quá nhỉ - lấy luôn cái VD đoạn mã trên để giải thích luôn: Lần đầu tiên chi i = 0, child đầu tiên sẽ được trả về, trong lần lặp thứ 2 child thứ 2 cũng sẽ được trả về tương tự. Dòng 4 sẽ kiểm tra xem child chúng ta đang xét có phải là 1 DisplayObjectContainer hay khong. is trong dòng thứ 4 cũng là 1 loại toán tử ( giống như +, -, *, / ) Nếu đối tượng là DisplayObjectContainer thì đầu tiên chúng ta sẽ trace ra tên của nó đã obj.name và sau đó là đến đối tượng đang xét (thuộc loại DisplayObjectContainer) là obj, sau đó sẽ dùng chính hàm showchildren() để tìm những child con nằm bên trong DisplayObjectContainer đó và tiếp tục in ra các child con đó bằng lệnh trace (dĩ nhiên là có child nằm trong đối tượng là DisplayObjectContainer mà ta mới dùng câu lệnh 4 để kiêm tra), trong trường hợp đối tượng ban đầu (child) không phải là DisplayObjectContainer thì mã lệnh sẽ nhảy đến câu lệnh ở dòng 7-8 và cũng in ra tên của nó. Dòng 9 là kết thúc của cấu trúc if và dòng 10 là kết thúc của vòng lặp for sau đó biến i tăng thêm 1 dơn vị (i++) và vòng lặp lặp lại lần 2 cho đến khi trên màn hình chính không còn một child nào. Lưu ý: qua VD trên ta nhận thấy rằng khi flash duyệt mã lệnh và đưa vào file swf cho chúng ta xem thử kết quả thì tất cả hàm, lệnh, đều đã được duyệt (biên dịch) xong xuôi. Vì thế mới có chuyện hàm showchildren() vẫn được sử dụng trong phần định nghĩa của hàm showchildren() khi trong cấu trúc của hàm này thì quá trình định nghĩa vẫn chưa xong (mã lệnh gọi ở dòng 6 chỉ hàm định nghĩa kết thúc ở dòng 12). The showchildren() function in action (sử dụng hàm showchildren()). Mã lệnh các bạn thấy ở trên chi là 1 đống sắt vụn nếu chúng ta không cung cấp một hay nhiều child tren Stage (có thể là DisplayObjectContainer hoặc là không) Bạn có thể tạo một cấu trúc children theo hình vẽ sau để minh họa cho mã lệnh có thể thực hiện.

51 Và đây là kết quả hiện ra ở cửa sổ output nó cho ta thấy toàn bộ những đối tượng đang có trong Stage (tên của chúng) những đối tượng con là child con của các DisplayObjectContainer Cách sắp xếp này là không đẹp mắt chúng ta có thể cải tiến mã lệnh ban đầu để cửa số output cho chúng ta một kết quả dễ quan sát hơn bằng cách thêm vào các mã lệnh sau: những mã lệnh in đậm là những mã được thêm vào: function showchildren(dispobj:displayobject, indentlevel:number): void { for (var i:int = 0; i < dispobj.numchildren; i++) { var obj:displayobject = dispobj.getchildat(i); if (obj is DisplayObjectContainer) { trace(padindent(indentlevel), obj.name, obj); showchildren(obj, indentlevel + 1); else { trace(padindent(indentlevel) + obj); showchildren(stage, 0);

52 function padindent(indents:int):string { var indent:string = ""; for (var i:number = 0; i < indents; i++) { indent += " "; return indent; Và chúng ta có KQ đưa ra như sau: Chúng ta sử dụng thêm 1 biến ở hàm showchildren() là indentlevel biến này dung để xác định level của đối tượng chúng ta đang xét thuộc lv mấy và sẽ thụt vào đầu dòng tương ứng với lv của nó nếu lv = 0 thì hiển nhiên chúng ta sẽ không thụt dòng (đối tượng dang xét nằm trên Stage) Số lần thụt nhiều hay it phụ thuộc lv vì mỗi làn lv + 1 thi indentlevel +1, hàm padindent() được định nghĩa ở dưới sẽ cho chúng ta biết cần phải thụt đầu dòng bao nhiêu cho đẹp (các bạn tư nghiên cứu nha mã lệnh đó dễ hỉu mà :D). 2. Adding and Removing Children (Thêm và xóa children (một cách tự động)) Để tạo 1 MovieClip bằng cách động (dùng mã lệnh) chúng ta sẽ sử dụng nhiều đến lệnh new MovieClip(), tất nhiên MovieClip tạo bởi cách này sẽ là rỗng (vì chúng ta chưa cho flash biết movieclip vừa tạo có những cái gì bên trong nó). Chúng ta sẽ học cách tạo 1 MC trong Library ở phần sau. VD: var mc:movieclip = new MovieClip(); Bạn vừa tạo là một MovieClip chính hiệu nhưng chúng ta cần thêm nó vào trong danh sách màn hình bằng cách sử dụng phương pháp addchild(mc); Giả sử rằng, MovieClip mc bạn vừa tạo nằm trong 1 MovieClip khác có tên navbar : navbar.addchild(mc); chúng ta có thể tạo shape và sprite một cách tương tự: var sp:sprite = new Sprite(); addchild(sp); var sh:shape = new Shape(); addchild(sh); Nếu các bạn làm quen với AS 1 hoặc 2 thì đều biết rằng mỗi movieclip tạo kiểu này luôn có 1 thuộc tính chiều sâu đi kèm, với AS3 chúng ta không quan tâm tới vấn đề đó vì nó đã được flash tạo một cách tự động. Thậm chí chúng ta có thể thay đổi thuộc tính position của MovieClip được tạo, v/d đó chúng ta sẽ bàn ở phần sau chương này. Adding Symbol Instances to the Display List (thêm biểu tượng phiên bản vào danh sách hiển thị) Chúng ta có thể tạo 1 MovieClip trong cửa sổ library bằng cách thực hiện ở bảng sau:

53 Chúng ta sẽ học cách vẽ bằng mã lệnh cho những MC rỗng ở chapter 8 Còn hiện nay chúng ta chi tập trung vào những đối tượng trong library Trong VD trên bạn đã tạo ra 1 MC mới có tên là cycle và thêm nguyên bản sẵn có trong flash mà lớp riêng của nó là Unicycle Từ bây giờ bạn có thể thao tác với mc cycle này một cách bình thường như thay đổi vị trí của nó (mặc định chỉ đưa vào thì (x,y) = (0;0)): Cycle.x = 100; Cycle.y = 100; Using addchildat() (sử dụng hàm addchildat()) Sử dụng hàm addchildat() này chúng ta sẽ tạo ra 1 Child có thuộc tính position lớn nhất so với các child đã được tạo ra trước đó (điều đó có nghĩa child nào tạo ra sau thì luôn đứng trước các child được tạo ra trước nó). Điều này làm việc đặt item lên trên tất cả các item khác trong flash trở nên thật dễ dàng. Tuy nhiên sẽ hữu ích hơn nếu child chúng ta có thể đặt ở một vị trí đặc biệt trên màn hình do chúng ta thiết lập var inc:uint = 0; stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { var ball:movieclip = new Ball(); ball.x = ball.y = inc * 10; addchildat(ball, 0); inc++;

54 Mã lệnh trên khá đơn giản. Điều mới duy nhất là chỉ mỗi lần click chuột (thuộc về Mouse Event) thì một quả bóng mới sẽ được tạo ra ở một vị trí nhất định (chỉ biến inc = 0 tọa độ (x;y) = (100;100), chỉ biến inc = 1 (x;y)=(110;110) ) Tất nhiên trong library chúng ta cần 1 đối tượng sẵn có với class Ball và những MovieClip mới tạo đều có tên là ball có thuộc tính position cũng bằng 0 (nhưng như đã nói ở trên tuy cùng 1 vị trí (position = 0) nhưng em nào ra sau thì phải xuống dưới cùng) Display Objects and References to Stage and Root (Những đối tượng màn hình và tham khảo cách trình diễn nó trên stage và root) Chúng ta muốn tạo ra movieclip và có thể thay đổi nó nếu muốn - chúng ta sẽ thực hiện việc đó mỗi lúc và tất cả những Object khác cùng loại sẽ thay đổi theo (có thể sử dụng chung hàm, mã lệnh...) khi một đối tượng thêm vào display list thì nó sẽ có những thuộc tính của stage và root hợp lệ (có thể sử dụng) Nếu đối tượng không phải 1 trong những danh sách màn hình thì thuộc tính của stage sẽ trả về là null, và thuộc tính root sẽ trả về khi đối tượng là displayobjectcontainer chứa một child trong đó, ta xét VD sau: //tạo một danh sách màn hình mới var mc:movieclip = new MovieClip(); //giá trị trả về của stage và root là null trace(mc.stage); trace(mc.root); //thêm object vào play list addchild(mc); //bây giờ thuộc tính stage có hiệu lực nhưng root thì không (nó trả về null) trace(mc.stage); trace(mc.root); mã lệnh có thể không hoạt động chính xác nếu như bạn không thiết lập cho nó một kế hoạch hoàn hảo, xét ví dụ sau, lập trình viên đang cố gắng thiết lập vị trí tọa độ cho một mc vừa tạo nhưng anh ta sẽ thất bại vì mc được tạo ra trên nền của stage, do đó, thuộc tính stage.stagewidth không thể truy xuất do mc truy xuất được bằng một thuộc tính của mc (mc.stage.stagewidth/2) var mc:movieclip = new MovieClip(); mc.x = mc.stage.stagewidth/2; addchild(mc); để sửa lỗi trên chúng ta làm công việc rất đơn giản là thay đổi câu lệnh 2 bằng cách gọi trực tiếp thuộc tính stagewidth của stage var mc:movieclip = new MovieClip(); mc.x = stage.stagewidth/2; addchild(mc); Không phải lúc nào chúng ta cũng sử dụng root vì bản thân root là một đối tượng màn hình gián tiếp. Bạn luôn thêm đối tượng vào danh sách màn hình chi tạo ra chúng để tránh những kết quả bất thường diễn ra. Removing Objects from the Display List and from Memory (xóa bỏ đối tượng từ danh sách màn hình và bộ nhớ) Việc tạo và xóa đối tượng trong flash là quan trọng như nhau

55 Để loại bỏ một đối tượng được thêm vào danh sach màn hình bằng mã lệnh bạn có thể sử dụng phương pháp (methods) removechild() VD: removechild(ball); Để xóa bỏ một đối tượng màn hình ở một vị trí (position) nhất định chúng ta dùng removechildat(lv); VD: chúng ta se thực hiện ví dụ ngược với VD của addchildat() đã được thảo luận ở phần trước, sử dụng vòng lặp for để tạo những quả banh trên lv 0 và lần lượt xóa bỏ chúng mỗi khi click chuột for (var inc:uint = 0; inc < 20; inc++) { var ball:movieclip = new Ball(); ball.x = ball.y = inc * 10; addchild(ball); stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { removechildat(0); Preventing out of bounds errors (ngăn chặn mã lệnh có thể nảy sinh lỗi) khi mã lệnh trên đã xóa bỏ đối tượng cuối cùng thi nếu bạn tiếp tục click thông báo sau sẽ hiện ra: the supplied index is out of bounds. Bởi vì bạn đang cố gắng remove một child ra khỏi vị trí (lv) 0 mà thực tế không còn child nào cả, chúng ta có thể sửa lỗi này bằng cách thêm mã lệnh sau: function onclick(evt:mouseevent):void { if (numchildren > 0) { removechildat(0); numchildren là số child còn trên chương trình. Removing objects from memory (xóa bỏ một đối tượng khỏi bộ nhớ) Chúng ta đã thảo luận về event listener trong chương 3, điều quan trọng cần nhớ là flash có thể không có đủ kết quả trả về mà chỉ thao tác trên bộ nhớ. Nếu đối tượng bạn đang sử dụng không còn hữu dụng nữa, bạn có thể xóa bỏ nó khỏi bộ nhớ nhằm tiết kiệm thêm nhiều tài nguyên cho máy tính. Thông thường chúng ta hay loại bỏ đối tượng khỏi danh sách màn hình nhưng chúng vẫn còn tồn tại ở Ram cả khi đối tượng không được tham gia vào chương trình. VD sau là sự đơn giản hóa của ví dụ trước đây, chúng ta sẽ loại bỏ đối tượng từ danh sách màn hình và từ bộ nhớ RAM var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { this.removechild(ball); //ball đã biến khỏi danh sách màn hình xong vẫn còn tồn tại trong RAM trace(ball)

56 ball = null; //ball giờ đây đã ra đi vĩnh viễn trace(ball) stage.removeeventlistener(mouseevent.click, onclick); Chú ý: tham số cuối cùng của hàm addeventlistener() - đã được trình bày ở chương 3. Dòng lệnh 15 là cần thiết vì nó đảm bảo cho dòng 5 không phát sinh lỗi (vẫn có thể chạy được nếu dòng 5 phát sinh lỗi - khi mà stage không còn 1 đối tượng nào do bị xóa hết - dòng 15 là một bản sao lưu hoàn hảo của dòng lệnh 5, không phải là sự loại bỏ những listeners không cần thiết). Để biết thêm thông tin, xin mời xem lại chương Managing Object Names, Positions, and Data Types (Quản lí tên đối tượng, vị trí (position) và kiểu dữ liệu) Flash là một công cụ đồ họa 2D nhưng vẫn có khái niệm về trục Z trong hệ trục tọa độ Oxyz. Tuy nhiên trục Z chỉ nhằm biểu diễn xem đối tượng nào sẽ được đứng trước đối tượng nào khác chứ nó không có nghĩa biểu diễn một hình chiếu phối cảnh 3D nhưn của các công cụ đồ họa 3D khác Tìm Children bởi vì trí và bởi tên Sử dụng phuơng pháp getchildat(), bạn có thể làm việc với child đầu tiên (của) một container sử dụng cú pháp quen thuộc: var do:displayobject = getchildat(0); do sẽ là đối tượng tham chiếu trực tiếp đến đối tượng ở vị trí 0 (những đối tượng đó thực chất là 1) Nếu bạn không nhớ rõ lắm về vị trí của đối tượng đang tham chiếu mà chỉ biết tên của nó là circle thì hãy sử dụng cú pháp sau: var do:displayobject = getchildbyname("circle"); do sẽ là đối tượng tham chiếu trực tiếp đến đối tượng có tên là circle (những đối tượng đó thực chất chỉ là 1) cuối cùng, nếu bạn cần biết sự định vị (vị trí) của một đối tượng màn hình trong màn hình liệt kê, nhưng bạn chỉ có tên của nó, thì bạn có thể sử dụng phương pháp getchildindex() để hoàn thành mục đích của bạn VD: var do:displayobject = getchildbyname("circle"); var doindex:int = getchildindex(do); Casting a Display Object (thử vai một đối tượng màn hình) Chúng ta vẫn thường thảo luận về đối tượng màn hình như kiểu dữ liệu chứ không nói riêng về MovieClip - các bạn không nên nhầm lẫn về 2 khái niệm nay bởi vì ngoài MovieClip thì một child vẫn có thể là sprite, shape... Flash không yêu cầu về khai báo kiểu dữ liệu - như khi tạo ra đối tượng bằng cách dùng mã lệnh Để nói cho Flash nghe 1 câu nói chỉ bạn đang ở trong một movieclip, ban cần phải tham chiếu đến bố mẹ của nó, tức là timeline chính của flash, mã lệnh sau đưa flash đến frame 20 đang đặt mã lệnh trong MovieClip: parent.gotoandstop(20);

57 Nhưng flash không biết rằng gotoandstop là một phương pháo có thể sử dụng được của display object container (hiện tại đang là stage) (đi đến frame 20) nên bạn sẽ gặp lỗi sau: Call to a possibly undefined method gotoandstop through a reference with static type flash.display:displayobjectcontainer Bạn có thể sửa lại mã lệnh như sau: MovieClip([ten mc].parent).gotoandstop(20); Mã lệnh trên cho biết parent (cha mẹ) của đối tượng đang đặt mã lệnh chính là stage và nó thuộc kiểu MovieClip flash sẽ hiểu stage có thể sử dụng phương pháp gotoandstop() và mã lệnh sẽ hoạt động tốt Xem VD: Tạo ở frame 10 một keyframe mới, vẽ một hình gì đó làm dấu var mc:movieclip = new MovieClip(); addchild(mc); stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { //gặp lỗi unrecognized method of display object container nếu gõ đoạn mã sau: //mc.parent.gotoandstop(10); // đưa đến main timeline của MovieClip làm cho MovieClip hỗ trợ lệnh gotoandstop() MovieClip(mc.parent).gotoAndStop(10); 4. Changing the Display List Hierarchy (Thay đổi sự phân cấp danh sách màn hình) Với AS3 chúng ta có thể thay đổi thuộc tính position (độ sâu) của một đối tượng trong flash một cách dễ dàng (điều này khác biệt so với các phiên bản trước của AS) Điều này giúp chúng ta quản lí các đối tượng dễ dàng hơn Depth Management (quản lí thuộc tính độ sâu) Thêm một child vào trong danh sách màn hình, flash không yêu cầu chúng ta cung cấp thuộc tính độ sâu của đối tượng child vì điều này mặc định sẽ được flash thực hiện giúp bạn một cách tự động, bạn đã sử dụng 2 hàm sau: addchild() và addchildat(), bạn vẫn có thể sử dụng phương pháp addchild() cho một đối tượng đang tồn tại trong danh sách màn hình, phương pháp addchild() sẽ xóa bỏ đối tượng cũ và tạo lại đối tượng mới với một thuộc tính độ sâu mới. Đối tượng mới được tạo sẽ được thể hiện trên cùng (có độ sâu cao nhất trong level của nó) var mc1:movieclip = new MovieClip(); mc1.name = "clip1"; addchild(mc1); var mc2:movieclip = new MovieClip(); mc2.name = "clip2"; addchild(mc2); trace(getchildat(0).name); trace(getchildat(1).name); gia tri cho ta o cua so output la : clip1 clip2

58 Chúng ta có thể giải thích như sau: từ dòng 1 6 là mã lệnh để tạo 2 MovieClip, clip1 được tạo trước và nó nhận một mức độ sâu là 0 (khi đó ta mới dùng câu lệnh trace(getchildat(0).name); Để gọi thuộc tính name của nó, tương tự cho clip2. Tuy nhiên bạn muốn di chuyển độ sâu của mc1 từ 0 lên 1 và mc2 sẽ nhảy xuống độ sâu là 0, chúng ta có thể thêm đoạn mã sau và xem kết quả addchild(mc1); trace(getchildat(0).name); trace(getchildat(1).name); Có 3 cách để thay đổi, thêm bớt thuộc tính độ sâu theo cấu trúc Z trong flash, một trong số chúng là sử dụng phương pháo swapchildren() dùng để hoán đổi vị trí giữa 2 đối tượng, được đặt ở vị trí tham số của hàm VD: swapchildren(mc1, mc2); Sẽ trao đổi vị trí của 2 MovieClip mc1 và mc2. Không cần quan tâm xem trên trục Z, mc1 cách mc2 bao nhiêu Trong trường hợp bạn chưa đề cập ra đối tượng child bạn có thể sử dụng phương pháo getchildbyname() bởi vì nó cho phép chúng ta tìm ra đối tượng child theo tên của nó, sau đó hãy thiết lập thuộc tính độ sâu của nó bằng phương pháp swapchildrenat(). Cần lưu ý là phương pháp này sẽ trao đổi toàn bộ những child thuộc 2 độ sâu bất kì: VD: swapchildrenat(0, 1); //sẽ trao đổi toàn bộ những child thuộc độ sâu 0 cho toàn bộ những child thuộc độ sâu 1 Cuối cùng, bạn có thể chỉ định một chỉ mục mới cho bất kỳ đối tượng hiển thị nào hiện có. Ví dụ mới sau đây, ở thấy trong các tập tin nguồn setchildindex.fla, lợi dụng việc truyền sự kiện đã được thảo luận trong chương 3 để tự động mang lại bất kỳ đối tượng hiển thị nào đi qua với con chuột nằm ở trên cùng của thứ tự sắp xếp. VD: this.addeventlistener(mouseevent.mouse_over, onbringtotop, false, 0, true); function onbringtotop(evt:mouseevent):void { this.setchildindex(evt.target, this.numchildren-1); Kịch bản này hoàn thành nhiệm vụ của mình bằng cách thiết lập chỉ mục hiển thị danh sách của Child đến mức cao nhất có thể. Kịch bản đầu tiên xác định số lượng Child trong các display object container (trong trường hợp này, ở timeline chính) và sau đó, bởi vì mảng trong ActionScript bắt đầu từ 0 (có nghĩa là mục đầu tiên là mục 0), nó trừ đi 1 để có được chỉ mục cao nhất trong các chỉ mục trong danh sách hiển thị. Ví dụ, nếu có ba mục trong danh sách hiển thị, chỉ số của họ sẽ là 0, 1 và 2. Số trẻ em sẽ là 3, và 3 trừ 1 bằng 2, đó là chỉ số cao nhất trong danh sách.

59 Hình 4-7 cuộn qua các cửa sổ lên đỉnh theo thứ tự xếp hình Xem VD sau: Tạo 4 MovieClip có tên folder0,folder1,folder2,folder3 Thêm đoạn mã này vào timeline chính this.addeventlistener(mouseevent.mouse_over, onbringtotop, false, 0, true); function onbringtotop (evt:mouseevent):void { var folder:movieclip = evt.target as MovieClip; setchildindex(folder, numchildren - 1); trace(getchildat(0).name); trace(getchildat(1).name); trace(getchildat(2).name); trace(getchildat(3).name); numchildren cho biết số child trên stage. setchildindex(tên mc, chỉ số độ sâu) là hàm thiết lập thuộc tính độ sâu của child, lưu ý là chỉ số độ sâu chỉ nằm trong giới hạn của độ sâu lớn nhất hiện có trong chương trình. Theo VD trên lần lượt folder1, folder2, folder3, folder4 có vị trí 0,1,2,3 (do cách đặt vào stage) Chỉ rê chuột đến folder1 chúng ta được KQ folder0 folder2 folder3 folder1 Chỉ rê chuột đến folder2 chúng ta được KQ folder0 folder3 folder1 folder2 Chỉ rê chuột đến folder3 chúng ta được KQ folder0 folder1 folder2 folder3

60 Chỉ rê chuột đến folder0 chúng ta được KQ folder1 folder2 folder3 folder0 Reparenting Children (đặt lại cha mẹ cho Child) Một nhiệm vụ đặt ra là chúng ta có thể chuyển một child từ 1 parent này sang parent khác hay không? Một parent (cha mẹ) chứa 1 hay nhiều child (đứa trẻ) và việc chúng ta quan tâm là đứa trẻ sẽ được chuyển từ parent này sang parent kia như thế nào. Ví dụ chúng ta nghiên cứu sẽ là việc di chuyển moon (child) từ bầu trời này (parent) sang bầu trời kia (parent) sky1.addchild(moon); this.addeventlistener(mouseevent.mouse_down, ondrag, false, 0, true); this.addeventlistener(mouseevent.mouse_up, ondrop, false, 0, true); Đoạn mã này thêm child moon vào sky1 và thêm cho nó 1 vài event listener cho việc kéo thả (this ở đây hiểu là màn hình chính, do đó sky1 (và thêm cả sky2 sẽ được bổ sung sau) sẽ có thể sử dụng 2 hàm ondrag và ondrop trong MouseEvent.MOUSE_DOWN, MouseEvent.MOUSE_UP. Hàm này sẽ thêm moon vào trong sky khi nó được click. Hành động này sẽ xóa bỏ từ chính parent trước đó và thêm nó khi click vào đối tượng Ngoài việc thay đổi parent của moon. Hàm còn cho phép việc kéo đối tượng đang được click function ondrag(evt:mouseevent):void { if (evt.target == moon) return; evt.target.addchild(moon); evt.target.startdrag(); Bổ sung hàm sau đây để kết thúc việc kéo thả: function ondrop(evt:mouseevent):void { evt.target.stopdrag();

61 Hàm addchild() rất hữu dụng vì nó vừa xóa moon cũ và vừa thêm moon mới vào parent mới 5. A Dynamic Navigation Bar (Làm thanh nút chọn động) Chúng ta sẽ tạo 1 thanh nút chọn gồm 5 nút như trên, cửa sổ output sẽ hiện ra tên của từng nút khi chúng ta click vào nút đó Bắt đầu dự án của chúng ta bằng mã lệnh sau đây: var btnnum:uint = 5; var spacing:number = 10; var navbar:sprite = new Sprite(); // khai báo đối tượng navbar addchild(navbar); // đưa navbar vào stage Dòng 1 và 2 khởi tạo những giá trị: số nút của thanh và khoảng cách các nút trong thanh (10 pixels) Dòng 3 tạo 1 container để chứa các nút lệnh mà chúng ta sẽ tạo ở dòng lệnh 5 //trong navbar chúng ta tạo những nút lệnh theo vòng lặp for var btn:simplebutton; for (var i:number = 0; i<btnnum; i++) { btn = new Btn(); btn.x = spacing + i*(btn.width+spacing); btn.y += 5; btn.name = "button" + i btn.addeventlistener(mouseevent.click, ontracename, false, 0, true); navbar.addchild(btn); //tạo nền cho navbar tại độ sâu là 0 để các nút lệnh có thể nằm trước nền (MovieCLip bg) var bg:movieclip = new NavBarBack(); bg.width = btnnum*(btn.width + spacing); bg.width += spacing navbar.addchildat(bg, 0); navbar.x = (navbar.stage.stagewidth - navbar.width)/2; navbar.y = 20; // thiết lập vị trí của navbar trên màn hình của flash function ontracename(evt:mouseevent):void { trace(evt.target.name); // hiện tên của đối tượng đích ra cửa sổ Output evt.target nhằm chỉ đến đối tượng đang được nói đến trong hàm (đối tượng đang thực thi hàm) Sau này bạn sẽ học cách vẽ một đối tượng hoàn chỉnh bằng AS không cần sử dụng đến tài nguyên sẵn có trong cửa sổ library

62 Chương 5: Điều khiển Timeline 1. Playhead Movement (Sự di chuyển playhead) Một trong những kỹ năng Lập trình AS cơ bản nhất là khả năng định hướng trong những đoạn phim (Movies) trong flash. Bạn sẽ thường dùng kỹ năng này để điều kiển sự phát đi hoặc chạy đoạn phim của MovieClip bên trong đoạn phim chính. Mã lệnh trong chương này rất đơn giản và bạn sẽ có thể tự tạo ra những file dự án khác cho riêng mình. Để bắt đầu chúng ta sẽ thảo luận về việc chạy (play) chạy đoạn phim (playback) dừng lai (stop) và nhảy sang một khung hình (frame) khác. Dự án đầu tiên mà chúng ta quan tâm sẽ là tạo ra một hồ sơ có đầy đủ 4 nút lệnh cơ bản để điều kiển đoạn phim trong flash: đó là play, stop, gotoandstop, gotoandplay. Chúng ta bắt đầu nào: Sự dụng những công cụ hoạt hình nào đó tạo ra một đoạn hoạt hình trong flash nhớ nhấn F5 hay F6 để tạo cho no nhiều frame nhá, chuyển nó lên một layer mới và hãy đừng đặt tên cho những frame mà hãy tin tưởng vào các số thứ tự của khung hình (khung hình thứ nhất sẽ là số 1 cái này thì ai cũng biết roài). Đầu tiên là hoạt hình truyền thẳng, nghĩa là hoạt hình sẽ đi từ frame 1 frame Cuối cùng, khi chạy nó có thể dừng lại và chạy tiếp, chúng ta sẽ cần 2 nút playbtn và stopbtn để thực hiện công việc này. Sau đó bạn không muốn hoạt hình truyền thẳng mà sẽ nhảy đến một frame mong muốn, bạn cần sử dụng AS để thực hiện việc này, đó là lý do chúng ta thêm vào hồ sơ 2 nút gotoplaybtn và gotostopbtn Tạo 4 button như hình và thêm đoạn mã sau: // Định hướng đơn giản stopbtn.addeventlistener(mouseevent.click, onstopclick, false, 0, true); playbtn.addeventlistener(mouseevent.click, onplayclick, false, 0, true); gotoplaybtn.addeventlistener(mouseevent.click, ongotoplayclick, false, 0, true); gotostopbtn.addeventlistener(mouseevent.click, ongotostopclick, false, 0, true); //Mã lệnh của 4 nút function onstopclick(evt:mouseevent):void { stop();

63 function onplayclick(evt:mouseevent):void { play(); function ongotoplayclick(evt:mouseevent):void { gotoandplay(1); function ongotostopclick(evt:mouseevent):void { gotoandstop(1); //các hàm được định nghĩa Mã lệnh trên gắn vào timeline chính cuả flash nên nó sẽ tác động đến đoạn phim chính của flash. Mà cụ thể là hoạt hình mà chúng ta vừa tạo. stop tức là đoạn phim chính của flash dừng lai, play tức là đoạn phim chính của flash đang chạy. Chúng ta tham khảo hồ sơ navigator_01.fla để xem kết quả và một sự thêm vài mã lệnh trong hồ sơ navigator_02.fla để cho chúng ta thêm thông tin từ cửa sổ output. 2. Frame Labels (Nhãn khung hình) Labels là tên nhãn của một đoạn frame nào đó, đoạn này được tập hợp trong một key frame và dĩ nhiên Labels cũng sẽ là tên mà Chúng ta đặt cho key frame đó. Chúng ta có thể đặt tên cho khung hình ở ô frame trong cửa sổ properties, chúng ta sẽ thao tác với khung hình thông qua tên đã đặt. Tao một MovieClip, trong MC có tên pages trong MC đó tạo 3 key frame đặt tên chúng lần lượt là page1, page2, page 3, kéo nó vào màn hình chính, sau đó tạo 3 button có tên one, two, three, đoạn mã sau được thêm vào trong màn hình chính (timeline chính) của flash //Dừng việc chạy đoạn phim chính (tức là cái file swf lun) pages.stop(); //button event listeners one.addeventlistener(mouseevent.click, ononeclick, false, 0, true); two.addeventlistener(mouseevent.click, ontwoclick, false, 0, true); three.addeventlistener(mouseevent.click, onthreeclick, false, 0, true); //định hướng tên frame tốt hơn thông qua số khung của MovieClip pages function ononeclick(evt:mouseevent):void { pages.gotoandstop("page1"); function ontwoclick(evt:mouseevent):void { pages.gotoandstop("page2"); function onthreeclick(evt:mouseevent):void { pages.gotoandstop("page3"); Mã lệnh AS có thể cho chúng ta hình dung trước KQ, hãy thử xóa vài frame trong 1 nhóm key frame nào đó và bạn thấy rằng sử dụng Frame Labels vẫn cho chúng ta đường dẫn đến frame mong muốn.

64 New Timeline ActionScript (Timeline mới ActionScript) Chúng ta học cách tạo ra TimeLine mới cho flash, các bạn có thể tham khảo hồ sơ framelabels_02.fla để biết kết quả của dự án. Đoạn mã sau được đưa vào timeline chính của flash, mọi giải thích đã được thêm vào trong mã lệnh: //Dừng quá trình chạy của flash và để flash ở scene primary stop(); trace(scenes[0].name); trace(scenes[0].numframes); trace(scenes[0].labels[0].name); trace(scenes[0].labels[0].frame); // ghi ra các thông số của đoạn phim chính //dừng movie clip pages trên scene primary pages.stop(); //button event listeners oneplus.addeventlistener(mouseevent.click, ononeplusclick, false, 0, true); output.addeventlistener(mouseevent.click, onoutputclick, false, 0, true); labelcheck.addeventlistener(mouseevent.click, onlabelcheckclick, false, 0, true); //Nhảy tới một frame đã được định vị bằng một Frame Labels ( page1 ) function ononeplusclick(evt:mouseevent):void { pages.gotoandstop(getframe("page1",pages) + 4); //ghi ra thông tin của movie, scene, label, and frame information function onoutputclick(evt:mouseevent):void { trace("đoạn phim chính có " + scenes.length + " scenes."); trace("scene hiện tại là '" + currentscene.name + "'."); trace("nó có " + currentscene.numframes + " frame(s),"); trace("và " + currentscene.labels.length + " label(s). "); trace("tên nhãn đầu tiên của scene thứ 2 là '" + scenes[1].labels[0].name + "',"); trace("nó nằm ở " + scenes[1].labels[0].frame + "."); trace("movie clip 'pages' có " + pages.currentlabels.length + " labels."); trace("nhãn cuối cùng của nó là " + pages.currentlabels.pop().name + "'."); //Kiểm tra xem một tên khung có tồn tại hay không function onlabelcheckclick(evt:mouseevent):void { trace(isframelabel("page3", pages)); //Chấp nhận tên của movbieclip và tên khung của nó sẽ được trả về bằng số của khung được //đánh số thứ tự trong flash function getframe(frlabel:string, mc:movieclip):int { //Khai báo các biến trong hàm, kiểu dữ liệu của hàm. for (var i:int = 0; i<mc.currentlabels.length; i++) { //vòng lặp for sẽ chạy từ frame đầu tiên [0] đến frame cuối cùng của tất cả labels if (mc.currentlabels[i].name == frlabel) { return mc.currentlabels[i].frame; //Nếu tên của key frame (là frlabel) giống với tên labels hiện tai đang chạy trên màn hinh

65 //flash thì trả về giá trị của hàm là số của khung hiên thời //trong VD thì khi mc.currentlabels[i].name == frlabel là khi MC pages đang chạy đến //label page1 và nó trả về KQ của frame đầu tiên có tên page1 là có số thứ tự là 1 return -1; //không trả về giá trị nếu như chúng ta không tìm thấy giá trị nào cả điều này có nghĩa Mc chúng ta đang chạy không có frame nào cả (đang trống) //Ham này trả về kết quả true nếu tìm thấy tên label có tồn tại function isframelabel(frlabel:string, mc:object):boolean { for (var i:int = 0; i<mc.currentlabels.length; i++) { if (mc.currentlabels[i].name == frlabel) { return true; return false; // Giá trị false trả về khi câu lệnh if không được thỏa mãn. Sau khi hoàn thành hồ sơ của chúng ta có thể như thế này: bạn có thể tham khao file mẫu để xem KQ 3. Frame Rate (số khung hình /s) Khi bạn sử dụng AS3 bạn mới có thể thay đổi chỉ số Frame Rate một cách đơn giản và thoải mái được. Giá trị mặc định là 12 và bạn có thể tăng lên hoặc giảm xuống. Nếu bạn chọn một frame rate mới thì hiển nhiên tất cả các thành phần trên màn hình chính flash đều thực hiện theo chỉ số mới này và chỉ số cũ sẽ bị loại bỏ. Bạn có thể xem trên hồ sơ framerate.fla để biết kết quả, một hình chụp sẽ cho chúng ta thấy:

66 Chúng ta cũng tạo ra một vài hoạt hình trên màn hình của flash và mã lệnh được thêm vào timeline chính, ở frame đầu tiên. Mã lệnh chúng ta nghiên cứu rất dễ hiểu: info.text = stage.framerate; //info.text được liên kết với một ô văn bản động bên ngoài màn hình chính faster.addeventlistener(mouseevent.click, onfasterclick, false, 0, true); //mã lệnh gắn với 1 button có tên faster slower.addeventlistener(mouseevent.click, onslowerclick, false, 0, true); //mã lệnh gắn với 1 button có tên slower //các event listener function onfasterclick(evt:mouseevent):void { stage.framerate += 5; info.text = stage.framerate; //hàm onfasterclick sẽ tăng frame rate lên 5 đơn vị (tức là tăng thêm 5 khung được chạy trong 1 giây) function onslowerclick(evt:mouseevent):void { if (stage.framerate > 5) { stage.framerate -= 5; info.text = stage.framerate;

67 4. A Simple Site or Application Structure (cấu trúc của một ứng dụng hoặc trang web đơn giản) Chúng ta có một hồ sơ hoàn chỉnh là demosite.fla các bạn có thể tham khảo nó để biết sự phù hợp của việc sử dụng hoạt hình và lập trình AS đối với flash, Những hiệu ứng hoạt hình chúng ta sẽ không đi sâu mà chúng ta sẽ nghiên cứu về mã lệnh là chủ yếu. //gán trị trống cho nextsection var nextsection:string = ""; //thêm button event listeners section1.addeventlistener(mouseevent.click, navigate, false, 0, true); section2.addeventlistener(mouseevent.click, navigate, false, 0, true); section3.addeventlistener(mouseevent.click, navigate, false, 0, true); //định nghĩa hàm mà mỗi nút sẽ gọi function navigate(evt:mouseevent):void { //Chuyển giá trị nextsection thành tên của nút bấm mà bạn đang bấm vào nó nextsection = evt.target.name; play(); điều này có ý nghĩa là đoạn phim chính ở câu lệnh gotoandplay(nextsection); sẽ làm cho đoạn phim chính chạy ở label mà có tên nút bấm quy định VD nút section1 sẽ chạy đoạn phim chính ở label section1 (các bạn sẽ thấy những đoạn mã trên ở trong file mẫu). Undocumented: Adding Frame Scripts to Movie Clips at Runtime (Không dựa trên tư liệu: Thêm khung hình mã kịch bản đến Movie Clip tại thời điểm chạy) Phần này nói về phương pháp mc.addframescript(), thêm mã lệnh vào một frame nào đó. function onstopmc() { mc.stop(); trace(mc.currentframe); mc.addframescript(mc.totalframes-1, onstopmc); hàm này sẽ gắn mã lệnh vào frame số thứ tự 39 (đánh số từ 0 39) của MovieClip mc theo cách đánh số của flash (tức là frame 40) sau đó khi mc chạy đến số thứ tự 39 thì hàm onstopmc() được gọi và mc sẽ dừng lại

68 Chương 6: Lập trình hướng đối tượng OOP được hiểu như là một vấn đề về giải quyết kỹ thuật, chia mã lệnh của bạn thành những phần nhỏ, làm mã lệnh trở lên đơn giản (chia thành những đối tượng), làm cho các dự án và ứng dụng của chúng ta trở lên dễ quản lý hơn. Những đối tượng chúng ta lâp trình cần càng chi tiết càng tốt bởi vì chúng ta có thể sử dụng chúng với các thành phần đối tượng khác trong flash mà không cần phải viết lại mã lệnh. Việc lựa chọn OOP để lập trình là một việc rất hiển nhiên khi lập trình những dự án lớn hay khi bạn phải làm việc theo nhóm với cùng 1 nhóm lập trình viên,tuy nhiên có thể chấp nhận OOP như một chiến lược phát triển hơn. Tuy nhiên, việc áp dụng OOP như là một chiến lược phát triển có thể ít được rõ ràng, và thậm chí gây tranh cãi. Mục đích của chương này nhằm cho bạn những cái nhìn khát quát nhất về OOP, chuẩn bị cho những dự án lớn hơn của bạn, bạn hãy sử dụng các file mẫu để theo dõi chương này Dự án lớn hơn sẽ có nền tảng OOP nhưng cũng sẽ chứa đựng những bài tập mà bạn tạo ra sử dụng kỹ thuật thủ tục, đưa bạn tới cả mô hình của tác giả cuốn sách. Việc khi nào lựa chọn OOP sẽ phụ thuộc vào việc hiểu những lợi ích của chúng, (OOP): Class: Lớp là nền tảng của OOP và lớp là tập hợp của các hàm, biến nhằm mục đích phục vụ một yêu cầu nào đó của đối tượng. Chúng ta sẽ xem xét cách sử dụng chúng ở phần sau, chúng ta đã nhắc đến class ở chương 1. Inheritance: Sự thừa kế, đây là một trong những điểm mạnh nhất của lập trình OOP, nó cho phép bạn thêm những đặc tính khác vào một đặc tính đã tồn tại của đối tượng set without reinventing the wheel, as the saying goes Điều này có nghĩa bạn có thể mở rộng một lớp mới trên một lớp đã hiện hữu tốt hơn khi bạn tạo lại một lớp mới hoàn toàn và phải bắt đầu lại việc phân chia từ đầu, giúp bạn tiết kiệm thời gian và cải thiện các dự án. Composition: sự hợp thành, sự thừa kế không thực hiện tốt cho mỗi trường hợp khác nhau trong flash, do đó sự hợp thành là một sự thay thế tốt, nó có kỹ thuật giống với lớp, cũng là tập hợp của các hàm và biến. Encapsulation: Sự đóng gói, thông thường thì sẽ không tốt nếu chúng ta phơi bày toàn bộ những khía cạnh về nội dung của một lớp đến những lớp hay những ứng dụng khác, nếu chúng ta đóng gói lớp, chúng ta có thể cô lập chúng với thế giới bên ngoài, cho phép lựa chọn một số ít các phần tử của lớp và chúng ta sẽ được nhìn thấy cấu trúc của lớp đang dùng mà không bị ảnh hưởng của các lớp khác. Polymorphism: tính đa trạng thái, cho phép những lớp khác nhau có thể thực hiện trong môi trường của nhau, chồng chéo lên nhau ở những phương pháp (methods) có cùng tên nhưng không cùng thực hiện một lúc, điều này giúp chúng ta dễ dàng mở rộng lớp giảm bớt việc sử dụng những phương pháp thuộc loại documented và learned. Lớp mở rộng được tạo ra và có thể sử dụng những phương pháp của lớp chính và trả KQ về lại cho lớp mới hoặc lớp đó. OOP không phải là sự lựa chọn đúng đắn cho tất cả mọi người, tuy nhiên nó sẽ có ích trong những dự án lớn, lập trình thủ tục - hàm tức là có cấu trúc sẽ thích hợp với các chương trình nhỏ và đỡ mất thời gian hơn việc sử dụng OOP, mã lệnh viết sẽ dễ hiểu hơn OOP và đơn giản trong công việc sửa lỗi. Học AS3 không nhất thiêt phải sử dụng OOP, đừng nên nghe theo những lời ong tiếng ve về OOP mà cố gắng lập trình OOP khi không cần thiết, đơn giản nó chi là một sự chọn lựa của bạn. Tuy nhiên trong chương này chúng ta vẫn sẽ quan tâm đến OOP đặc biệt là các VD ở cuối chương, như vậy sẽ giúp cho bạn hiểu thêm về mã nguồn cũng như website của bạn (nếu có).

69 1. Classes (Lớp) Trong Chương 1 chúng ta thảo luận về 3 mô hình lập trình chung nhất: liên tục, thủ tục và hướng đối tượng (mình chỉ dịch phần class trong lập trình hướng đối tượng thoại ) Chúng ta nói rằng, lập trình thủ tục là một bước đột phá mới so với lập trình liên tục vì nó không bị hạn chế về sự nối tiếp trong mã lệnh theo chiều từ trên xuống dưới mà chúng ta có thể nhóm các mã lệnh có nhiêm vụ chung trong 1 thủ tục (hoặc là hàm trong AS) Lớp là nền tảng của OOP và có lẽ bạn đã làm việc với chúng ở một lúc nào đó, dù bạn mới chi tham gia vào lập trình nhưng bạn, bạn đã học đến chương 6 này nghĩa là bạn đã từng tiếp xúc với lớp mà có thể chưa thực thi nó bởi vì khi bạn chạy chương trình thì nhiều thứ đằng sau scenes mà flash chạy đang sử dụng lớp riêng của nó để hoàn thành công việc của bạn. Chúng ta đã nói đến cách làm sao để thao tác các sự kiện EventDispatcher đã nói đến ở chương 3, bao gồm nhiều khái niệm khác nhau như DisplayObjectContainer, DisplayObject, và nhiều con cháu họ hàng khác của nó. Bạn có cảm thấy chúng ta đã học quá nhiều không khi đi đến chặng đường lập trình oop, không tất cả chi là điểm bắt đầu của chúng ta, tất cả những VD chúng ta đã xét có liên quan đến lớp trước đây chi nhằm giúp minh họa về cách sử dụng lớp, cùng nhìn lại mã lệnh để bạn có thể điều khiển chương trình thông qua một MovieClip, bạn có thể thiết lập nhiều thuộc tính x, y, rotation, alpha, và nhiền hơn thế những phương pháp Start(),Stop(),goto và có sự kiện Event.ENTER_FRAME cũng chi là một lớp trong Movieclip, bạn có thể tạo ra lớp với var mc:movieclip = new MovieClip(); nghĩa là bạn đang tạo ra 1 lớp MovieClip mới trên nền của lớp MovieClip cũ, bạn có thể chưa có nhiều kinh nghiệm trong viết lớp vậy hãy tích lũy kinh nghiệm để sử dụng chúng một cách nhuần nhuyễn và chính xác Custom Class Review (tổng quát của một lớp phổ biến) Chương 1 trình bày về cách viết 1 lớp đơn giản, chúng ta có thể xem lại phần đó hoặc có một cái nhìn và rút ra kinh nghiệm qua đoạn mã sau đây: package { import flash.display.movieclip; public class Main extends MovieClip { public function Main() { trace("flash"); Cấu trúc package { này là bắt buộc cho tất cả các lớp, hãy đặt file lớp (đuôi.as) tại thư mục cùng với chương trình hiện hành hoặc xem phần Classpaths để biết cách đặt file as ở những thư mục khác nhau. Cấu trúc của lớp được khai báo từ dòng 5 đến dòng 11 nó được mở rộng của đối tượng sẵn có là movieclip trong flash có nghĩa rằng tất cả các sự kiện, những phương pháp, và những thuộc tính của lớp MovieClip sẽ sẵn sàng tới lớp Main này, và đó là lý do tại sao là lớp MovieClip cần nhập vào trong lớp Main, cái này thể hiện sư thừa kế được sử dụng trong dòng lệnh 7 9, nó là cấu trúc của lớp Main. Lớp có thể được sử dụng một cách tự động hoặc chúng ta thêm câu lệnh sau để khai báo lớp cho flash var main:main = new Main(); Bạn có thể tạo ra nhiều sự thể hiện của lớp trong flash nếu như mã lệnh cho phép. Tóm lại bạn đã học các thao tác cơ bản để có thể sử dụng custom classes (những lớp thông thường).

70 Classpaths (đường dẫn đến lớp) Bạn có ít sự lựa chọn khi thao tác với lớp, bởi lẽ chúng ta mới thảo luận về 1 lớp đặt trong thư mục cùng file với swf, chúng ta có thể đặt các lớp trong các thư mục khác nhau để quản lý chúng dễ dàng hơn, chúng ta cần phải nhập những lớp này bằng mã lệnh riêng, mặt khác, chúng ta có thể nhập các lớp sẵn có khác của flash vào chương trình, kỹ thuật này cũng được thực hiện một cách tương tự cách nhập một class từ một thư mục nào đó: Dưới đây là một số VD: import flash.display.movieclip; import myapp.effects.water; import flash.events.event; Khi viết lớp ở một thư mục nào đó bạn cần phải viết Classpaths trong cấu trúc package { Như VD sau: package myapp.effects { public class Water { public functionwater() { Bạn đang đứng ở thư muc myapp là thư mục mẹ của thư mục effects chứa file Water.as hay nói cách khác thì đây chính là lớp của bạn, public class Water { cấu trúc này cho biết nó sẽ thừa hưởng các đặc tính của lớp Water đã được định nghĩa trước đó (dĩ nhiên tất cả chi là VD vì hiện thời chúng ta không có hồ sơ nào về VD đã nêu cả :D) Bạn có thể quản lý, xây dựng các lớp giống như trong thư viện của flash, bạn sẽ không muốn nhân đôi lớp đó nhiều lần trong quá trình sử dụng mà muốn lớp đó sẽ gắn theo file.fla của bạn Thay vào đó bạn có thể cho flash biết về đường đãn đến class của bạn là classpath và flash sẽ tự hiểu phải làm gì, VD như flash tự hiểu khi bạn chỉ cho nó đến class thông thường nào đó mà bạn tạo flash sẽ tự động nhập thêm lớp flash.display.movieclip để thực hiện, đầu tiên các bạn sẽ chỉ classpath cho phần ActionScript section của bảng hội thoại Preferences trong flash, lựa chọn phiên bản AS đang dùng là 2 hay 3 Sau khi thực hiện công việc này, sau này flash sẽ tìm kiếm ở các thư mục mà bạn đã chỉ định và bạn đã có một thư viện riêng cho các lớp.

71 2. Inheritance (Sự thừa kế) Mã lệnh sau là một cách để thể hiện ý tưởng của sự thiết kế Mã lệnh sẽ tạo ra một lớp mở rộng có tên là Box và nó được mở rộng từ lớp của MovieClip, kết quả là nó có thể truy cập đến tất cả các thuộc tính, chức năng và các lớp khác nhau của MovieClip như thuộc tính tọa độ X (dòng 22) và lớp đồ họa của nó (dòng 13) như vẽ một đường màu xanh tao thành một cái hột có 4 cạnh màu xanh, chúng ta sẽ thảo luận về cách vẽ bằng vectơ sử dụng mã lệnh ở chương 8, ở VD này đơn giản là ta bắt đầu đặt bút vẽ ở điểm (0,0) vẽ đến (100,100) và kick thước đường vẽ là 1 pixel và màu vẽ được quy định theo mã màu (có thể xem như theo mã màu của RGB) Mã lệnh trên cho chúng ta một lớp về một đối tượng mà khi gọi thì đối tượng đó sẽ có hình dạng mà chúng ta đã miêu tả ở trên, nó chuyển động qua phải 5 pixel 1 lần chạy qua một frame do lệnh this.x += 5; được đặt trong hàm onloop(); tên hàm này không quan trọng nhưng cái quan trọng là nó đặt vào trong EventListener (người nghe sự kiện) của Event.ENTER_FRAME, chính nó sẽ làm cho mã lệnh được gọi mỗi khi flash duyệt qua một frame mới hay bắt đầu lặp lại từ frame đầu tiên tạo thành 1 vòng mới. Symbol Base Classes (lớp cơ sở của các biểu tượng) Bạn đã thấy được cái hay của tính kế thừa trong việc truy xuất đối tượng mà nó đã thừa kế, trong chương 4 bạn đã làm điều này hơn 1 lần trong khi đang sử dụng các đối tượng trong library bằng cách thêm nó vào chương trình chính của flash bằng mã lệnh. Bây giờ từ một đối tượng sẵn có trong flash, bạn có thể viết một lớp cho nó để nó có thể kế thừa và phát huy nhiều yếu tố riêng của nó mà bạn cần, VD như tạo đối tượng Square sẵn có bằng cách bạn tạo nó trong library, bạn có thể thêm lớp sau cho nó: package {

72 import flash.display.movieclip; import flash.events.event; public class Square extends MovieClip { public function Square() { this.addeventlistener(event.enter_frame, onloop, false, 0, true); private function onloop(evt:event):void { this.x += 5; Mã lệnh trên cũng như của mã lệnh chung ta đã thảo luận ở phần trước chỉ có điều là nó đã mất bị đoạn mã vẽ lên hình dạng của MovieClip Square A More Traditional Look at Inheritance (nhiều tính truyền thống nhìn như một sự kế thừa) Bạn đã có ý tưởng cơ bản về việc làm sao một lớp phổ thông (thông thường) lại có thể thừa kế những thuộc tính của lớp MovieClip sẵn có trong flash, chúng ta sẽ mô tả sự thừa kế sớm hơn và bàn luận làm sao để một child có thể thừa kế thuộc tính của parent (cha mẹ) của nó, tương tự chúng ta có các ví dụ như lớp các con chó kế thừa từ lớp động vật, lớp ô tô kế thừa từ lớp xe cộ... Đó là những vd cổ điển cho các lập trình OOP Liệu một xe cộ là một ô tô hoặc một xe tải - Hoặc Thậm chí một máy bay hoặc một con thuyền, cứ cho cái đó quan trọng - nó vẫn chỉ là một xe cộ và chia sẻ nhiều (thuộc tính trong khi lưu thông cùng) với những xe cộ khác. Chúng ta thiết lập các lớp xe cộ dựa trên những nét chung của nó - tức là tất cả xe cộ đều phải có đặc điểm này, VD như nhiên liệu, xe nào mà chả tốn xăng (trừ xe điện) Sau đó bạn hãy nghĩ đến các phương pháp có thể liên quan đến thuộc tính của nhiên liệu như là một cái xe sẽ hết xăng trong bao lâu khi đang chạy? - và chúng ta sẽ cung cấp đủ xăng cho xe chạy - bạn có thể giảm số xăng hao phí nếu bạn có một lịch trình du lịch tốt và điều đó là kết quả cuối cùng mà chúng ta hướng tới. Vehicle class (lớp xe cộ) Chúng ta sẽ xem xét một dự án mới về những chiếc xe khi đang chạy và tất nhiên là nó sẽ tốn xăng :D Hãy tạo một lớp cơ bản và đặt tên cho nó là Vehicle.as đơn giản vì chúng ta đang xét đến lớp xe cộ, file này lưu cùng thư mục với hồ sơ fla của bạn, lớp này sẽ tạo ra xe cộ, điều khiển cho nó chạy và thông tin từ cửa sổ output sẽ cho chúng ta biết chúng ta đã đi được bao nhiêu dặm và số bình gas (gallons of gas) còn lại là bao nhiêu. Kết quả là bạn sẽ biết cái xe chúng ta đang chạy có thể chạy được bao nhiêu dặm cho đến khi nó hết gas (xăng) Lớp chúng ta sẽ có 4 thuộc tính chung của nó, bao gồm đường đã đi qua bằng cách tiêu tốn gas, nhiên liệu gas còn có, số dặm đi được và thuộc tính _go theo kiểu boolean nhằm cho biết khi nào thì xe sẽ chạy và dừng, nó sẽ thể hiện khi ở trạng thái enable và không hoạt động khi ở trạng thái disable Những thuộc tính và phương pháp trong lớp này thuộc loại chung nên có thể sử dụng công cộng (tức là các lớp khác có thể thấy chúng) Chú ý đến hàm onloop() (cái này đã giải thích roài)

73 Hàm onloop() được đặt trong sự kiện ENTER_FRAME cho chúng ta thấy đây là hàm sẽ chạy chủ yếu trong chương trình chính, nó phải đảm bảo các yếu tố sau: Khi thuộc tính _go là đúng (true) thì xe sẽ bắt đầu chạy và số dặm mà xe chạy được sẽ tăng từ 0 đến... khi mà xe hết gas, thuộc tính này tăng theo giá trị của thuộc tính đường đã đi qua bằng cách tiêu tốn gas (hiển nhiên rồi), giá trị thuộc tính số lượng xăng còn phải giảm và khi nó < 1 thì thuộc tính _go nhận giá trị false và xe dừng lại, cửa sổ output cho chúng ta biết chúng ta đã đi hết bao nhiêu dặm với một lượng gas nhất định trên xe. Dưới đây là chi tiết của hàm onloop(): Trong hàm go() lệnh _go = true; sẽ giúp cho câu lệnh if ở hàm onloop hoạt động, cái này giống như việc mở và tắt máy của xe, chúng ta có thể sử dụng nhiều hệ thống phức tạp hơn nhưng tốt nhất là giữ cho VD càng đơn giản càng tốt. Main Flash file (mã lệnh ở file flash chính) Tại sao các bạn không nhấn Ctrl + Enter để xem điều gì xảy ra? :D

74 Mình đùa đấy vì chúng ta vừa viết xong một class thui, một class không có ý nghĩa gì nếu chúng ta không đặt nó vào một hồ sơ nào đó và đó là công việc của chúng ta trong phần này. Tham khảo kết quả khi chạy chương trình: Mã lệnh thêm vào main flash (chương trình chính, nhớ vị trí đặt của nó trên timeline) rất đơn giản nhưng trước khi xem mã lệnh, bạn không phải đặt tên của class vào mục instance (tên phiên bản của lớp trong trưòng hợp này là Vehicle ) điều này không được phép vì flash sẽ bị nhầm lẫn giữa lớp dành cho các đối tượng sẵn có trong flash và các lớp thêm vào để chạy với một đối tượng được chỉ định trên chương trình chính, và mã lệnh dưới đây sẽ báo lỗi. Nếu bạn làm theo lời mình nói thì mã lệnh ở dưới sẽ không sao var vehicle:vehicle = new Vehicle(21, 18); //lớp vehicle sẽ được truyền 2 biến _gasmileage nhận giá trị 21 và _fuelavailable nhận giá trị 18 vì chúng ta khai báo chúng theo kiểu public addchild(vehicle); //Khai báo và thêm cái xe vào màn hình vehicle.go(); // kick hoạt hàm go() của lớp Vehicle và xe sẽ chạy dĩ nhiên là chúng ta chưa có cái xe nào (đã vẽ đâu nó chỉ là movieclip rỗng chứa mã lệnh theo 1 lớp có sẵn thoai) do đó hãy tượng tượng là xe đang chạy như bay :D Thật là hay nếu chúng ta tạo ra nhiều loại xe khác nhau để tham gia giao thông. Như chúng ta thêm ô tô và xe tải vào chương trình, cả hai loại này đều là lớp mở rộng của lớp xe cộ, tất nhiên nó kế thừa mọi thuộc tính cũng như phương pháp của lớp xe cộ, để đơn giản chúng ta sẽ thêm vào cách phân loại một phương pháp để điều khiển từng xe một bằng một hàm phụ - một sunroof Cho ô tô và một tailgate cho xe tải. Lớp Car //Car.as package { import flash.display.movieclip; import flash.events.event; public class Car extends Vehicle { public function Car(mpg:Number, fuel:number) { _gasmileage = mpg; _fuelavailable = fuel; public function opensunroof() { trace(this, "opened sunroof");

75 Lớp Truck (xe tải) //Truck.as package { import flash.display.movieclip; import flash.events.event; public class Truck extends Vehicle { public function Truck(mpg:Number, fuel:number) { _gasmileage = mpg; _fuelavailable = fuel; public function lowertailgate() { trace(this, "lowered tailgate"); Xem lại main Flash file Chúng ta thêm 2 chiếc xe vào chương trình của flash, do đó mã lệnh ở chương trình chính cần sửa lại để phù hợp: //host.fla file var compact:car = new Car(21, 18); compact.x = 10; compact.y = 10; addchild(compact); //thêm xe car vào màn hình, ở vị trí (10;10) compact.opensunroof(); // chạy hàm Sunroof(); var pickup:truck = new Truck(16, 23); pickup.x = 10; pickup.y = 100; addchild(pickup); //thêm xe tải vào màn hình, ở vị trí (10;100) pickup.lowertailgate(); // chạy hàm lowertailgate(); stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { compact.go(); pickup.go(); // khi click chuột thì 2 xe cùng chạy Trước khi bạn click chuột để 2 xe cùng chạy bạn sẽ thấy ở cửa sổ output hiện ra Cái này dùng để phân biệt 2 xe. 2 xe có nhiên liệu và quãng đường chạy khi tiêu tốn 1 đơn vị gas khác nhau, do đó chuyển động cũng như quãng đường đi được của chúng khác nhau.

76 3. Composition (Sự hợp thành) Mặc dầu sự thừa kế là một cách rất chung trong lập trình hướng đối tượng, nhưng nó không phải là cách duy nhất cho những lớp có thể làm việc cùng nhau. Composition trong nhiều trường hợp cũng rất hữu dụng. nó sẽ biên soạn lại từ một đối tượng khác hơn là thừa kế từ một đối tượng khác, cách tốt nhất để mô tả sự hợp thành là đặt ra 2 câu hỏi nó là hoặc nó có. VD bạn muốn thêm lốp xe vào dựa trên y nguyên lớp của xe cộ, nếu vậy thì câu hỏi là nó là và bạn muốn biên soạn lại lớp lốp xe dựa trên lớp xe cộ thì câu hỏi của bạn sẽ là nó có. Chiếc xe tải có thể y nguyên lớp của xe cộ, do đó sự kế thừa trong VD này hoạt động tốt nhưng nếu lốp xe cũng thừa hưởng y nguyên lớp của xe cộ thì điều này lại không đúng. Ô tô được mở rộng từ xe cộ thì bạn không thể thay đổi được gì từ xe cộ cả, cho dù đó là lốp xe nhưng nếu chiếc xe của bạn có một lớp lốp xe, phụ tùng lung tung... thì ban lại có thể dễ dàng thay đổi lốp xe để đưa cho tài xế khác Chúng ta sẽ thêm sự hợp thành vào trong mã lệnh của Vehicle.as bằng cách thêm vào đó thuộc tính của lốp bánh xe _tires, trong mã lệnh đã có sẵn thuộc tính cho ô tô và xe tải. //Vehicle.as package { import flash.display.movieclip; import flash.events.event; public class Vehicle extends MovieClip { public var _gasmileage:number; public var _fuelavailable:number; public var _milestraveled:number = 0; public var _go:boolean; public var _tires:tires; public function Vehicle(mpg:Number=21, fuel:number=18.5) { _gasmileage = mpg; _fuelavailable = fuel; this.addeventlistener(event.enter_frame, onloop, false, 0, true); public function onloop(evt:event):void { if (_go) { _fuelavailable--; _milestraveled += _gasmileage; if (_fuelavailable < 1) { this.removeeventlistener(event.enter_frame, onloop); trace(this, _milestraveled, _fuelavailable); this.x = _milestraveled; public function go():void { _go = true;

77 Lập trình viên rất mệt mỏi chỉ để phân biệt thuộc tính _tires của lớp Vehicle.as và tìm cách có thể can thiệp vào thuộc tính này trong các lớp khác kế thừa của lớp Vehicle.as Chúng ta vẫn xét 2 lớp của xe tải và xe ô tô Chú ý thuộc tính _tires đang mang giá trị gì Chú ý thuộc tính _tires đang mang giá trị gì New Tires class (lớp mới của lốp xe) Chúng ta tạo ra một lớp mới cho thuộc tính _tires và một hay nhiều lớp kiểu này hợp lại sẽ bổ sung hoàn hảo cho lớp Vehicle.as đây chính là biểu hiện của sự hợp thành mà ưu điểm là

78 chúng ta dễ dàng thay đổi thuộc tính _tires chứ không gò bó vào lớp Vehicle.as như các thuộc tính khác. //Tires.as package { public class Tires { public var _type:string; public function Tires(type:String) { //đóng vai trong sự thay đổi hoạt động dựa vào kiểu lốp xe switch (type) { case "snow" : _type = "storm-ready snow"; //kiểu lốp xe đi vào tuyết break; case "highperformance" : _type = "high-performance radial"; //kiểu lốp xe đi trên đường cao tốc. break; default : _type = "economical bias-ply"; public function get type():string { return _type; Ở Main Flash file thì mã lệnh không phải thay đổi gì tuy nhiên kết quả ở output sẽ khác: 4. Encapsulation (Đóng gói) Đầu tiên chúng ta có 2 khái niệm cần chú ý: Lớp chính (superclass): được hiểu là lớp sẽ cho một lớp khác thừa kế thuộc tính cũng như phương pháp của nó. VD trong phần trước, lớp MovieClip là một superclass vì nó cho lớp vehicle thừa kế Lớp phụ, lớp bổ sung (subclass): được hiểu là lớp sẽ thừa kế từ một lớp khác, nó có những thuộc tính cũng như phương pháp của superclass

79 VD trong phần trước, lớp vehicle là một subclass vì nhận thừa kế từ lớp MovieClip là một superclass. Trong tất cả các vd trrước đây, chúng ta đều khai báo những biến của lớp bằng public. Khai báo kiểu này rất tiện lợi vì các đoạn mã ngoài lớp (như mã trong flash) sẽ có thể nhìn thấy và can thiệp vào các thuộc tính cũng như phương pháp của lớp, tuy nhiên điều này đồng nghĩa với việc một số đoạn mã có thể thay đổi giá trị của lớp một cách vô tình hoặc cố ý bởi ứng dụng mà chúng ta có thể nhận ra hoặc không, đóng gói là một biện pháp hữu hiệu để ngăn điều này xảy ra. Đơn giản là đóng gói cho phép bạn ẩn những thuộc tính hoặc phương pháp của lớp ở một vùng dự án nào đó của lớp nhưng vẫn cho phép bạn thao tác với chúng một cách có kiểm soát. Chúng ta thay đổi public bằng private điều này sẽ giúp chúng ta và chương trình chỉ tiếp cận được với những biến khác của lớp đó. Cho những mục đích của chúng ta, lớp và cấu trúc xây dựng phải luôn luôn khai báo quyền sử dụng ở public để bất kỳ bộ phận của dự án của bạn có thể tạo ra một thể hiện của lớp (create an instance of the class) Ngoài ra còn 1 vài ngoài lệ nhưng nó nằm ngoài phần tổng quan này. Vehicle class Quay trở lại vd, nhưng mã lệnh sẽ được thay đổi lại cho phù hợp Chúng ta quan tâm đến dòng lệnh 9 --> 13, điều này khai báo các biến thuộc loại private (được hiểu là những thuộc tính, hoặc hàm, hoặc phương pháp riêng cho một lớp nào đó, không phải lớp hay chương trình khác có thể can thiệp vào một cách dễ dàng (chúng ta sẽ thảo luận cách sử dụng ngay bây giờ) public hay private trong AS3 được hiểu là namespaces trong cấu trúc của mã lệnh) Đây là đoạn mã tiếp

80 Mã lệnh còn lại giữ nguyên trừ Hàm onloop() đã được đặt ở private (hoạt động riêng trong lớp) vậy làm sao để chương trình có thể sử dụng được hàm onloop này từ lớp vehicle.as. Câu

81 trả lời là sử dụng hàm này bằng cách thông qua các hàm get và set, cần phải hiểu set và get là 2 từ khóa. Cách lệnh từ dòng 37--> 63 đã được thêm vào nhằm xây dựng các hàm get và set, 2 hàm này bạn có thể kiểm soát tốt các thông tin sẽ ra và vào trong những thuộc tính riêng (private) của lớp Hàm go() cần giữ nguyên là public để chúng ta có thể can thiệp đến nó từ nhiều vị trí đặt mã lệnh khác trong chương trình. Như chúng ta đã thảo luận, hàm get and set xác định nói về những phương pháp như nhau Hàm trả về giá trị hiện thời hay thiết lập giá trị mới cho thuộc tính, sử dụng cú pháp tương tự như đã nêu. Chúng được xem như những lời hướng dẫn về mã lệnh, làm mã lệnh trở lên dễ hiểu, nếu bạn không phảỉ đề cập đến get hoặc set hoặc thậm chí sử dụng cú pháp của phương pháp đó bạn vẫn có thể làm mà không cần đóng gói tuy nhiên một lợi ích khác được đưa ra sau đây Chúng ta tạo ra những KQ mong muốn với lớp, chúng ta có thể sử dụng những thuộc tính cũng như phương pháp của nó dễ dàng Xem xét đoạn mã sau : public function get gasmileage():number { return _gasmileage; Cần nhớ giá trị trả về cho việc sử dụng thuộc tính _gasmileage của lớp vehicle là gasmileage, tức là bạn chỉ có thể tham chiếu đến thuộc tính này thông qua giá trị có tên là [tên đối tượng đang sử dụng lớp vehicle].gasmileage VD: var compact:car = new Car(21, 18); trace(compact.gasmileage) 21 được truyền cho tham số _gasmileage của lớp Car, lớp này là lớp mở rộng của Vehicle mà lớp Vehicle lại có hàm get gasmileage(), do đó đối tượng compact này sẽ có thể sử dụng giá trị của thuộc tính _gasmileage thông qua biến compact.gasmileage Hàm get và set cho chúng ta truy cập, thay đổi các thuộc tính của lớp, đó là một cách tốt. Tuy nhiên chúng ta cần một cách truy suất trực tiếp hơn nữa, trước đây chúng ta sử dụng những thuộc tính thuộc loại private bằng cách xây dựng thêm một subclass (bổ sung lớp) dành cho việc này. Sử dụng phương pháp super() là một sự lựa chọn mới mẻ nhưng rất hiệu quả. Chúng ta nhìn thấy phương pháp này ở dòng 6 của 2 lớp sau: Car class //Car.as package { import flash.display.movieclip; import flash.events.event; public class Car extends Vehicle { public function Car(mpg:Number, fuel:number) { super(mpg, fuel); var tires:tires = new Tires("highperfomance"); trace(this + " has " + tires.type + " tires");

82 public function opensunroof() { trace(this, "opened sunroof"); Truck class //Truck.as package { import flash.display.movieclip; import flash.events.event; public class Truck extends Vehicle { public function Truck(mpg:Number, fuel:number) { super(mpg, fuel); var tires:tires = new Tires("snow"); trace(this + " has " + tires.type + " tires"); public function lowertailgate() { trace(this, "lowered tailgate"); Lệnh super(mpg, fuel); truyền 2 tham số mpg và fuel cho 2 biến _gasmileage và _fuelavailable ở lớp vehicle, vì 2 thuộc tính này là private nên chỉ lớp vehicle có quyền can thiệp, sau đó nó truyền thuộc tính này cho chương trình để chương trình hiểu rằng 2 đối tượng compact và pickup có 2 biến _gasmileage và _fuelavailable mang giá trị được truyền. Việc chỉ định này là an toàn cho dữ liệu ở lớp vehicle chúng ta nói rõ hơn về phương pháp này trong phần sau. Mã lệnh ở hàm Tires.as và ở main flash vẫn như cũ. 5. Polymorphism (Tính đa hình) Đây là khái niệm cuối cùng mà chúng ta bàn luận trong lập trình OOP, là khả năng chạy hay không chạy của lớp phụ (subclass) bao gồm hàm, phương pháp của lớp chính (superclass) đang cho nó kế thừa, hoặc chỉ định chạy hàm, phương pháp nào khi chúng có tên trùng nhau... (VD trong 2 lớp, một lớp thừa kế từ lớp kia nhưng 2 lớp đều có 2 phương pháp có tên giống nhau nhưng chức năng khác nhau, tính đa hiệu sẽ cho chúng ta biết cách sử dụng 2 hàm này tùy theo ý của chúng ta mà flash không bị nhầm lẫn) Mã lệnh của chúng ta không có nhiều thay đổi, đây là lớp Vehicle.as //Vehicle.as package { import flash.display.movieclip; import flash.events.event; public class Vehicle extends MovieClip { private var _gasmileage:number; private var _fuelavailable:number; private var _milestraveled:number = 0;

83 private var _go:boolean; private var _tires:tires; public function Vehicle(mpg:Number=21, fuel:number=18.5) { _gasmileage = mpg; _fuelavailable = fuel; this.addeventlistener(event.enter_frame, onloop, false, 0, true); private function onloop(evt:event):void { if (_go) { _fuelavailable--; _milestraveled += _gasmileage; if (_fuelavailable < 1) { this.removeeventlistener(event.enter_frame, onloop); trace(this, _milestraveled, _fuelavailable); this.x = _milestraveled; public function changegear():void { trace(this, "changed gear"); public function useaccessory():void { trace(this, "vehicle lights turned on"); public function go():void { _go = true; public function get gasmileage():number { return _gasmileage; public function set gasmileage(mpg:number):void { _gasmileage = mpg; public function get fuelavailable():number { return _fuelavailable; public function set fuelavailable(fuel:number):void { _fuelavailable = fuel; public function get milestraveled():number { return _milestraveled; public function get tires():tires {

84 return _tires; public function set tires(tires:tires):void { _tires = tires; Mã lệnh thêm vào ở đây là public function changegear():void { trace(this, "changed gear"); public function useaccessory():void { trace(this, "vehicle lights turned on"); Đây không phải là 2 hàm xa lạ, trái lại chúng ta đã sử dụng nó nhiều, bây giờ chúng ta dùng nó như một ví dụ minh họa cho tính đa hiệu Polymorphism, hai lớp Car và Truck cũng có thể sử dụng 2 hàm này theo tính thừa kế của OOP Tính đa hiệu này cho phép chúng ta sử dụng các hàm, phương pháp của một lớp thừa kế cho lớp chúng ta đang sử dụng thừa kế từ superclass Chúng ta xem xét lớp Car và Truck mới: //Car.as package { import flash.display.movieclip; import flash.events.event; public class Car extends Vehicle { public function Car(mpg:Number, fuel:number) { super(mpg, fuel); var tires:tires = new Tires("highperfomance"); trace(this + " has " + tires.type + " tires"); public function opensunroof() { trace(this, "opened sunroof"); override public function useaccessory():void { opensunroof(); Mọi thứ vẫn như cũ trừ lớp Car đã thêm hàm useaccessory() điều này bình thường thì không có vấn đề gì nhưng trong trường hợp này, lớp vehicle cũng có một hàm có tên tương tự, vậy để tránh nhầm lẫn, chúng ta sử dụng từ khóa override cho hàm useaccessory(), từ khóa đó có nghĩa là đè hàm useaccessory() sẵn có trong lớp Vehicle mà thay vào đó sẽ thực hiện hàm useaccessory() của lớp Car 100% mã lệnh của lớp vehicle đã bị đè, tuy nhiên một số trường hợp chúng ta vẫn muốn giữ lại mã lệnh từ hàm useaccessory() của vehicle, chúng ta xem xét ở VD của Truck.

85 //Truck.as package { import flash.display.movieclip; import flash.events.event; public class Truck extends Vehicle { public function Truck(mpg:Number, fuel:number) { super(mpg, fuel); var tires:tires = new Tires("snow"); trace(this + " has " + tires.type + " tires"); public function lowertailgate() { trace(this, "lowered tailgate"); override public function useaccessory():void { lowertailgate(); super.useaccessory(); Lệnh super.useaccessory(); sẽ thực hiện hàm useaccessory(); từ Vehicle.as tức là từ hàm superclass của nó. Mã lệnh ở file main flash: var compact:car = new Car(21, 18); compact.x = 10; compact.y = 20; addchild(compact); compact.changegear(); compact.useaccessory(); var pickup:truck = new Truck(16, 23); pickup.x = 10; pickup.y = 100; addchild(pickup); pickup.changegear(); pickup.useaccessory(); stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:mouseevent):void { compact.go(); pickup.go(); Nhấn Ctrl + Enter để so sách sự khác biệt

86 Compact không có dòng turned on lights vì hàm ghi ra nó đã bị đè 6. Navigation Bar Revisited (Làm lại thanh tương tác) * Menu nút lệnh Ở chương 4 chúng ta đã có một dự án tương tự, nhưng chúng ta mới chỉ dùng mã lệnh, bây giờ chúng ta sẽ vận dụng những đặc tính của OOP để xây dưng một thanh tương tác mới. Bạn hãy mở hồ sơ LAS3Lab.fla để biết dự án của chúng ta sẽ như thế nào. Trong dự án của chúng ta, MovieClip trông giống như một thanh tab, mỗi nút thực đơn sẽ nằm trên thanh tương tác. Tên của mỗi nút lệnh chúng ta có thể điều khiển bằng MC _label nó được lấy thông tin từ lớp có vị trí app.gui.menubuttonmain. * Đường viền. Có chiều rộng 8 pixel và chiều dài tùy vào chiều dài của nút lệnh, nó sẽ bao lấy núi lệnh. Nó được tạo ra một cách động (tức là dùng mã lệnh) ở lớp có vị trí app.gui.hlinethick. Nếu bạn muốn tự làm 1 dự án mới, tốt nhất hãy theo địa chỉ của các lớp trong file mẫu, và sử dụng tài nguyên của bạn theo ý muốn. bạn cũng có thể phát triển file mẫu theo ý của bản. DOCUMENT CLASS Mục tiêu đầu tiên của chúng ta là xây dựng lớp LAS3Main.as Hãy để nó liên kết chặt chẽ với file hồ sơ fla bằng cách chúng tôi đã chỉ cho các bạn ở chapter 1. Chúng ta nhập vào lớp LAS3Main.as theo lớp của flash.display.sprite và nó thừa hưởng đặc tính của sprite //LAS3Main.as package { import flash.display.sprite; import app.gui.navigationbar; //nhập mã nguồn của lớp NavigationBar public class LAS3Main extends Sprite { public function LAS3Main() { var appdata:array = ["one", "two", "three", "four", "five"]; //tạo mảng có 5 phần tử kiểu chuỗi ký tự var navbar:navigationbar = new NavigationBar(this, appdata); // tạo một đối tượng theo lớp NavigationBar (lớp này sẽ được tìm hiểu sau) addchild(navbar); //Thêm nó vào danh sach màn hình (display list nghe quen không? )

87 Sprite cũng không khác nhiều so với MovieClip, dưới góc độ của phát triển game thì sprite là một vật thể có thể di chuyển và tương tác trong game. Thực tế với AS2 hoặc thậm chí là AS3 trở xuống, người ta vẫn sử dụng MovieClip để làm 1 sprite khi viết game flash. Lớp NavigationBar Chúng ta sẽ viết tiếp lớp này, đã được đề cập ở phần trên : // app > gui > NavigationBar.as package app.gui { import flash.display.sprite; public class NavigationBar extends Sprite { //lớp này kế thừa thuộc tính của sprite private var _app:sprite; private var _hline:hlinethick; //lớp HlineThick sẽ được viết sau private var _navdata:array; public function NavigationBar(app:Sprite, navdata:array) { //hàm này sẽ được nhận tham số truyền vào từ lớp LAS3Main.as theo câu lệnh: //var navbar:navigationbar = new NavigationBar(this, appdata); _app = app; _navdata = navdata; build(); //hàm build(); này sẽ được viết ngay sau đây private function build():void { for (var i:uint; i < _navdata.length; i++) { //tạo số nút bấm = giá trị thuộc tính _navdata.length = 5 phần tử var menubtn:menubuttonmain = new MenuButtonMain(navData[i]); //lớp MenuButtonMain sẽ được định nghĩa sau menubtn.x = 20 + (menubtn.width + 2) * i; menubtn.y = 75; //tọa độ của nút bấm cách lề trái 20 pixel, mỗi nút kề nhau cách nhau 2 pixel addchild(menubtn); //thêm vào màn hình //kết thúc vòng lặp for _hline = new HLineThick(); //tạo một đối tượng thanh ngang mới cần lưu ý là thanh ngang chúng ta sẽ tạo theo một đối //tượng sẵn có trong library có các thuộc tính dưới đây (nhớ thiết lập linkage là HLineThick) _hline.y = 100; //thanh ngang ở dưới các nút trên thanh tương tác _hline.mouseenabled = false; //Chuột bị vô hiệu hóa khi rê đến đường viền của thanh để ngăn chặn mouse feedback (phản //hồi) and event trapping (bẫy) thực tế thì click vào thanh ngang chả có ý nghĩa gì addchild(_hline); //thêm vao màn hình //kết thúc hàm build

88 //kết thúc lớp NavigationBar //kết thúc gói MenuButtonMain (lớp MenuButtonMain) Lớp MenuButtonMain như sau: package app.gui { //đường dẫn đến lớp import flash.display.sprite; import flash.text.textfield; import flash.events.mouseevent; //nhập các class cần thiết có sẵn của flash về text, event... public class MenuButtonMain extends Sprite { public var _label:textfield; //TextField là một kiểu đối tượng có sẵn của flash public function MenuButtonMain(labl:String) { //chúng ta xem lại var menubtn:menubuttonmain = new MenuButtonMain(navData[i]); //từ lớp NavigationBar, với vòng lặp for đó + Lớp MenuButtonMain này, chúng ta sẽ tạo ra //được 5 nút có labl lần lượt là one, two,... five và nó gắn cho _label.text _label.text = labl; // nội dụng của lớp text chính là nội dung của tham số label truyền vào. _label.mouseenabled = false; //tắt các sự kiện của chuột khi rê trên _label buttonmode = true; //có thể sử dụng như một button (chứ không chỉ là MovieClip) usehandcursor = true; //cho phép sử dụng chuột hình bàn tay khi rê vào Nút bấm addeventlistener(mouseevent.click, onclick, false, 0, true); //Kết thúc hàm MenuButtonMain private function onclick(evt:mouseevent):void { trace(_label.text); //Nội dung của _label.text hiện lên khi ta click vào nó //kết thúc hàm onclick // kết thúc lớp MenuButtonMain //kết thúc gói

89 7. Bổ sung chương 6 (VD về Navigation Bar của chương này khá khó hiểu, các bạn có thể xem VD sau của mình, tất nhiên là đơn giản hơn minh tự viết mà hi vọng các bạn sẽ hiểu hơn về oop) Dự án của chúng ta sẽ là xây dựng các sprite trên màn hình có khả năng tương tác bằng cách viết lớp cho nó. Đầu tiên chúng ta tạo một movieclip: Vẽ hình tròn, sau đó tô màu cho nó giống quả bóng. Vẽ thế này cho nó 3D một chút Chúng ta viết một lớp cho MovieClip này: (lưu dưới tên Ball.as) package { import flash.display.movieclip; import flash.events.event; import flash.events.mouseevent; public class Ball extends MovieClip { public var dx:number = Math.random()*10-5; public var dy:number = Math.random()*10-5; //khai báo các giá trị dx, dy là tốc độ dịch chuyển của quả bóng. public function Ball() { x = Math.random()*500;

90 y = Math.random()*400; //đặt vị trí ngẫu nhiên của qủa bóng trên màn hình addeventlistener(mouseevent.click, onclick, false, 0, true); addeventlistener(event.enter_frame, onloop, false, 0, true); //thêm 2 sự kiện của FRAME_FRAME và MOUSE để thực hiện 2 hàm onclick() và onloop() //định nghĩa hàm onloop() private function onloop(evt:event):void { x += dx; y += dy; //Quả bóng dịch chuyển theo 2 gía trị dx và dy if ((x > 550-width) (x < 0)) { dx *= -1; if ((y > 400-height) (y < 0)) { dy *= -1; //khi quả bóng chạm nền thì nó sẽ bật ngược lại do giá trị dx (hoặc dy) bị đảo ngược //chúng ta viết 550-width tức là giá trị độ rộng của màn hình chiều dài quả bóng (giúp quả //bóng phản hồi giống thật hơn //định nghia hàm onclick() xóa quả bóng khi chúng ta click vào nó private function onclick(evt:event):void { removechildat(0); Đây là mã lệnh tạo ra 100 quả bóng, viết trong Main Flash for (var inc:uint = 0; inc < 100; inc++) { var ball:ball = new Ball(); addchild(ball); KẾT LUẬN: Vì sao mình lại đưa ra VD này? là vì chúng ta có thể thấy được 1 ứng dụng rất hay của lớp là chúng ta có thể tạo ra nhiều bản sao của một nguyên bản nào đó mà có một lớp mô tả chi tiết cho nó nhưng không có file mẫu nào trong sách nói đến điều này. điều này thực sự có ý nghĩa. VD khi bạn viết 1 game muốn tạo 100 con quái thì mã lớp này rất hữu ích với bạn, đồng thời chúng ta có thể thay đổi, mở rộng lớp để có thêm nhiều thuộc tính cũng như chức năng mới của quái chẳng hạn (đã được nói trong chapter 6)

91 Chương 7: Sự chuyển động Từ kinh nghiệm đầu tiên đến khi mất rất nhiều thời gian, bây giờ bạn đã có thể dịch chuyển một đối tượng nào đó lấy từ tài nguyên của bạn (bitmap chẳng hạn --> movieclip...) bằng mã lệnh. Bạn có thể đã hài lòng về điều đó. Bạn có thể so sánh việc sử dụng AS với cách làm các đối tượng chuyển động theo các công cụ sẵn có của flash, sử dụng AS chẳng những nó giúp bạn giải phóng khỏi timeline dài lằng nhằng mà kém hiệu quả khi xây dựng chuyển động theo các công cụ hoạt hình cũ mà còn cho phép bạn điều khiển đối tượng một cách hoàn chỉnh, có thể tự do hoạt dộng theo ý muốn. Chúng ta sử dụng AS để mô phỏng một sự di chuyển sẽ có thể làm cho nó giống thật hơn thông qua việc tương tác với các mô trường có sự biến đổi đa dang. Các bạn có thể sử dụng hồ sơ mẫu để theo dõi chương này và phát triển nó theo những dự án riêng của bạn. Bạn cần phải có kiến thức nhất định về toán học, bao gồm lượng giác (hơi khó với HS mình cũng là HS mà), CT Py-ta-go (cái này dễ ẹc)... tuy nhiên nếu bạn hiểu rõ về ứng dụng của toán học trong lập trình chuyển động thì có nghĩa là bạn đã đi được một bước dài. 1. Basic Movement (Sự di chuyển đơn giản) Đơn giản đến mức các bạn cũng đã biết, chúng ta sẽ sử dụng mã lệnh để một đối tượng di chuyển thông qua thuộc tính tọa độ x và y của nó. Flash có một hệ trục tọa độ với tâm tọa độ là đỉnh của vùng làm việc phía trên bên trái của vùng. Trục Ox hướng ngang chiều dương từ trái-->phải, trục Oy hướng thẳng đứng, chiều dương hướng xuống. Cái này hơi khác trong toán học một tí :D. Giả sử chúng ta có 2 movieclip là mc và mc2, chúng ta cho chúng di chuyển bằng cách: mc.x++; mc.y--; mc2.x += 10; mc2.y -= 10; Câu hỏi là nó sẽ di chuyển được bao nhiêu? mc sẽ qua phải 1 pixel và lên trên 1 pixel --> nó sẽ đi sang hướng đông bắc 1 góc 45 0 và quãng đường đi được là căn bậc 2 của 2. mc2 sẽ qua phải 10 pixel và lên trên 10 pixel --> nó sẽ đi sang hướng đông bắc 1 góc 45 0 và quãng đường đi được là căn bậc 2 của 200 (theo định lý py-ta-go). Vấn đề là khi nó di chuyển xong thì sẽ như thế nào, cái này tùy vào mã lệnh đang được đặt ở đâu, nếu trong timeline chính thì sau khi di chuyển xong nó sẽ dừng lại. Nếu đặt trong một hàm nào đó có EventListener là ENTER_FRAME thì nó sẽ di chuyển mãi mãi. VD: var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var xvel:number = 4; var yvel:number = 4; addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { ball.x += xvel; ball.y += yvel;

92 Khi quả banh đi quá màn hình, bạn sẽ thấy nó biến mất không phải vì nó không chuyển động nữa mà nó đang chuyển động ở vùng mà chúng ta không thể thấy được (và sẽ không thể thấy được nữa). Bạn cần hiểu một số khái niệm về vật lý, đó là tọa độ (x,y) cái này nói roài, tốc độ được tính bằng (quãng đường đi được)/(thời gian đi hết quãng đường đó) thực tế vận tốc trong cuộc sống đo bằng m/s VD: Cứ cho sau 1 giây thì mã lệnh sau được lặp lại khi rơi vào sự kiện ENTER_FRAME: ball.x += 10; vậy tốc độ ở đây là 10pixel/giây. Người ta thường coi vận tốc là một đại lượng vectơ có hướng và độ lớn. độ lớn của vân tốc chính là 10pixel/giây còn hướng mình đã nói roài, nếu ngược chiều dương trục Ox (hoặc Oy) thì tốc độ có giá trị âm, ta nói độ lớn của vận tốc (tốc độ) là một đại lượng đại số - có thể âm và dương. Chúng ta xem xét đến 1 khái niệm vật lý nữa, đó là gia tốc, một con tàu vũ trụ muốn bay vào không gian thì không cần một vận tóc lớn, chỉ cần một gia tốc đủ mạnh để thắng gia tốc hướng tâm của trái đất là được (g = 9.8 m/s 2 ), vậy gia tốc là cái gì và vì sao nó có đơn vị m/s 2. tọa độ là 1 hàm bậc nhất theo thời gian tăng theo vận tốc, tương tự vận tốc cũng là 1 hàm bậc nhất theo thời gian tăng theo giá trị của gia tốc VD: var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var xvel:number = 4; var yvel:number = 4; var xacc:number = 1; var yacc:number = 1; //khai báo 2 giá trị gia tốc theo trục Ox và Oy addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { ball.x += xvel; ball.y += yvel; xvel += xacc; yvel += yacc; //Gia tốc sẽ tăng vận tốc lên (+ thêm xvel và yvel đơn vị) mỗi khi câu lệnh được gọi, do //đó vận tốc sẽ tăng theo một hàm bậc nhất có Hệ số góc là xacc (hoặc là yacc). Các bạn đọc sách toán lớp 9 có nói đến Hs góc :D Mã lệnh không khác nhiều, những chữ in nghiêng là mã lệnh được thêm vào. Công thức tính gia tốc (vận tốc sau vân tốc trước)/(thời gian thực hiện việc tăng tốc đó). Vận tốc có đơn vị m/s --> gia tốc có đơn vị (m/s)/s = m/s 2. VD: sau một khoảng 5s một vật có v = 10 m/s tăng lên 20m/s hỏi gia tốc vật đó trong khoảng thời gian 5s nói trên là bao nhiêu? a (ký hiệu phổ biến của gia tốc) = (20-10)/5 = 2 m/s 2 tức là cứ 1 giây thì vận tốc tăng thêm 2. Giống như vận tốc người ta có thể biểu diễn gia tốc theo một vectơ có hướng và độ lớn, và nó cũng là một đại lượng đại số.

93 VD mã lệnh trên gia tốc chính là xvel và yvel. Bạn có thể sử dụng quy tắc cộng 2 vectơ trên để cho ra vectơ gia tốc chính xác (có độ lớn = căn bậc 2 của xvel 2 + yvel 2, hướng thì mình đã trình bày roài). 2. Geometry and Trigonometry (Hình học và lượng giác) Distance (khoảng cách) Đầu tiên, hãy nói về việc giả sử bạn đang lập trình 1 game, trong game sẽ có kẻ thù truy đuổi bạn và bạn phải tìm mọi cách để trốn thoát. Khi kẻ thù ở quá gần, bạn buộc phải chọn một đường thoát hiểm gần nhất trong 2 đường. Người chơi điều khiển nhân vật và bạn phải tạo đủ thử thách để kẻ thù có thể bắt được người chơi nếu anh ta có một tính toán sai lầm, để tạo được điều đó, kẻ thù của chúng ta cũng phải cho kẻ thù biết được nơi thoát hiểm gần nhất của người chơi. Vấn đề của chúng ta là làm sao để kẻ thù của người chơi biết trong 2 lối thoát, lối nào gần hơn? và định lý Py-ta-go sẽ cho chúng ta câu trả lời. Định lý này nói rằng: chiều dài của cạnh dài nhất của một tam giác vuông bằng căn bậc 2 của tổng bình phương 2 cạnh còn lại theo chiều ngang và chiều dọc Rightangle: góc vuông Hypotenuse: cạnh huyền Hình 7-3 cho chúng ta cách tính khoảng cách giữa 2 điểm bất kỳ theo tọa độ của chúng bằng định lý Py-ta-go. Sau đây là một chương trình thực tế về cách tính khoảng cách này, các bạn nên xem file mẫu để biết chúng tôi hoàn thành dự án như thế nào, trong đó có toàn bộ tài nguyên cần thiết mà việc tạo ra chúng nằm ngoài phạm vi nội dung của cuốn sách: Hàm tính khoảng cách: function getdistance(x1:number, y1:number, x2:number, y2:number):number { var dx:number = x1-x2; var dy:number = y1-y2;

94 return Math.sqrt(dx * dx + dy * dy); Đây là một vd về cách sử dụng hàm getdistance() kèm theo file nguồn, nó là 1 sự so sánh khoảng cách giữa ball1 và ball0 và giữa ball2 và ball0 var dist1 = getdistance(ball0.x, ball0.y, ball1.x, ball1.y); var dist2 = getdistance(ball0.x, ball0.y, ball2.x, ball2.y); if (dist1 < dist2) { trace("ball1 is closest to ball0"); else { trace("ball2 is closest to ball0"); Movement Along an Angle (Chuyển động theo một góc) Phần này mình khá rành. Do đó mình vừa dịch vừa tự phổ biến kiến thức mà mình biết để các bạn dễ hiểu. Chúng ta thấy trên hình 7-4 là các góc trong flash của một đối tượng bất kỳ, VD: bạn có 1 movieclip mc có góc là 0 0 ==> nó sẽ hướng về phía bên phải theo chiều trục Ox, nếu mc có góc là nó sẽ hướng lên trên, ngược chiều của trục Oy. Thuộc tính góc của đối tượng chúng ta có thể sử dụng thuộc tính rotation để thay đổi một cách dễ dàng. Điều thứ 2 chúng ta bàn luận là đơn vị sử dụng góc. Phổ biến nhất là độ và radian. Flash sử dụng đơn vị là radian trong tính toán (dùng trong hàm sin, cos, tan, atan...) và chúng ta cần phải biết chuyển đổi qua lại giữa 2 đơn vị này một cách thành thục để tiện cho công việc lập trình. 1π Radian = Mặc dù điều này đúng trên thực nghiệm nhưng nguyên tắc thì lại không ổn vì dấu đẳng thúc xảy ra với 2 đai lượng có đơn vị khác nhau

95 Tuy nhiên chúng ta có thể sử dụng CT sau 1(Radian) = 180(đơn vị là độ)/π, gần đúng là 57 độ. Trong AS chúng ta viết như sau: Var degrees:number = 180; Var radian:number; radian = (degrees*math.pi)/180; //radian = π Từ degrees (đơn vị là độ), chúng ta tạo ra radian (đơn vị là radian). Tương tự để chuyển một đơn vị từ radian sang độ, chúng ta có CT sau: 1 (độ) = 1π (radian)/180; Var degrees:number ; Var radian:number= Math.PI; degrees = radian * 180 / Math.PI; //degrees = VD trên là mình tự thêm vô cho các bạn dễ dàng khi lập trình, có trong sách nhưng nó không rõ ràng lắm. Hình mà các bạn thấy ở trên là vòng tròn lượng giác biểu diễn các giá trị của sin và cos trong lượng giác. Cho 1 tam giác vuông bất kỳ thì: sin (góc nào đó) = Cạnh đối của góc/cạnh huyền cos (góc nào đó) = Cạnh kề của góc/cạnh huyền Mình chú ý một tí là đường tròn lượng giác của học sinh phổ thông thì cạnh huyền chính là hypotenuse = 1 do đó y = sin(angle) hay trục Oy thường được gọi là trục sin, tượng tự trục Ox được gọi là trục cos). Chúng ta bàn luận một tí về vectơ cái đã, cái này trong sách không nói đâu, phần trước mình có nói qua roài. Vectơ là một đại lượng có hướng, nó có độ lớn nhất định (là bằng chiều dài của vectơ khi biểu diễn trên mặt phẳng bằng một mũi tên). Một vectơ luôn chỉ rõ điểu đầu (xuất phát) và điểm cuối (mũi của mũi tên) VD: (độ lớn a) (đầu) (cuối)

96 (độ lớn 2a có chiều dài gấp đôi cái trên) (đầu) (cuối) Chúng ta có thể tổng hợp 2 vectơ bằng nhiều quy tắc và các trường hợp khác nhau 1. Quy tắc hình bình hành: Những đường gạch đứt không phải là vectơ mà là minh họa cho cái hình bình hành. :D Để tổng hợp 2 vectơ bất kỳ (màu đỏ và đen) và vectơ tổng hợp là màu xanh, chúng ta thấy rằng vectơ tổng hợp chính là hình chéo của hình bình hành, có 2 cạnh có độ lớn là bằng độ lớn của 2 vectơ cần tổng hợp. Công thức này dành cho HS lớp 10 vật lý thoai, mình đưa ra công thức sau để tính độ dài của vectơ xanh. Độ lớn vectơ: Xanh 2 = Đỏ 2 +Đen 2-2*Đỏ*Đen*Cos α (α = góc giữa vectơ đỏ không đứt đoạn và đen đứt đoạn) Lấy căn bậc 2 chúng ta có độ lớn vectơ xanh tổng hợp. Các bạn có thể tính hướng của vectơ tổng hợp 2. Công thức tính 2 vectơ vuông góc với nhau Thực tế góc giữa 2 vectơ trong flash theo Ox và Oy là 90 0 chúng ta tổng hợp vectơ theo Công thức sau: Xanh 2 = Đỏ 2 +Đen 2 (trường hợp này α = 90 => cos α = 0=> 2*Đỏ*Đen*Cos α = 0) Vì sao phải học cách tổng hợp vectơ? là vì tốc độ (hoặc tương tự các bạn có thể biểu diễn gia tốc) trong flash thực ra chính là tổng hợp của 2 vectơ vận tốc của 2 trục Ox và Oy, nếu bạn chuyển động qua phải 2 pixel và xuống dưới 2 pixel thì chính là bạn đang di chuyển theo hướng đông nam và với vận tốc căn bậc 2 của tổng ( ) Để minh họa, chúng ta sẽ nghiên cứu VD sau: cho một vật có một vận tốc nhất định, hãy biểu diễn chuyển động của nó trên màn hình. Đầu tiên, vận tốc là một đại lượng vectơ, đề cho vận tốc tức là cho chúng ta hướng (góc của nó) và độ dài độ lớn (là tốc độ của vận tốc). Để biểu diễn chuyển động trong flash, chúng ta cần biết các giá trị xvel và yvel, để vật có thể chuyển động được (trong phần trước có nói roài). Chúng ta sử dụng mã lệnh sau: var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var speed:number = 12; var angle:number = 45; //các đặc tính cơ bản của vectơ vận tốc

97 var radians:number = deg2rad(angle); //chuyển đổi từ angle (đơn vị là độ) sang radian var xvel:number = Math.cos(radians) * speed; //xvel phải nhân cho speed để biết độ dài của vectơ vận tốc theo trục Ox, nếu không nhân thì //chúng ta chỉ có vận tốc của vectơ vận tốc cơ bản (cạnh huyền của tam giác trong đường tròn //lượng giác = 1 đơn vị) có độ dài là 1*radians var yvel:number = Math.sin(radians) * speed; //yvel phải nhân cho speed để biết độ dài của vectơ vận tốc theo trục Oy, nếu không nhân thì //chúng ta chỉ có vận tốc của vectơ vận tốc cơ bản (cạnh huyền của tam giác trong đường tròn //lượng giác = 1 đơn vị) có độ dài là 1*radians //các giá trị vectơ theo 2 trục Ox và Oy (tổng hợp lại chính là vectơ vận tốc) để vật di chuyển //theo 2 trục tọa độ addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { ball.x += xvel; ball.y += yvel; //ball di chuyển. function deg2rad(deg:number):number { return deg * (Math.PI/180); //trả về giá trị của radian Circular Movement (sự di chuyển theo đường tròn) Phần này khá khó, sử dụng lượng giác đau đầu lắm Cái hình này bỏ vào cho sinh động thôi, chứ nó khó hiểu lắm Bốn chuyển động quay những góc khác nhau xung quanh một vòng tròn, biểu thị cả hai, một trong những độ của góc và hai là tọa độ X và Y chỉ trên về một vòng tròn với một bán kính 150 pixel Bạn đã biết cách xác định trên trục x và y thông qua giá trị của vectơ vận tốc (độ lớn (speed), hướng (angle)), chúng ta có cơ sở để phát triển lên chuyển động tròn.

98 Lấy VD đơn giản như trái đất chuyển động tròn quanh mặt trời, và mặt trăng chuyển động tròn quanh trái đất (tròn ở đây có tính tương đối, thực tế thì nó chuyển động hình elip) Chúng ta không quan tâm đến độ lớn của vận tốc hay hướng của nó vì chúng ta không sử dụng 1 vectơ để biểu diễn chuyển động, một vectơ chỉ biểu diễn 1 hướng trong khi chuyển động tròn thì hướng chuyển động của vật là biến thiên, thay vào đó chúng ta sẽ tính toán các giá trị x và y liên tiếp trong những góc khác nhau, bằng cách sử dụng hàm sin và cos, bạn có thể di chuyển một vật theo hình tròn. Kỹ thuật chúng tôi trình bày không quá khó hiểu, nếu bạn vận dụng đúng các hàm sin và cos trong những góc khác nhau, giá trị của sin hay cos thuộc [-1;1]. Vòng tròn lượng giác có bán kính là 1, tại (0;1), chúng ta có sin = 0 và cos = 1, mô tả điểm nằm ngoài cùng bên phải, tương tự với các điểm khác nhau. Câu lệnh sau chính là trái tim của chương trình: satellite.x = centerx + radius * Math.cos(radian); satellite.y = centery + radius * Math.sin(radian); các kiến thức lượng giác cho chúng ta thấy rằng, bán kính đường tròn chuyển động*cos(góc của vật đó) chiếu lên trục cos trong đường tròn lượng giác chính là tọa độ x (mình đã nói truc Ox còn gọi là trục cos đúng không nào?) + tọa độ của trung tâm là một hằng số, sở dĩ cần cộng thêm vì nếu không cộng, vật chỉ chuyển động xung quanh đường tròn lượng giác cơ bản có tâm là gốc tọa độ (0;0) mà thôi, chính xác hơn thì đây là phép tịnh tiến gốc tọa độ theo vectơ (centerx;centery), các bạn thông cảm, cứ hiểu vậy thôi, nếu bây giờ mình trình bày thêm về phép tính tiến vectơ thì vừa mất thời gian mà không đúng trọng tâm bài học. Giải thích tương tự cho dòng lệnh thứ 2. Mã lệnh để một vật chuyển động là đây, các bạn tham khảo file mẫu để biết dự án được xây dựng như thế nào var angle:number = 0; //góc ban đầu của vật var radius:number = 150; //bán kính của chuyển động tròn. var anglechange:number = 10; //góc thay đổi giúp vật thay đổi góc quay và nó có thể quay tròn var centerx:number = stage.stagewidth/2; var centery:number = stage.stageheight/2; //tọa độ trung tâm mà vật sẽ bay xung quanh var satellite:movieclip = new Asteroid(); satellite.x = satellite.y = -200; //tọa độ của vật khi bắt đầu đưa vào flash addchild(satellite); addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void{ var radian:number = deg2rad(angle); //chuyển giá trị của góc độ sang radian satellite.x = centerx + radius * Math.cos(radian); satellite.y = centery + radius * Math.sin(radian); //tọa độ mới của vật angle += anglechange;

99 //tăng góc angle %= 360; //khi angle tăng lên đến 360 nó sẽ chuyển về 0 (đảm bảo góc quay sẽ không function deg2rad(deg:number):number { return deg * (Math.PI/180) + ) Rotation Toward an Object (làm quay về một phía nhất định của đối tượng) Chúng ta sử dụng tọa độ của một vật để định hướng góc và độ lớn. Dự án của chúng ta sẽ trông như sau: Một bàn tay quay theo con chuột và luôn xoay về phía con chuột. Chúng ta sử dụng hàm atan2(), chúng ta sẽ có nó vì nó là một phương pháp sẵn có của lớp Math. Dựa vào một chức năng cho lớp Math của Flash. Chúng ta xác định góc giữa 2 điểm, 2 điểm trong 1 mặt phẳng tạo cho chúng ta 1 đoạn thẳng mà góc chúng ta vừa nói ở trên tức là góc hợp bởi đoạn thẳng và trục Ox, vì sao là trục Ox? Đơn giản vì nếu đoạn thẳng với trục Ox thì góc hợp bởi chúng là 0 độ, điều này phù hợp với hệ góc của flash.(xem lại hình 7-4). Bạn cần chắc chắn rằng cánh tay đang chỉ sang bên trái, trục Ox để nó chỉ đúng 0 độ trong flash, cánh tay chưa hoạt động và dĩ nhiên thuộc tính rotation của nó cần là 0. Câu lệnh trong chương trình này mà chúng ta cần chú ý là: var radians:number = Math.atan2(y1-y2, x1-x2); bởi lẽ Math.atan2() cho chúng ta 1 hàm tan ngược, đơn giản là tan 45 0 = 1 ==> tan -1 (gọi là tan ngược) 1 = 45 0.

100 Tan một góc là tỉ số của cạnh đối của góc đó trên cạnh kề của góc đó trong 1 tam giác vuông (góc ở đây không phải là góc vuông của tam giác) Trục Oy hướng xuống và trục Ox hướng ngang sang phảỉ, mà góc nằm ở tâm của gốc tọa độ (ở trường hợp này góc ở tâm tọa độ được hiểu là tâm của cánh tay), y1-y2 chiếu lên trục Oy là cạnh đối còn x1-x2 chiếu lên trục Ox là cạnh kề. Y1 Y2 X2 X1 var hand:movieclip = new Hand(); hand.x = stage.stagewidth/2; hand.y = stage.stageheight/2; //đặt bàn tay ở trung tâm màn hình addchild(hand); addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { hand.rotation = getangle(hand.x, hand.y, mousex, mousey); //góc của bàn tay được quy định bởi hàm getangle() function getangle(x1:number, y1:number, x2:number, y2:number):number { var radians:number = Math.atan2(y1-y2, x1-x2); //tính tan ngược dựa trên tọa độ 2 điểm. đơn vị radian return rad2deg(radians); //đổi đơn vị sang độ để thuộc tính rotation có thể sử dụng function rad2deg(rad:number):number { //chuyển từ đơn vị radian sang độ return rad * (180/Math.PI); Chúng ta sử dụng VD này cho một MovieClip đơn giản, nhưng ứng dụng của nó rất lớn, bạn có thể làm cho mọi thứ xoay quanh một đối tượng, tạo ra tính trực quan và tương tác rất có hiệu quả trong chương trình.

101 3. Physics (Vật lý) Yếu tố vật lý xuất hiện trong game, hoạt hình, hoặc trong những thí nghiệm đơn giản, tuy nhiên vật lý có thể nâng những thứ kể trên lên một tầm cao mới, tạo ra một sự thích thú mạnh mẽ với người sử dụng. Thậm chí với những người giàu kinh nghiệm, những đoạn mã nhỏ đến đáng ngạc nhiên cũng có thể tạo ra một hiệu ứng vật lý đáng kể. Chúng ta thảo luận về vật lý không có nghĩa là chúng ta đang học môn vật lý, chính xác thì chúng ta chỉ sử dụng những KQ vật lý đã biết để áp dụng vào chương trình của chúng ta. Các nhà khoa học phát hiện ra các hiện tượng và quy về các công thức, chúng ta chỉ sử dụng công thức đó một cách đơn giản nhất. Cái gì cũng liên quan đến thực tế, chúng ta nên nhìn nhận vấn đề này một cách tích cực, nếu chúng ta lập trình mà xa rời thực tế thì cũng chẳng để làm gì. Ngắn gọn nhưng thật có ích. Trước hết hãy đóng vai quỹ đạo đơn giản của một hành tinh trước khi xem xét trạng thái quay vòng của một hành tinh trên quỹ đạo, sự hấp dẫn của lực hấp dẫn từ những thiên thể khác, vân vân. Gravity (trọng lực) Chuyển động của một vật chịu tác dụng của trọng lực Chúng ta bắt đầu với hiện tượng vật lý quen thuộc, đó là trọng lực. Trọng lực thì hướng xuống, điều này ai cũng biết, Flash cho phép chúng ta giả hiệu ứng của trọng lực một cách tuyệt vời, bằng cách thêm một lực kéo nhỏ ở trục Oy (thêm tức là cộng thêm vào trục Oy một vectơ gia tốc trọng trường mới của trọng lực), trục Ox giữ nguyên đơn giản vì trọng lực không tác dụng theo phương ngang :D. var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var xvel:number = 4; var yvel:number = -10; var yacc:number = 1; addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { ball.x += xvel;

102 ball.y += yvel; yvel += yacc; Chúng ta đã nói đến gia tốc ở phần trước, mỗi hành tinh đều có một gia tốc trọng trường nhất định và nó là một hằng số. VD ở trái đất là 9,8 m/s 2.Chúng ta tạo ra sự khác biệt giữa các hành tinh với nhau thông qua trọng lực Mã này có hiệu quả cho việc tung lên một quả bóng vào trong không khí. Ban đầu quả bóng di chuyển chậm dần đều vì chịu gia tốc ngược, đang hướng lên khi gia tốc trọng trường hướng xuống. Sau khi đạt vị trí cao nhất nó di chuyển nhanh dần đều vì cùng hướng với chiều của gia tốc. Điều này phù hợp với các quy luật của vật lý. Hãy tham gia trên website của quyển sách này để thấy dự án wall_bounce.fla, chúng ta sẽ thay đổi nhiều điều như ranh giới, giai đoạn, kết cấu, thời gian nảy v.v... được bổ sung vào chương trình. Friction (ma sát) Khi bạn đi trên đường, trượt trên sân băng... tất cả những hoạt động đó đều tạo ra ma sát.người ta có thể làm cho Ma sát đường tăng cường ở trên đường nhằm mục đích làm cho các xe tham gia giao thông có thể dừng lại một cách dễ dàng, ma sát được giảm đi trên các máy móc, thiết bị để bảo đảm tuổi thọ cho chúng. Một đơn giản cách để thêm ma sát vào một hoạt cảnh là tạo ra một hệ số ma sát mà dần dần giảm bớt vận tốc trong cả thời gian mà vật chịu ma sát đang chuyển động. Chúng ta sẽ bắt đầu từ ví dụ của phần: Movement Along an Angle. Để thêm ma sát bạn chỉ cần làm 2 việc. Đầu tiên tạo ra một hệ số ma sát (lớn hơn 0, bé hơn 1), sau đó nhân hệ số này với giá trị của vận tốc ==> giá trị của vận tốc sẽ giảm dần theo thời gian, đó là điều chúng ta chờ đợi. var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var speed:number = 12; var angle:number = 45; var radians:number = deg2rad(angle); var xvel:number = Math.cos(radians) * speed; var yvel:number = Math.sin(radians) * speed; var frcooef:number =.95; //thêm hệ số ma sát addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { xvel *= frcooef; yvel *= frcooef; //vận tốc giảm do bị ma sát ball.x += xvel; ball.y += yvel; function deg2rad(deg:number):number { return deg * (Math.PI/180); //chuyển đơn vị từ độ sang radian

103 Zeno s Paradox (nghịch lý của zeno) Cách khác để thêm ma sát vào sự chuyển động đối tượng sẽ sử dụng nghịch lý Zeno, mà nói điều này, khi di chuyển từ điểm này sang điểm khác, bạn không bao giờ thật sự đạt đến nơi đến tận cùng điểm sẽ đến của bạn bởi vì bạn sẽ chia cắt đường đi còn lại (khoảng cách) với mỗi sự chuyển động có ma sát. Sách nó viết vậy thoai, có nghĩa là bước đầu tiên để đi từ a => b cần 100 cm chúng ta bớt lại còn 50cm, tiếp theo muốn đi đến b cần 50 cm nữa, chúng ta bớt lại để nó chỉ đi được 25 cm và cứ thế, nó có thể sẽ không đến đươc nơi cần đến, dưới khái niệm của toán học thì giới hạn của việc giảm bớt này cuối cùng vẫn là đến đích thành công, tuy nhiên điều này xảy ra khi số bước di chuyển là, tức là số bước di chuyển rất nhiều, tuy nhiên đó là toán học còn thực tế trong flash thì nó lại khác, vì số lần lặp lại trong EventListener của ENTER_FRAME là rất lớn nên bước di chuyển của quả bóng là rất lớn, mặt khác do kick thước quả bóng to và khoảng cách di chuyển hẹp nên ta không thấy rõ điều này. Nếu bạn chia khoảng cách từ điểm a đến điểm b bằng một nửa bước bạn sẽ không bao giờ đến được điểm b. Ý tưởng này có thể sử dụng để làm chậm một đối tượng trong khi nó tiếp cận nơi đến đích của nó, như được minh họa trong Hình 7 9 Mã lệnh của chương trình như sau: var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { ball.x += velfriction(ball.x, mousex, 8); ball.y += velfriction(ball.y, mousey, 8); function velfriction(orig:number, dest:number, coeff:number):number { //nguyên lý mình đã trình bày, cái khác là chương trình này nó chia cho 8 chứ không phải 2 return (dest-orig)/coeff; VD: khoảng cách giữa ball và MOUSE là > tọa độ sau bước đầu tiên của bóng là x + 64, => khoảng cách còn lại gữa MOUSE và bóng là , bước tiếp theo ball di chuyển một bước là (512-64)/8 khoảng cách lại gần lại và cứ thế... Có thể xem coeff như là một dạng hệ số ma sát, khi coeff càng cao thì chuyển động càng chậm, mất nhiều thời gian hơn và ngược lại. Elasticity (sự đàn hồi) Một đặc tính khác của vật lý có thể ứng dụng vào hoạt cảnh là sự đàn hồi, thuộc tính này có thể áp dụng cho các mô hình chuyển động khác nhau và có thể có nhiều cách khác nhau để biểu diễn nó. Lực đàn hồi xuất hiện khi có một vật chịu tác dụng từ 1 lực nào đó bị biến dạng và lực đàn hồi xuất hiện để kéo vật trở lại vị trí, trạng thái ban đầu chống lại nguyên nhân biến dạng đó

104 Dưới góc độ của các công thức vật lý thì lực đàn hồi tính bằng F = -kx F: độ lớn của lực k = độ biến dạng của vật Lực ngược chiều với độ biên dạng cuả vật nên có dấu -. VD trên nhằm sử dụng lực đàn hồi để giải quyết một MovieClip trong những vị trí ở những khu vực khác nhau. Hình vẽ miêu tả 1 quả bóng, chuyển động về phía con chuột (có dấu +), ban đầu nó chuyển động quanh chuột, sau đó nó cân bằng tại vị trí con chuột. var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var xvel:number = 0; var yvel:number = 0; addeventlistener(event.enter_frame, onloop, false, 0, true); function onloop(evt:event):void { xvel = velelastic(ball.x, mousex,.14,.85, xvel); yvel = velelastic(ball.y, mousey,.14,.85, yvel); ball.x += xvel; ball.y += yvel; //Chúng ta xem xét tiếp hàm velelastic() Function velelastic(orig:number, dest:number, springconst:number,damp:number, elas:number):number { elas += -springconst * (orig - dest); return elas *= damp; Thứ còn lại chính là việc đi tính lực đàn hồi, biến springconst được xem như hệ số k (càng cao thì lực đàn hồi càng mạnh) còn (orig - dest) được xem như khoảng cách của vật trước và sau khi di chuyển, dấu trừ để tốc độ chuyển động có thể đảo ngược khi vật chuyển động quá giới hạn đàn hồi, cụ thể ban đầu orig < dest (tọa độ vật bé hơn tọa độ mà nó sẽ chuyển tới) => orig dest <0 => -springconst * (orig - dest) > 0 => vật tiến lên trước, sau đó vật vượt qua vị trí tới tức là orig > dest => -springconst * (orig - dest) < 0 vật chuyển động lui. elas += -springconst * (orig - dest); câu lệnh này tạo cho vật chuyển động với một gia tốc elas += -springconst * (orig - dest) biến thiên (biến thiên như thế nào thì mình nói rồi đó) Nếu chỉ dừng mã lệnh ở đây thì vật sẽ chuyển động qua lại quanh con chuột chứ không lại gần và đứng yên tại con chuột đâu, chúng ta nhân với một hằng số 0 < damp < 1, vật sẽ từ từ tiến lại gần và đứng yên tại con chuột.

105 4. Programmatic Tweening (Lập trình cho Tween) Khi bạn cần một hoạt hình đơn giản và không muốn mất nhiều công sức viết mã lệnh, bạn có thể sử dụng chức năng tween sẵn có của flash, tạo nó trên timeline. Một VD là file as_tween.fla kèm theo. Lớp tween sẵn có trong AS3 cho phép bạn chỉ rõ xem đâu là đối tượng cần tween (cho chuyển động) và tween như thế nào, sử dụng mã lệnh để tạo tween cho phép thay đổi thuộc tính, giá trị bắt đầu và hoàn thành của thuộc tính, khoảng thời gian của tween, và cuối cùng, nên chăng sử dụng thời gian hoặc những khung (frame) khi việc ước lượng tween có trong 1 khoảng thời gian nhất định. Đây là cấu trúc của hàm Tween: Tween(obj:Object, prop:string, func:function, begin:number, finish: Number, duration:number, useseconds:boolean) Chúng ta có thể tạo nhiều hàm cho 1 đối tượng, hay sử dụng một hàm cho nhiều đối tượng để đạt được hiệu quả mong muốn Obj:tên đối tượng Prop: thuộc tính tham gia tween (x, y) Func: hàm thêm vào (VD Elastic.easeOut chuyển động chậm dần trong một hiệu ứng đàn hồi...) Begin: giá trị ban đầu trước khi tween. Finish:giá trị sau khi tween. Duration: thời gian thực hiện (chưa có đơn vị) useseconds: thiết lập true để hàm sử dụng đơn vị giây để tính thời gian Duration. VD sau cho chúng ta tạo 1 tween cho một đối tượng được tạo trên màn hình có chuyển động chậm dần, do đó ta sử dụng hàm Elastic.easeOut: import fl.transitions.tween; import fl.transitions.easing.*; var ball:movieclip = new Ball(); ball.x = ball.y = 100; addchild(ball); var ballxtween:tween = new Tween(ball, "x", Elastic.easeOut, 100, 400, 3, true); //cho thuộc tính x Chúng ta viết thêm hàm cho thuộc tính y và alpha: var ballxtween:tween = new Tween(ball, "y", Elastic.easeOut, 100, 400, 3, true); var ballalphatween:tween = new Tween(ball, "alpha", None.easeOut,.3, 1, 3, true); // None.easeOut có nghĩa là không sử dụng chức năng easeout chậm dần trong tween của //alpha. Lớp Tween có vài thuộc tính bổ sung, những phương pháp, và những sự kiện cho sử dụng bởi sự thể hiện của mỗi lớp. Đáng chú ý là các thuộc tính boolean cho việc chạy (playing) và lặp lại của tween (looping) (chỉ sử dụng cho hoạt cảnh khi đang chạy và lặp) và số vị trí Number position, thuộc tính vị trí chỉ báo giá trị hiện thời của thuộc tính tweening, như vậy nó tham chiếu tới vị trí hiện thời của tween, không phải là vị trí X /Y trên màn hình chứa đối tượng trên. Cái đó thể hiện ballalphatween xem trước đó vẫn còn báo lại biến vị trí, mặc dù mà giá trị alpha của MovieClip lại đang được tween Với gói fl.transitions.easing khi import vào flash, chúng ta có các phương pháp sau để thực hiện:

106 Back: Việc làm mềm chuyển động bắt đầu bởi lưu lại và sau đó chuyển động về phía đích. Việc giảm nhẹ ở ngoài, khi vật chuyển động quá đích và nó rút ngược trở lại để tiếp cận đích Bounce: Những sự nảy hoặc là giật bên trong với tốc độ ngày càng tăng, hoặc ở ngoài với việc giảm bớt tốc độ. Elastic: Đàn hồi gợn sóng, xây dựng chuyển động theo dao động hình sin, tăng tốc bên trong và giảm tốc ở ngoài. Vẫn chỉ hướng chuyển động chứ không có hiệu ứng giảm nhẹ None: Chuyển động thẳng không có giảm nhẹ Regular: Làm mềm một cách bình thường, giống như cách làm mềm chuyển động trên timeline, tăng tốc bên trong và giảm tốc ở ngoài. Strong: Nhấn mạnh để làm mềm, chuyển động mạnh mẽ hơn so cách làm trên timeline làm mềm đặc tính, nhưng không có bổ sung những hiệu ứng khác (giảm nhẹ - làm mềm). Tăng tốc bên trong và giảm tốc ở ngoài Mỗi lớp cho phép ít nhất ba phương pháp để bao trùm làm mềm bên trong, làm mềm ở ngoài, và làm mềm cả hai trong khi kết thúc tween Tất cả các phương pháp cho mỗi lớp hỗ trợ bởi những giá trị chung cuộc và ban đầu của thuộc tính khi bắt đầu hoạt hình, khoảng thời gian làm mềm, và thời gian hiện tại trong hoạt cảnh khi đang chạy. Sau cũng hỗ trợ một giá trị cho chuyển động quá mức vượt ra bên ngoài đích từ nơi bắt đầu và đến nơi kết thúc của hoạt cảnh, bổ sung lực đàn hồi hỗ trợ cho biên độ và chuyển động sóng đồ thị hình sin, phương pháp đã tính toán sự đàn hồi. 5. Timeline Animation Recreations (Tạo hoạt hình từ timeline bằng mã lệnh tự động) Trong khi đây không thực sự trọn vẹn là một giải pháp dùng ActionScript, chúng ta thích dùng flash để thực hiện hoạt hình CS3 có những lớp chuyển động và công cụ hoạt hình (Animator) mới. Những lớp này, và những hỗ trợ người dùng mới của CS3 làm cho nó có thể chạy lại những hoạt hình mà đã được tạo ra trước đó trong timeline. Những người theo chủ nghĩa ưu tiên sử dụng Scripting có thể quan tâm hơn đến việc làm nâng cao kỹ năng ActionScript của họ hơn là sử dụng timeline để bắt nguồn những hoạt cảnh.

107 Tuy nhiên khả năng sử dụng mã lệnh của flash hấp dẫn nhiều người đến với flash CS3 hơn, thậm chí dùng code curmudgeons. Có 2 lý do: Trước hết, nó không sử dụng timeline nhưng vẫn còn làm có thể tái tạo lại hoạt hình, ở đó bao gồm những hoạt cảnh mà cái đó có thể là không dễ để đạt được chính xác như với việc sử dụng ActionScript. Thứ 2 nó là một cách mới để liên kết hợp tác giữa lập trình viên và designer, những người thiết kế có thể tạo ra những hoạt cảnh timeline, và những người lập trình có thể độc lập làm việc vào trong nhiều dự án khác nhau mà không phụ thuộc cấu trúc bản chính timeline. Nền tảng của quá trình này tồn tại trong một đặc tính gọi là Copy Motion as ActionScript 3.0 sau việc tạo ra một timeline tween, bạn có thể lựa chọn toàn bộ tween và sau đó chọn Copy Motion as ActionScript 3.0 từ thực đơn Edit =>Timeline. Những sự sao chép này tới clipboard, nó có tất cả thông tin cần thiết để tạo lại tween với mã lệnh. Trong thời gian quá trình sao chép, đặc tính nhắc bạn đặt tên thể hiện (instance name) ký hiệu tweened với một hội thoại tiện lợi sẽ báo lỗi nếu tên thể hiện đã tồn tại. Khi quá trình copy đã hoàn thành, bạn có thể dán kết quả vào Actions panel (nếu bạn làm theo các bước mình hướng dẫn, để dán bạn chỉ cần Ctrl + V, thế là xong, nó sẽ hiện ra mã XML Tất cả ActionScript cần bao gồm sự chuyển động được đại diện bởi thông tin từ XML trong định dạng (format) yêu cầu bởi lớp chuyển động (motion class). Một ví dụ đơn giản, (mà) tweening (mà) một movieclip chạy đến 1 quãng đường là 20 frame, như đoạn mã sau: import fl.motion.animator; var ball_xml:xml = <Motion duration="20" xmlns="fl.motion.*" xmlns: geom="flash.geom.*" xmlns:filters="flash.filters.*"> <source> <Source framerate="12" x="50" y="50" scalex="1" scaley="1" rotation="0" elementtype="movie clip" instancename="ball" symbolname="ball"> <dimensions> <geom:rectangle left="-10" top="-10" width="20" height="20"/> </dimensions> <transformationpoint> <geom:point x="0.5" y="0.5"/> </transformationpoint> </Source> </source> <Keyframe index="0"> <tweens> <SimpleEase ease="0"/> </tweens> </Keyframe> <Keyframe index="19" x="450"/> </Motion>; //thế là xong phần XML, chúng ta không thảo luận về XML ở đây var ball_animator:animator = new Animator(ball_xml, ball); //tạo một tween bằng mã lệnh dựng sẵn của AS3 ball_animator.play();

108 //chạy nào :D Bạn có thể viết riêng một file *.xml bằng cách sử dụng đoan code bắt đầu từ thẻ <Motion> và kết thúc bằng thẻ </Motion>: Dự án chúng ta sắp nghiên cứu sau đây là một ứng dụng từ mã lệnh làm tween tự động của AS: Chúng ta tìm hiểu một tý về hàm flash.geon Gói flash.geom chứa đựng những lớp hình học, là những điểm, những ma trận hình chữ nhật và biến đổi, để hỗ trợ lớp BitmapData và đặc tính bitmap caching. Hoạt hình sẽ được thể hiện bằng việc có 1 quả bóng di chuyển dọc theo hình vẽ (đường màu đen, và màu xanh), tham khảo file mẫu để xem hết hiệu ứng và các tài nguyên sẵn có trong đó. Ví dụ này tạo ra một player có thể phát lại, có những điều khiển của hoạt cảnh ban đầu trong một file mới. Nó không yêu cầu cái gì hơn một movie clip để làm hoạt hình, và tạo những nút bấm thành phần. Chúng ta sẽ có tạo ra những nút có chức năng điều khiển hoạt hình. 8 hàng đầu tiên của mã lệnh là nhập những gói cần thiết, khai báo những biến cần, tạo ra và định vị một quả bóng movieclip từ thư viện, thêm nó vào danh sách màn hình. import fl.motion.*; import flash.geom.*; import fl.controls.button; //gói tạo nút bấm var anim:animator; //biến hoạt hình sử dụng AS3 var ispaused:boolean; //có nhấn nút paused hay không khi đang chạy chương trình var isscaled:boolean; //Có sử dụng chuyển động mới (đường đi nhỏ hơn) hay không var ball:sprite = new Ball(); ball.x = ball.y = 80; var xml_url:urlrequest = new URLRequest("handwriting.xml"); //Chúng ta liên kết đến file XML, cách tạo XML trong flash và tạo một file XML riêng mình //đã trình bày, chúng ta đi sâu với XML trong Chapter 13

109 var xml_loader:urlloader = new URLLoader(xml_url); //Hàm xmlloaded() chuyển đổi văn bản đã nạp tới XML và Animator class, qua XML lẫn //thể hiện movieclip quả bóng cho lớp. Từ lớp này, đối tượng chuyển động có thể cung cấp //thông tin qua dữ liệu XML mà đã được tải. xml_loader.addeventlistener("complete", xmlloaded, false, 0, true); function xmlloaded(evt:event):void { var anim_xml:xml = XML(xml_loader.data); anim = new Animator(anim_xml, ball); //Sử dụng XML sẵn có, chúng ta đã tạo ball.transform.colortransform = anim.motion.keyframes[0].color; //đặt màu chuyển cho ball từ keyframe đầu tiên (từ đỏ =>xanh, vì sao thì chịu) addchild(ball); anim.addeventlistener(motionevent.motion_end, onmotionend, false, 0, true); //MotionEvent.MOTION_END là sự kiện listener kéo dài đến khi MOTION kết thúc function onmotionend(evt:motionevent):void { Button(getChildByName("Play")).label = "Play"; //Đổi tên nút bấm thành play khi kết thúc MOTION //chúng ta tìm hiểu về nút bấm ở phần sau, còn vi sao kết thúc motion mà phải chuyển tên //chúng ta cũng sẽ thảo luận sau //Sau đây là mã lệnh tạo những nút bấm sẵn có của flash thông qua button component createcontroller(["play","pause","stop","next Frame","Toggle Scale"]); //tạo 5 nút và đặt tên của các nút đó theo một mảng bình thường function createcontroller(btns:array):void { for (var i:number = 0; i<btns.length; i++) { //vòng lặp for để tạo vị trí, tên, nhãn (label) cho từng nút //tên là tên của nút chúng ta tương tác khi dùng mã lệnh //label là cái mà người sử dụng nhìn thấy, chả liên quan đến việc điều khiển mã lệnh var btn:button = new Button(); btn.x = 35 + i*100; btn.y = 350; btn.width = 80; btn.label = btns[i]; btn.name = btns[i]; btn.addeventlistener(mouseevent.click, onnav, false, 0, true); //gọi hàm thực hiên onnav() trong mỗi EventListener thích hợp cho mỗi nút bấm khác nhau addchild(btn); Dưới đây là mã lệnh cho từng nút lệnh khác nhau vừa tạo, mình trình bày giải thích khá chi tiết trong mã lệnh, mong các bạn chú ý. function onnav(evt:mouseevent):void { switch (evt.target.name) { case "Play" : //mã lệnh cho nút play

110 if (!anim.isplaying) { //nếu hoạt hình đang không chạy, nhấn nút play kết hợp thêm với điều kiện dưới đây if (ispaused) { //ispaused mặc định khi khai báo là false, các câu lệnh dưới đây không xảy ra //Nếu nút Paused đã nhấn, ispaused mang giá trị true (hoạt hình đã đứng yên trước khi nhấn //nút play) nút play cho phép hoạt hình chạy lại anim.resume(); //chuyển hoạt hình chạy tiếp ispaused = false; //chuyển giá trị sang chưa nhấn //nếu nút paused chưa nhấn hoạt hình vẫn tiếp tục chạy như bình thường //câu lệnh if cho trường hợp ispaused là true này kết thúc tại đây else { //nếu ispaused chưa nhấn anim.play(); //hoạt hình vẫn chạy như bình thường //sau khi nhấn paused, hoạt hình dừng lại và chỉ chạy lại khi nút resume được nhấn, nút //resume chỉ là tên khác của nút play //câu lệnh if cho trường hợp ispaused là false này kết thúc tại đây //sau khi nhấn nút play, chuyển động sẽ bắt đầu và... break; case "Pause" : //mã lệnh cho nút paused anim.pause(); //dừng hoạt hình ispaused = true; //giá trị ispaused chuyển sang true Button(getChildByName("Play")).label = "Resume"; //đổi tên play thanh resume, mãi như thế đến cuối motion mới đổi lại thành play, bây giờ thì //bạn hiểu câu lệnh đổi tên nút ở mục trước rồi chứ break; //Nút paused khi được nhấn làm hoạt hình dừng lại và đổi tên nút play case "Stop" : //mã lệnh cho nút stop anim.stop(); //dừng hoạt hình anim.rewind(); //hoạt hình trở lại điểm ban đầu ispaused = false; //nút paused xem như chưa nhấn, như cũ Button(getChildByName("Play")).label = "Play"; //đổi tên nút có tên Play sang label mới của nó có tên Play

111 break; //Nút Stop khi được nhấn sẽ đưa mọi thứ trở về vị trí ban đầu. case "Next Frame" : anim.nextframe(); //tới frame tiếp theo của hoạt hình break; case "Toggle Scale" : //nếu nút Toggle Scale đã nhấn, các câu lệnh dưới đây xảy ra. var m:matrix = anim.positionmatrix = new Matrix(); //tạo ma trận m theo hoạt hình anim (tức là tạo một hoạt hình mới giống anim) var s:number; if (isscaled) { //giá trị isscaled mặc định khi khai báo là true, các câu lệnh dưới đây sẽ chạy s = 1; //s là tỉ số thu gọn, s = 1 nghĩa là sẽ không có thu gọn về đường dẫn isscaled = false; //giá trị đổi thành false để câu lệnh dưới đây xảy ra, else { s =.5; //tỉ số thu gọn sẽ được thu gọn lại - giảm đi một nửa isscaled = true; ; MatrixTransformer.setScaleX(m, s); //Chuyển động theo chiều X giảm đi một nửa (s = 0.5) hoặc không giảm (s = 1) MatrixTransformer.setScaleY(m, s); //Chuyển động theo chiều Y giảm đi một nửa (s = 0.5) hoặc không giảm (s = 1) break; Qua các câu lệnh, khi nhấn nút Toggle Scale chúng ta sẽ có một quỹ đạo bằng một nửa quỹ đạo ban đầu Bạn sử dụng Matrix sẽ giúp tạo mã lệnh chuyển động một cách đơn giản, chúng ta chỉnh sửa được một số thuộc tính của Matrix thông qua hàm MatrixTransformer.setScaleY(m, s);và MatrixTransformer.setScaleX(m, s); Khi đó, m là một chuyển động mới được tạo ra từ mã lệnh và nó điều khiển cho MovieClip Ball chuyển động. VD này khó hiểu, mình đã mất nhiều thời gian để nghiên cứu về nó, các bạn không hiểu có thể lên forum hoặc mail qua thanh_vinh648@yahoo.com

112 6. Particle Systems (Phân vùng hệ thống) Chúng ta sẽ tạo ra 1 hệ thống khá đẹp mắt: Phân vùng hệ thống là một cách đóng vai những đối tượng phức tạp hoặc tài nguyên mà được bao gồm nhiều phần nhỏ, như những chất lỏng, pháo hoa, nổ tung, khai hỏa, khói, nước, tuyết, vân vân. Những hệ thống phức tạp thì tính khả thi thực hiện từng phần riêng lẻ được phát sinh, được cho là những đặc trưng của bản thân đối tượng, và chúng sẽ tự chạy một cách tự động. Hơn nữa, những phần nhỏ thì dễ biến đổi, sửa đổi để điều chỉnh, hoặc đang thậm chí thay thế, làm cho nó là có thể để thay đổi sự xuất hiện hoặc tính hoạt động của hệ thống lớn một cách tương đối dễ dàng Những điều đó cũng là những đặc trưng của lập trình hướng đối tượng, vì vậy kỹ thuật này không có gì đáng ngạc nhiên vì rằng sử dụng cách tiếp cận này sẽ dùng để viết phân vùng hệ thống Tới kết thúc chương này, chúng ta tạo ra một hệ thống từng phần rất đơn giản - sử dụng chỉ hai lớp - mà nhìn một số movieclip nhỏ bé đơn giản tạo thành một ảo giác giống hiệu ứng nước suối (mình thấy nó giống vòi phun nước hơn). Màu của những vòng tròn lớn ở ngoài của suối và sau đó rơi xuống dưới hiệu ứng của sức nặng bao gồm trọng lực. Hình 7-12 cho chúng ta thấy hệ thống trông như cái gì. Sau việc khai báo những biến để xác định những điểm mà phần sẽ xuất hiện, tất cả lớp cần thiết để xây dựng chương trình là tạo thêm sự kiện listener khi đi qua mỗi khung hình cho tới Stage. Ở trên mỗi khung hình của sự kiện ENTER_FRAME, hàm listener tạo ra một phiên bản mới của lớp Particle (một MC ball mới), tức tạo ra một phần của nó và thêm nó vào danh sách màn hình. package { import flash.display.sprite; import flash.events.event

113 public class ParticleDemo extends Sprite { private var emitterx:number = stage.stagewidth/2; private var emittery:number = stage.stageheight/2; public function ParticleDemo() { stage.addeventlistener(event.enter_frame, onloop, false, 0, true); private function onloop(evt:event):void { var p:particle = new Particle(emitterX, emittery, Math.random()*11-6, Math.random()*-20, 1, Math.random()*0xFFFFFF); addchild(p); File nguồn của chúng ta là ParticleDemo.as Mã lệnh trên không có gì xa lạ với chúng ta, đó là định nghĩa một lớp trong một gói. Chúng ta có lớp ParticleDemo.as có nhiệm vụ tạo các MovieClip có tên là p vào màn hình, việc tạo này là liên tục bởi lẽ nó đặt trong Event.ENTER_FRAME. p có những đặc tính đã khai báo trước khi sử dụng hàm Particle, chúng ta khai báo những đặc tính của p thông qua câu lệnh var. Chúng ta sử dụng các phân hệ thống thành những phần nhỏ (mỗi phần là một MovieClip Ball tự được tạo ra, tự hoạt động và tự mất đi một cách tự động, chương trình lớn không cần phải xử lí gì mà toàn bộ do hàm Particle quản lý. Những quả bóng sử dụng hàm Particle và hàm này có những thuộc tính hay phương pháp gì thì chúng ta hãy xem tiếp ND của hàm này: package { import flash.display.*; import flash.geom.* import flash.events.event; public class Particle extends Sprite { //các giá trị của từng phần nhỏ trong hệ thống chính là Particle private var _xpos:number; private var _ypos:number; //tọa độ x và y private var _xvel:number; private var _yvel:number; //tốc độ của x và y private var _grav:number; //trọng lực public function Particle(xp:Number, yp:number, xvel:number, yvel:number, grav:number, col:uint) { //hàm nhập dữ liệu từ lớp DemoParticle truyền qua, bao gồm các thuộc tính của Particle _xpos = xp; _ypos = yp; _xvel = xvel _yvel = yvel _grav = grav; var ball:sprite = new Ball();

114 addchild(ball); x = _xpos; y = _ypos; //định vị trí, bất kỳ, bất kỳ như thế nào thì xem độ rộng các hàm Math.random của lớp DemoParticle alpha =.8; //giảm độ mờ đục scalex = scaley = Math.random() * ; //Kick thước ngẫu nhiên var colorinfo:colortransform = ball.transform.colortransform; //khai báo biến màu colorinfo.color = uint(col); //Giá trị màu của ball là biến col mang giá trị ngẫu nhiên, xem lại lớp DemoParticle sẽ thấy ball.transform.colortransform = colorinfo; //màu trái banh quy định từ biến colorinfo có màu ngẫu nhiên lấy từ biến colorinfo.color addeventlistener(event.enter_frame, onrun, false, 0, true); private function onrun(evt:event):void { _yvel += _grav; //trọng lực hướng xuống _xpos += _xvel; _ypos += _yvel; x = _xpos; y = _ypos; //Quả bóng di chuyển if (xpos < 0 ypos < 0 _xpos > stage.stagewidth ypos > stage.stageheight) { //Nếu quả bóng ra khỏi màn hình hiển thị (có tọa độ vượt quá kích cỡ màn hình) thì : removeeventlistener(event.enter_frame, onrun); parent.removechild(this); //xóa bỏ hàm onrun và xóa luôn quả bóng đó ra khỏi danh sách màn hình. Chúng ta thấy được rằng: Việc chia hệ thống thành các phần nhỏ giúp chương trình trở lên đơn giản và linh hoạt đến không ngờ, thông qua một lớp, chúng ta truyền dữ liệu cho một lớp khác xử lý dữ liệu, đưa ra chương trình (thực ra không có mã lệnh ở chương trình chính) và chương trình xử lý theo mã lệnh đã ghi trong lớp xử lý dữ liệu. Việc chia nhỏ này giúp chúng ta dễ dàng chỉnh sửa và bổ sung mặt khác nó cũng là một đặc trưng của OOP thông qua việc sử dụng lớp. Thử thay đổi các thuộc tính alpha, scalex và scaley, chúng ta sẽ có những hiệu ứng khác nhau. Như một ví dụ, chúng ta có tạo ra những phiên bản khác của hệ thống này trên website của quyển sách mà bao gồm vài thuộc tính mới, bao gồm kiểu lọc và hỗn hợp được đặt ra thêm mà bạn sẽ học về chúng trong chương tiếp theo.

115 Chương 8: Vẽ với Vectơrs Chương này chúng ta sẽ bàn luận về các vấn đề sau: The Graphics class: Lớp đồ họa này, tình cờ mà flash sử dụng một hệ thống vẽ toán học API dựa trên vectơ. Bạn có thể điều khiển việc tạo đường viền, hay tô những vùng được vẽ bằng những hàng được nối từ những điểm mà chúng ta dựng sẵn bằng mã lệnh, tưởng tượng chúng ta sử dụng một cây bút vô hình để làm việc đó The Geometry package: Gói hình học.gói có ích này chứa đựng những lớp cho tạo ra những điểm và những hình chữ nhật, cũng như thay đổi những đối tượng và màu của nó, và việc tạo ra ma trận toán học cho đồng thời phức tạp thay đổi tới thuộc tính góc (rotation), biến đổi bề rộng hoặc về ngang (scale), Và chuyển đổi theo X và Y. 9-slice Scaling: Bỏ qua sự sử dụng của một hình chữ nhật có thể chỉ định bằng mã lệnh, Chúng ta sử dụng 9-slice Scaling để ngăn ngừa những cạnh và những góc của một sprite hoặc movie clip lại Từ sự thay đổi hình dạng (distorting) Khi thay đổi chiều rộng và chiều ngang (scale thay đổi tỉ lệ của đối tượng) Applied Examples: (áp dụng ví dụ): Kết hợp những gì bạn sẽ học trong chương này bạn sẽ có thể tạo ra một sự lựa chọn màu đơn giản Và một lớp cústom button cái đó có thể được sử dụng lại từ dự án này đến dự án khác. 1. The Graphics Class (Lớp đồ họa) Bạn có thể sử dụng lớp này để xác định các điểm, các kiểu tô màu, các kiểu đường vẽ, vẽ vòng tròn hay một hình dáng nào đó, tương tự như khi bạn sử dụng các công cụ vẽ của flash. Trước khi bắt đầu, chúng ta nên nghe một lời khuyên, đó là bạn đang thao tác với mã lệnh bằng cách viết AS, chúng ta tạo ra một hình dạng nhất định trên một không gian xác định (trong MovieClip hoặc trên stage...) Tuy nhiên vẽ trên stage (sách nó viết là timeline chính) là một điều không nên, chúng ta nên tạo ra 1 MovieClip (hoặc sprite) và vẽ cho MC đó, chúng ta có thể có nhiều tính linh hoạt và sức mạnh nữa khi nó đi đến trình bày những thao tác và những hiệu ứng của MovieClip Tất cả các phương pháp của lớp graphics này bạn buộc phải gọi đến nó trước khi sử dụng mã lệnh: var sp:sprite = new Sprite(); var g:graphics = sp.graphics; ở đây đối tượng g được hiểu là một đối tượng graphics của flash, bạn có thể thao tác mã lệnh với nó một cách độc lập. Đối tượng sp là một sprite, chúng ta tạo ra để sau này gắn đồ họa của g cho nó. Chúng ta sử dụng các phương pháp của lớp graphics bằng cách: g.<method>; Nếu không muốn thông qua đối tượng g bạn có thể tạo đồ họa cho sprite descriptivespritename (tên sprite được miêu tả) bằng cách thêm các câu lệnh sau: var descriptivespritename:sprite = new Sprite(); descriptivespritename.graphics.<method>; descriptivespritename.graphics.<method>; //lặp lại các câu lệnh gọi lớp graphics descriptivespritename.graphics.<method>; descriptivespritename.graphics.<method>;

116 Một cách ngắn gọn chúng ta dùng thêm lệnh with cho descriptivespritename var descriptivespritename:sprite() = new Sprite(); with (descriptivespritename.graphics) { <method>; <method>; //lặp lại các câu lệnh gọi lớp graphics <method>; <method>; <method> là các phương pháp của lớp, phương pháp gì thì chúng ta sẽ thảo luận ngay bây giờ: Drawing Lines (vẽ đường thẳng) Đây là thao tác cơ bản nhất, việc chúng ta cần làm là xác định 2 điểm đầu mút của một đoạn thẳng, sau đó nối 2 điểm đó lại bằng một đường thẳng với màu,độ rộng, kiểu nét nối, độ mờ đục (alpha)... là tùy chúng ta xử lý, mã lệnh: var sp:sprite = new Sprite(); addchild(sp); var g:graphics = sp.graphics; g.linestyle(2, 0x000000); chúng ta có câu lệnh thứ 4 là mới, nó cho chúng ta biết, độ rộng của đường vẽ là 2, màu vẽ tuân theo quy tắc của màu RGB, 0x có nghĩa là màu đen (cũng là mặc định nếu không được đề cập), tham số thứ 3 là độ mờ đục (100% là mặc định). Chúng ta có 3 cách để xóa đường vừa vẽ đó, hoặc sử dụng phương pháp clear hoặc cho độ rộng = 0 hoặc chỉnh màu vẽ trùng với màu nền nếu chỉ có nền trống ( ngoài nét vẽ, trên nền chưa có bất cứ đối tượng nào). Bây giờ tưởng tượng chúng ta có 1 cây viết vô hình, để vẽ một đường từ điểm có tọa độ (150, 100) đến điểm có tọa độ (400, 100), đầu tiên chúng ta chấm cây viết ở tọa độ (150, 100); g.moveto(150, 100); sau đó rê cây viết đến điểm cần đến: g.lineto(400, 100); thế là xong, nét vẽ có độ rộng là 2 và có màu đen. Thêm một vài VD: g.lineto(400, 120); g.lineto(150, 120); g.linestyle(4, 0xFF0000); g.moveto(150, 175); g.lineto(400, 175); dòng lệnh thứ 3 của mã lệnh thêm vào trên nhằm tăng độ rộng nét vẽ và màu nét vẽ, nó thiết lập các thuộc tính này thay cho dòng lệnh thứ 4 ở mã lệnh ban đầu. Chúng ta phân biệt 2 phương pháp sau: moveto: Đưa cây bút vông hình của chúng ta tới một điểm, điểm đó coi như là một dấu chấm rất nhỏ trên màn hình mà chúng ta không nhìn thấy, chỉ biết tọa độ của nó thoai. lineto: Vẽ đường thẳng đến điểm có tọa độ xác định (bằng tham số của lineto) từ một điểm mà chúng ta đã moveto đến trước đó. Sau khi lineto Tọa độ cây bút của chúng ta thay đổi không còn là tọa độ của phương pháp moveto mà là tọa độ mới trong phương pháp lineto.

117 Drawing Curves (vẽ đường cong) Trong trí tưởng tượng của bạn, vẽ không chỉ giới hạn là nằm ở đường thẳng mà còn hiểu thêm về cách vẽ một đường cong Một đường cong có dạng như sau: g.linestyle(2, 0x0000FF); g.moveto(150, 100); g.curveto(275, 0, 400, 100); g.moveto(0, 0); câu lệnh g.moveto(0, 0); chỉ là một biện pháp ngăn chặn những mã lệnh sau có thể làm thay đổi VD mà chúng ta đang xét bằng cách đưa tọa độ đang vẽ rời khỏi điểm mút đường cong và đưa nó về tọa độ (0;0), điều này xem ra thừa nhưng nó sẽ có tác dụng tốt trong nhiều trường hợp khác. Điểm đầu tiên chúng ta đang chấm là (150;100) (trên hình là điểm màu đỏ bên trái) Chúng ta vẽ một đường tròn một cách tương đối (nghĩa là không phải tất cả mọi đường tròn đều tròn theo ý chúng ta muốn) hàm curveto chỉ cho chúng ta thêm tọa độ của một điểm, gọi nó là tiêu điểm cũng được (trên hình minh họa là cái điểm nằm trên cùng thể hiện bằng 2 tham số đầu tiên), từ đó kẻ hai đường thẳng (gạch đứt) và đường cong của chúng ta sẽ men theo 2 đường gạch đứt đó và tự động uốn thành đường cong đến điểm mút thứ 2 của nó (điểm màu đỏ bên phải tọa độ được thể hiện ở 2 tham số sau cùng của hàm), tóm lại chúng ta có 3 điểm cần phải thiết lập cho việc vẽ một đường cong đơn giản. Adding Solid Fills (Tô màu) Chúng ta báo cho flash biết khi nào phải tô màu bằng câu lệnh: beginfill(mã màu (RGB),1); trong đó mã mầu là một số nguyên viết dưới dạng cơ số 16 tuân theo quy tắc màu của hệ thống màu RGB, tham số thứ 2 là alpha tức là độ mà đục của màu tô, mặc định là 1 (100% tô đầy thể hiện rõ nét ) chúng ta báo cho flash biết việc tô màu kết thúc bằng lệnh: endfill(); Xét VD sau: var triangle:sprite = new Sprite(); with (triangle.graphics) { linestyle(0); beginfill(0xff9900,1); moveto(50, 0); lineto(100, 100);

118 lineto(0, 100); lineto(50, 0); endfill(); triangle.x = 50; triangle.y = 250; addchild(triangle); Đưa vào flash chạy thử chắc các bạn đã hiểu mã lệnh này có t/d gì roài. Chúng ta thấy được tiện ích của việc gắn đồ họa cho một đối tượng cụ thể đó Drawing Shapes (Vẽ những hình dạng) Để thực hiện việc vẽ các hình dạng đơn giản (tròn, vuông...) chúng ta phải làm như các phần trước thì rất mất thời gian, flash cho phép chúng ta vẽ nhanh các hình đó bằng các phương pháp sau: drawcircle(x,y,r): vẽ một hình tròn ở tọa độ x,y và có bán kính là R drawrect(x,y,a,b): vẽ hình chữ nhật ở tọa độ x,y và có chiều dài A, chiều rộng B drawroundrect(x,y,a,b,c): Vẽ hình chữ nhật nhưng cạnh bị làm cong đi, cong bao nhiêu thì tùy vào tham số C, C = 0 => hình chữ nhật, C = (hoặc một giá trị thích hợp) chúng ta có hình thoi. var shapes:sprite = new Sprite(); var gr:graphics = shapes.graphics; gr.linestyle(6, 0x0000FF,.5); gr.beginfill(0xff0000,.5); gr.drawcircle(50,50,50); gr.endfill(); gr.linestyle(); gr.beginfill(0x0000ff,.2); gr.drawrect(125,0,100,100); gr.endfill(); gr.beginfill(0x0000ff,.5); gr.drawroundrect(250,0,100,100,50); gr.endfill(); shapes.x = 150; shapes.y = 250; addchild(shapes); Một số hình vẽ bằng hệ thống vẽ API:

119 Using Gradient Fills (sử dụng chế độ tô màu hòa trộn) Để sử dụng chức năng này, chúng ta có phương pháp: begingradiantfill() Nó có 4 tham số, chúng ta sẽ nói đến từng cái 1, Đầu tiên là gradtype, tức là kiểu tô, chúng ta có các kiểu quen thuộc như RADIAL (tô màu kiểu tỏa tròn) LINEAR (kiểu đường thẳng) Tiếp là colors, tức là màu gồm có 2 màu, màu ban đầu và màu chuyển bằng cách tô gradient. Tiếp là alphas, là độ mờ đục, cũng có 2 phần là độ alpha của màu gốc và màu sẽ chuyển. Cuối cùng là ratios, phần đầu chỉ vị trí sẽ bắt đầu chuyển màu, phần cuối chỉ vị trí sẽ kết thúc chuyển màu Để tiện chúng ta sẽ để các tham số colors, alphas, ratios dưới dạng mảng (có thể chia làm 2 phần tử) Chúng ta xét VD sau: var gradtype:string = GradientType.RADIAL; var colors:array = [0xFF0000, 0x000000]; var alphas:array = [1, 1]; var ratios:array = [0, 255]; var canvas = new Sprite(); canvas.graphics.begingradientfill(gradtype, colors, alphas, ratios) canvas.graphics.drawrect(0, 0, 100, 100); canvas.x = canvas.y = 100; addchild(canvas); Những gì bạn đã học không phải là tất cả, chúng ta chưa thể điều khiển màu chuyển đúng theo vị trí mong muốn. Những gì bạn cần là lớp ma trận toán học và gói hình học (Geometry package) chúng ta sẽ thảo luận tiếp ở phần sau. Simulating the Pencil Tool (đóng vai là một cây viết chì :D) Phần này rất thú vị chúng ta sẽ sử dụng những gì đã học để làm một dự án đơn giản:

120 Chúng ta vẽ những đường thẳng theo chuột khi chuột đang nhấn, chúng ta vẽ nên trực tiếp màn hình chính chứ không gắn đồ họa vào một đối tượng cụ thể nào cả, điều đó buộc chúng ta gắn đồ họa cho đối tượng this var drawing:boolean = false; this.graphics.linestyle(1, 0x000000); this.graphics.moveto(mousex, mousey); this.addeventlistener(event.enter_frame, onloop, false, 0, true); stage.addeventlistener(mouseevent.mouse_down, ondown, false, 0, true); stage.addeventlistener(mouseevent.mouse_up, onup, false, 0, true); function ondown(evt:mouseevent):void { //khi chuột đè xuống, những nét vẽ sẽ hiện ra đến tọa độ của chuột drawing = true; function onup(evt:mouseevent):void { //khi chuột nhấc lên, không có nét vẽ nào cả, thay vào đó tọa độ điểm vẽ được xác định theo chuột drawing = false; function onloop(evt:event):void { if (drawing) { this.graphics.lineto(mousex, mousey); else { this.graphics.moveto(mousex, mousey); Thấy thú vị đấy chứ. 2. The Geometry Package (Gói hình học) Tức là gói flash.geom là một gói cho phép chúng ta tạo ra các điểm, hình chữ nhật... hay sự biến đổi thể hiện của đối tượng. Chúng ta quan tâm đến các lớp sau của gói: Points, Rectanges, Matrices. Gói hình học sẽ được nói thêm ở chương sai thảo luận trong phần màu sắc (color). Creating Points (tạo một điểm) Một điểm bao gồm tọa độ x và y của nó Chúng ta tạo ra một điểm theo kiểu mảng bằng cách sau: var arraypoint:array = new Array(0, 0); Mảng có 2 phần tử tương ứng tọa độ x và y của điểm đó. trace(arraypoint[0], arraypoint[1]); Chúng ta có ở cửa sổ output giá trị 0 0 vì mảng ở đây có 2 phần tử mang giá trị 0 Ngoài ra chúng ta có những cách khác để khỏi phiền đến array, 2 VD sau: var objpoint:object = {x:0, y:0; trace(objpoint.x, objpoint.y); var objpoint2:object = new Object(); objpoint2.x = objpoint2.y = 0; trace(objpoint2.x, objpoint2.y);

121 2 điểm được khai báo trên theo kiểu Object, tất nhiên nó có nhiều thuộc tính khác nhau và chúng ta khai báo thêm cho nó là x và y. Bạn hãy để ý câu lệnh trace, chúng ta có ở cửa sổ output 2 kq giống nhau: //0 0 là kiếu quả của objpoint và objpoint2 vì x và y chỉ đơn thuần là 2 thuộc tính nằm trong đối tượng chứa 2 thuộc tính (objpoint) hay nó là một thuộc tính của đối tượng hoàn chỉnh (objpoint2) Dùng làm cách nào đi nữa thì khi truy suất đến 1 điểm trên flash, chúng ta vẫn cần ít nhất 2 giá trị để chỉ x và y, tuy nhiên với khai báo kiểu đối tượng Point Chúng ta sẽ chỉ cần 1 để biến lưu giá trị x và y, giá trị mặc định cho tọa độ 1 điểm mới được khai báo là 0 0 var pt:point = new Point(); trace(pt.x, pt.y); //0 0 Chúng ta thấy rằng pt vẫn có 2 thuộc tính của nó chỉ giá trị x và y Xét VD sau: var pt2:point = new Point(100, 100); trace(pt2); //(x=100, y=100) Giá trị pt2 mang trong nó 2 giá trị x và y Chúng ta sẽ làm tiếp VD sau: var pt1:point = new Point(100, 100); var pt2:point = new Point(400, 400); pt1.offset(50, 50); trace(pt1); //chức năng offset cho chúng ta tăng thêm giá trị của x và y lên theo đơn vị pixel //(x=150, y=150) trace(pt1.add(pt2)); //chức năng add cho phép thêm giá trị của x và y bằng cách cộng vào giá trị của điểm cho trước //(x=550, y=550) trace(pt2.subtract(pt1)); //chức năng subtract cho phép giảm giá trị của x và y bằng cách trừ giá trị của điểm cho trước //(x=250, y=250) trace(pt1.equals(pt2)); //hỏi xem 2 điểm pt1 và pt2 có trùng nhau hay không (true nếu 2 điểm trùng nhau) //điều này đơn giản hóa khi phải if cho tọa độ x và y //false trace(point.distance(pt1, pt2)); //tính khoảng cách // trace(point.interpolate(pt1, pt2,.5)); //xác định một điểm nằm trên đoạn thẳng có 2 đầu là pt1 và pt2 (.5=> giữa đoạn thẳng, //1 thì điểm đó có tọa độ = pt1, 0 thì điểm đó có tọa độ = pt2... cái tham số thứ 3 này là //tùy ở mình để xác định điểm mong muốn) //(x=275, y=275)

122 Điểm vẫn xác định khi chúng ta tạo hay gán các giá trị cho các thuộc tính của nó như x hay y (vd pt1.x), điều này giúp lập trình viên không gặp khó khăn khi sử dụng điểm hay sử dụng thuộc tính của đối tượng Điều này rất tiện lợi cho việc tạo một điểm trên màn hình, chúng ta có thể sử dụng chúng không giới hạn cho các đối tượng. Chúng ta sẽ học thêm ở chương sau các kỹ thuật làm việc với bitmap, chúng ta sẽ thấy được sự đa dạng của kỹ thuật này. Creating Rectangles (tạo hình chữ nhật) Tương tự về tạo một điểm một hình chữ nhật trong flash chứa 4 tham số chính: x,y,w (chiều dài),h (chiều rộng). var rect:rectangle = new Rectangle(0, 0, 100, 100); trace(rect.x, rect.y); //0 0 //sử dụng thuộc tính trace(rect); //(x=0, y=0, w=100, h=100) //sử dụng cách tạo hình chữ nhật của gói hình học Chúng ta có các hàm cơ bản với một đối tượng Rectangle: var rect:rectangle = new Rectangle(50, 50, 200, 100); trace(rect.left, rect.top, rect.right, rect.bottom); //khoảng cách từ cạnh Oy ở bên trái đến trục Oy, khoảng cách từ cạnh Ox ở bên trên đến trục //Ox, khoảng cách từ cạnh Oy ở bên phải đến trục Oy, khoảng cách từ cạnh Ox ở bên dưới //đến trục Ox // trace(rect.topleft, rect.bottomright); //tọa độ của đỉnh trái phía trên và đỉnh phải phía dưới //(x=50, y=50) (x=250, y=150) trace(rect.x, rect.y, rect.width, rect.height); //các thông số cơ bản của hình chữ nhật // Chúng ta có thể sử dụng phương pháp offset để tăng giá trị cho x và y tương tự ở điểm: rect.offset(10, 10); trace(rect.left, rect.top, rect.right, rect.bottom); // Điều cuối cùng chúng ta nói đến là việc so sánh xem một điểm có nằm trong 1 hình chữ nhật hay không hoặc hình chữ nhật này có nằm trong hình chữ nhật kia hay không. var rect1:rectangle = new Rectangle(0, 0, 100, 50); var rect2:rectangle = new Rectangle(50, 25, 100, 50); var pnt:point = new Point(125, 50); trace(rect1.contains(25, 25)); //hàm contains dùng để xem 1 điểm có tọa độ cho trước có thuộc hình chữ nhật hay không //true trace(rect2.containspoint(pnt)); //hàm containspoint cũng như hàm contains có điều nó làm việc với điểm (Point) //true trace(rect1.containsrect(rect2));

123 //hàm containsrect kiểm tra xem hình chữ nhật rect2 có nằm trong hình chữ nhật rect1không //false Chúng ta xét thêm về diện tích trùng nhau của hai hình chữ nhật trên màn hình: Nó có thể trùng nhau ở toàn bộ diện tích và chúng ta sử dụng hàm containsrect hoặc một vài phần diện tích nào đó (intersection) và vùng chữ nhật bao phủ toàn bộ 2 hình chữ nhật (rect1 và rect2 ) đang xét là vùng union, mã lệnh sau gọi ra các hàm đó: trace(rect1.intersects(rect2)); //true //nếu KQ của hàm intersects là true, chúng ta mới gọi được hàm sau gọi ra hình chữ nhật //màu xanh là giao của 2 hình trên trace(rect1.intersection(rect2)); //(x=50, y=25, w=50, h=25) trace(rect1.union(rect2)); //gọi hình chữ nhật bao phủ toàn bộ 2 hình rect1 và rect2 là phần union //(x=0, y=0, w=150, h=75) Using Matrices (sử dụng ma trận) Flash sử dụng ma trận để điều khiển scale, rotation, và x, y tọa độ, chúng còn được sử dụng khi tô màu chuyển (gradient), sử dụng với các bitmap nhưng bitmap sẽ được nói đến ở chương sau. Cấu trúc của một ma trận 3 x 3 trong flash như sau: Các bạn hãy để ý những chữ (thực ra là số) trên ma trận, chúng ta sẽ giải thích chúng. a và d là để thay đổi ti lệ chiều dài, chiều rộng (scaling), b và c là để thay đổi độ nghiêng (skew), tất nhiên a, b, c, d sẽ cùng làm thay đổi thuộc tính góc (rotation) của đối tượng (thông qua các hàm sin và cos khá rắc rối). tx và ty là giá trị x và y tọa độ tương ứng. 3 giá trị cuối u, v, w là giá trị thay đổi theo không gian 3D (three-dimensional) tuy nhiên flash chưa hỗ trợ điều này và có nghĩa là chúng ta sẽ bỏ qua chúng, bạn có thể đặt chúng ở giá trị lần lượt là để biểu diễn trên màn hình 2D thông thường. Dưới đây là bảng hệ thống lại các tham số của ma trận và cách chúng thay đổi đối tượng được gắn vào:

124 Màu đỏ là đối tượng sau khi đã sử dụng ma trận. Skew là độ nghiêng khác với góc (rotation) Cái bảng này dễ hiểu đấy chứ, tiếng anh cũng đâu phải quá khó ah mà cái The Motion Package là một phần sau của chương này đó. Các bạn không nên quan tâm đến mấy cái hàm sin cos, trong sách hok giải thích mà mình cứ xài như vậy đi! Nhớ xài là xài ở phần Methods nha, ngoài ra cái cột thứ 2 này còn chúng ta các thuộc tính tương ứng của phương pháp nữa, bây giờ chúng ta sẽ đi vào chi tiết: Skewing with matrices (làm nghiêng với ma trận) var rect:sprite = new Sprite(); rect.graphics.linestyle(1, 0x000000); rect.graphics.beginfill(0x00ff00,.4); rect.graphics.drawrect(0, 0, 100, 50); rect.graphics.endfill(); //vẽ hình chữ nhật rect và nó có màu sắc addchild(rect); function deg2rad(deg:number):number { return deg * Math.PI / 180; //chuyển đơn vị độ thành đơn vị radian để sử dụng var mtrx:matrix = rect.transform.matrix; mtrx.c = Math.tan(deg2rad(20)); //tham số c của ma trận mtrx nhận giá trị tan(π/9) (vì π/9 = 20 0 ) rect.transform.matrix = mtrx; //hình chữ nhật biến đổi theo ma trận mtrx nó bị nghiêng 20 0 như hình dưới đây, mặc định trục 0 0 hướng thẳng đứng xuống: (KQ là hình màu xanh phía trên)

125 Để có KQ như hình phía dưới chúng ta sửa lại mã lệnh như sau: var mtrx:matrix = rect.transform.matrix; mtrx.c = Math.tan(deg2rad(-20)); rect.transform.matrix = mtrx; Bây giờ chúng ta đã có được hình làm nghiêng nhưng vị trí của nó lại lệch sang bên trái (so với đường gạch đứt) do đó chúng ta cần tính toán để đưa vị trí của nó về tương ứng với hình bên trên như KQ sau: Bạn có thể dùng lượng giác để tính độ lệnh của nó so với đường gach đứt, sau đó tịnh tiến cái hình bằng thuộc tính x của nó nhưng chúng ta có cách khác đơn giản hơn, đó là sử dụng phương pháp deltatransformpoint(). Đầu tiên điểm bị lệch cần phải điều chỉnh của chúng ta có tọa độ (0, 50) tức là đỉnh hình chữ nhật dưới bên trái. Chúng ta tạo ra điều đó và mã lệnh như sau: var mtrx:matrix = rect.transform.matrix; mtrx.c = Math.tan(deg2rad(-20)); rect.transform.matrix = mtrx; trace(deltatransformpoint(new Point(0, 50))) Câu lệnh cuối cùng ở đây đưa ra KQ xấp xỉ là (-18, 50) cho thấy đây là điểm (đỉnh bên dưới bên trái của hình chữ nhật) biến đổi từ điểm (0;50) sau khi thay đổi hình chữ nhật nghiêng 20 0 Phương pháp deltatransformpoint() cho chúng ta một cách đơn giản để di chuyển một đỉnh của hình đã bị nghiêng đi đến một tọa độ mới mà chúng ta đã tính toán, mã lệnh thêm vào để hình bên dưới đây xảy ra là: rect.x -= mtrx.deltatransformpoint(new Point(0, 50)).x; //di chuyển tọa độ x của hình (từ điểm chúng ta đang xét là đỉnh hình phía dưới bên trái //đang ở (-18,50) mà có tọa độ ban đầu là (0;50) (tọa dộ ban đầu của đỉnh bên trái phía dưới //hình chữ nhật) //chúng ta chỉ quan tâm đến giá trị x của điểm vì rect chỉ gọi thuộc tính x của nó, ngoài ra vì //khi skew chỉ có x thay đổi chứ giá trị y (chỉ bề ngang) không đổi

126 Creating better gradient fills (tạo kiểu tô màu chuyển tốt hơn) Sử dụng matrices, Bạn có thể làm điều khiển một số thuộc tính tô đầy (full), kể cả chiều rộng, và chiều cao, thuộc tính góc, tọa độ của điểm bắt đầu tô trên đối tượng và những tùy chọn mô tả trong khu vực này. Để đơn giản hóa, chúng ta thêm phương pháp creategradientbox() của lớp ma trận này vào: creategradientbox(width, height, rotation, tx, ty); Chúng ta xét VD sau: //radial gradient var gradtype:string = GradientType.RADIAL; var matrix:matrix = new Matrix(); matrix.creategradientbox(100, 100, 0, 0, 0); var colors:array = [0xFF0000, 0x000000]; var alphas:array = [1, 1]; var ratios:array = [0, 255]; var canvas = new Sprite(); canvas.graphics.begingradientfill(gradtype, colors, alphas, ratios, matrix); canvas.graphics.drawrect(0, 0, 100, 100); canvas.x = canvas.y = 100; addchild(canvas); Đây là KQ: Dễ dàng thấy tọa độ bắt đầu tô màu chuyển là 0;0, tô kiểu tỏa tròn (radial) với chiều rộng và chiều dài vùng tô là 100 pixel. (hình vuông ở đây có tọa độ đỉnh bên trái phía trên là (0;0) và kick thước là 100 pixel. Do kiểu tô là tỏa tròn cho nên góc tô = 0 hoặc bằng mấy đó không quan trọng. như với kiểu tô theo đường thẳng thì khác, chúng ta cần xác định góc tô là bao nhiêu (góc 0 0 hướng hướng qua phải, chiều dương theo chiều Kim đồng hồ) Để thuận tiện khi xác định góc tô bằng radian, chúng ta cần đến 1 hàm làm nhiệm vụ chuyển đơn vị từ dộ sang radian: //LINEAR gradient var gradtype:string = GradientType.LINEAR; var matrix:matrix = new Matrix(); matrix.creategradientbox(100, 100, deg2rad(90), 0, 0); //tô từ màu đỏ sang màu đen với góc tô là 90 0 hay tô thẳng đứng xuống dưới var colors:array = [0xFF0000, 0x000000];

127 var alphas:array = [1, 1]; var ratios:array = [0, 255]; var canvas = new Sprite(); canvas.graphics.begingradientfill(gradtype, colors, alphas, ratios, matrix); canvas.graphics.drawrect(0, 0, 100, 100); canvas.x = canvas.y = 100; addchild(canvas); function deg2rad(deg:number):number { return deg * (Math.PI/180); Chúng ta có KQ: Chúng ta có thể điều khiên một số kiểu tô khác Chúng ta còn 2 tùy chọn nữa cho phương pháp begingradientfill() đó là SpreadMethod.REFLECT and SpreadMethod.REPEAT SpreadMethod.REFLECT: tham số này cho phép chúng ta tô màu chuyển tùy 2 chiều liên tiếp nhau: SpreadMethod.REPEAT:tuy chọn này cho phép chúng ta thực hiện tô màu chuyển trên một nửa của đối tượng và một nửa kia lặp lại hiệu ứng đó: Cách sử dụng 2 tham số trên rất đơn giản, chúng ta cho nó vào làm tham số cuối cùng trong phương pháp begingradientfill(). Lưu ý là chỉ có thể dùng 1 trong 2 loại trên thôi // sử dụng ma trận để điều khiển sự xuất hiện của màu chuyển sắc

128 var gradtype:string = GradientType.LINEAR; var spread:string = SpreadMethod.REFLECT; //hiệu ứng khi tô gradient var matrix:matrix = new Matrix(); //ma trận thêm vào sử dụng cho kiểu tô gradient matrix.creategradientbox(50, 50, deg2rad(90), 0, 0); var colors:array = [0xFF0000, 0x000000]; var alphas:array = [1, 1]; var ratios:array = [0, 255]; var canvas = new Sprite(); canvas.graphics.begingradientfill(gradtype, colors, alphas, ratios, matrix, spread); canvas.graphics.drawrect(0, 0, 100, 100); canvas.x = canvas.y = 100; addchild(canvas); function deg2rad(deg:number):number { return deg * (Math.PI/180); 3. The Motion Package (Gói chuyển động). Chúng ta không thể kết luận chương này mà không đền cập đến sự tồn tại của lớp MatrixTransformer của AS3 là một phần của gói chuyển động. Thậm chí việc sử dụng ma trận MatrixTransformer class ở đây còn đơn giản hơn so với cách biến đổi ma trận ở lớp ma trận (Matrix class). MatrixTransformer class được dành cho việc thiết lập và điều khiển mọi cấu hình ma trận khác trong flash. Khởi tạo một giá trị mới và chúng ta sẽ làm nghiêng một đối tượng đi 20 0 bằng cách sử dụng lớp MatrixTransformer giống như ở phần Skewing with matrices trước đây (các bạn có thể xem lại để phân biệt 2 lớp ma trận này): Chúng ta xem VD đơn giản sau để nghiêng đối tượng dispobj bằng cách sử dụng MatrixTransformer biến đổi một ma trận Matrix (mat) từ đó thay đổi được đối tượng cần thay đổi var mat:matrix = new Matrix(); MatrixTransformer.setSkewX(mat, 20); dispobj.transform.matrix = mat; Chúng ta tiếp tục với một dự án khác, một đối tượng sẽ được xoay khi chúng ta đè con chuột xuống, đối tượng xoay quanh con chuột và tự xoay quanh nó theo một góc nhất định, không có gì tốt hơn là sử dụng phương pháp rotatearoundexternalpoint(). Công việc Đế sử dụng gói motion (có chứa ) chúng ta phải nhập nó vào chương trình: import fl.motion.*; Sau đó chúng ta cần 1 biến để xác định xem con chuột có được nhấn không: var down:boolean = false; Chúng ta đưa ra 3 sự kiện của flash có thể thực hiện các hàm trong chương trình stage.addeventlistener(mouseevent.mouse_up, onup, false, 0, true); stage.addeventlistener(mouseevent.mouse_down, ondown, false, 0, true); addeventlistener(event.enter_frame, onloop, false, 0, true); Cần một hàm để xác định giá trị của down là true khi con chuột được click xuống: Nó được đặt trong MouseEvent.MOUSE_DOWN

129 function ondown(evt:mouseevent):void { down = true; Tương tự một hàm để xác định con chuột đang ở trạng thái không nhấn, đặt nó trong MouseEvent.MOUSE_UP function onup(evt:mouseevent):void { down = false; Sau cùng là một hàm đặt trong Event.ENTER_FRAME để đảm bảo chương trình sẽ chạy liên tục: function onloop(evt:event):void { if (down) { var mat:matrix = dispobj.transform.matrix; MatrixTransformer.rotateAroundExternalPoint(mat, mousex, mousey, 20); //Ma trận biến đổi có phương pháp rotatearoundexternalpoint() Cho chúng ta biến đổi //ma trận mat (ma trận bình thường), dispobj.transform.matrix = mat; //bây giò, mat có thể biến đổi đối tượng là nó điều khiển (là dispobj) có thể xoay quanh //Tọa độ con chuột, với góc xoay là 20 0 (đơn vị là độ nha) Xong roài đó, nhớ tạo đối tượng nào đó có tên là dispobj, chèn mã lệnh ở trên và chạy thử 4. 9-Slice Scaling (9 miếng ghép thay đổi tỉ lệ) Một số hình ảnh khi chúng ta sử dụng 9-Slice scaling: Chú thích: Original: hình dạng ban đầu Scaled with distortion: thay đổi tỉ lệ có kèm theo biến dạng

130 Scaled without distortion: đổi tỉ lệ không có kèm theo biến dạng 9-Slice scaling enabled: Có sử dụng 9-Slice scaling. Tất cả những hình dạng trên chúng ta sẽ thấy trong dự án 9slice.fla, trong đó con chuột sẽ làm nhiệm vụ thay đổi tỉ lệ của đối tượng màu vàng, cú click chuột sẽ chuyển đổi giữa 2 trạng thái Scaled without distortionvà Scaled with distortion. 9-Slice scaling giảm bớt sự biến dạng trong việc thay đổi tỉ lệ như hình sau: (màu vàng đậm là cái hình sau khi sài 9-Slice scaling ) Đê bắt đầu chúng ta phải tạo ra một đối tượng, cho nó tọa độ nữa: var sp:sprite = new Sprite(); with (sp.graphics) { linestyle(1, 0x000000, 1, true); beginfill(0xffff00,.5); drawroundrect(0, 0, 100, 50, 15); endfill(); sp.x = sp.y = 50; addchild(sp); Để thay đổi lê mà tránh bị biến dạng quá nhiều, chúng ta tạo ra một hình chữ nhật trên đối tượng đó (hình chữ nhật ở hình trên chỉ hình màu vàng đậm) var slice9rect:rectangle = new Rectangle(15, 15, 70, 20); //tọa độ, chiều dài, rộng được canh sao cho nó trùng với hình chữ nhật chính diện của sp sp.scale9grid = slice9rect; scale9grid là thuộc tính của sp, nó cho phép chúng ta tạo ra 9 miếng cắt trên đối tượng như hình vẽ ở trên, tất nhiên ở trung tâm là một hình chữ nhật, miếng cắt ở trung tâm là slice9rect sẽ thay cho đối tượng chúng ta đang thể hiện và do nó là một hình được sở hữu thuộc tính scale9grid nên nó không bị biến dạng khi scale Tiếp theo chúng ta xây dựng hàm cho Eventlistener: Event.ENTER_FRAME addeventlistener(event.enter_frame, onloop, false, 0, true); Sau đó là định nghĩa hàm onloop: function onloop(evt:event):void { sp.width = Math.max(mouseX - sp.x, 30); sp.height = Math.max(mouseY - sp.y, 30); Hàm Math.max cho phép chúng ta chọn ra giá trị lớn nhất giữa tọa độ con chuột khi trừ đi 50 (tọa độ của sp là (50;50), nếu không trừ các số đo của hình thì hình sẽ không đến được chiều dài con chuột do vốn dĩ tọa độ của đối tượng không phải là (0;0) mà tọa độ con chuột được tính từ (0;0) nó cũng đảm bảo là tọa độ con chuột vẫn ở dưới hoặc bên phải đối tượng và chiều dài cũng như chiều rộng của đối tượng vẫn sẽ có thể kéo đến con chuột, nếu con chuột nằm phía trên hay bên trái, hình sẽ bị lật khi muốn đối tượng sp có chiều dài, chiều rộng bằng tọa độ x, y của con chuột, chúng ta không mong muốn điều này, nên giá trị min

131 của số đo của sp sẽ là 30 (nếu mousex - sp.x hay mousey - sp.y nhỏ hơn 30, hàm Math.max sẽ lấy giá trị 30) Sau cùng là hàm để khi click chuột, 2 trạng thái của việc sử dụng hình chữ nhật slice9rect hoặc không sử dụng hình đó: stage.addeventlistener(mouseevent.click, onclick, false, 0, true); function onclick(evt:event):void { if (sp.scale9grid) { //nếu scale9grid đã được thể hiện trên sp sp.scale9grid = null; //xóa bỏ, cho nó thành không có (null) else { //còn ngược lại sp.scale9grid = slice9rect; //Thể hiện scale9grid trên đối tượng sp Dễ dàng nhận ra khi không có đối tượng slice9rect, chúng ta dễ dàng nhận ra sự biến dạng của đối tượng sp khi thay đổi tỉ lệ cho nó, thực chất thì 9-slice scaling là một cách thể hiện khác hình sp, thay cho nó khi nó bị scale (thay đổi tỉ lệ số đo). 5. Applied Examples (Áp dụng vào ví dụ) A Simple Color Picker (bảng chọn màu đơn giản) Dự án đầu tiên là tạo một bảng chọn màu bảng cách sử dụng kiểu tô gradient, tất nhiên cái bảng đó chỉ là một đối tượng được tạo ra gắn với một lớp đồ họa chúng ta sẽ nghiên cứu ngay sau đây: Chúng ta hãy bắt đầu bởi việc tạo ra một đối tượng màn hình hơi phức tạp hơn mà sử dụng 2 gradient, những giá trị alpha, và một sự quay của một ma trận (matrix rotation), cái chúng ta sắp tạo ra có phần giống trong phần trôn màu của flash (Flash s Color Mixer panel) Chương tiếp theo, chúng ta sẽ học cách lấy những màu từ bảng chọn đó bằng cách sử dụng chuột. Bảng chọn màu sẽ có 2 phần: phần nằm ngang màu chuyển một cách hòa hợp theo từng mảng màu và phần nằm dọc sẽ chuyển màu từ trong suốt (phía trên) đến đục dần (màu đen phía dưới), chúng ta sẽ học cách thêm độ đục (sắc đen) vào các gam màu khác. Chúng ta tạo ra 2 layer, 1 để chứa mã lệnh và một để chứa đồ họa, hàm drawgradientbox(), nó có ý nghĩa để định nghĩa một hàm để điều khiển công việc mà không cần nhiều sự lặp lại. Hàm này cho phép chúng ta vẽ một gradient có kick thước, các màu sẽ chuyển, độ mờ đục

TÀI LIỆU Hướng dẫn cài đặt thư viện ký số - ACBSignPlugin

TÀI LIỆU Hướng dẫn cài đặt thư viện ký số - ACBSignPlugin TÀI LIỆU Hướng dẫn cài đặt thư viện ký số - ACBSignPlugin Dành cho Khách hàng giao dịch ACB Online bằng phương thức xác thực Chữ ký điện tử (CA) MỤC LỤC: I. MỤC ĐÍCH CÀI ĐẶT...2 II. ĐỐI TƯỢNG CÀI ĐẶT...2

More information

Bài 15: Bàn Thảo Chuyến Du Ngoạn - cách gợi ý; dùng từ on và happening

Bài 15: Bàn Thảo Chuyến Du Ngoạn - cách gợi ý; dùng từ on và happening 1 Bài 15: Bàn Thảo Chuyến Du Ngoạn - cách gợi ý; dùng từ on và happening Transcript Quỳnh Liên và toàn Ban Tiếng Việt, Đài Úc Châu, xin thân chào quí bạn. Đây là chương trình Tiếng Anh Căn Bản gồm 26 bài

More information

CÀI ĐẶT MẠNG CHO MÁY IN LBP 3500 và LBP 5000

CÀI ĐẶT MẠNG CHO MÁY IN LBP 3500 và LBP 5000 CÀI ĐẶT MẠNG CHO MÁY IN LBP 3500 và LBP 5000 A. CÀI ĐẶT MÁY IN TRONG MẠNG TỪ CD-ROM Khi cài đặt bằng cách này chúng ta có thể set địa chỉ IP, tạo port và cài đặt driver cùng lúc 1. BƯỚC CHUẨN BỊ: - Kết

More information

PHÂN TÍCH DIỄN BIẾN LƯU LƯỢNG VÀ MỰC NƯỚC SÔNG HỒNG MÙA KIỆT

PHÂN TÍCH DIỄN BIẾN LƯU LƯỢNG VÀ MỰC NƯỚC SÔNG HỒNG MÙA KIỆT PHÂN TÍCH DIỄN BIẾN LƯU LƯỢNG VÀ MỰC NƯỚC SÔNG HỒNG MÙA KIỆT PGS.TS. Lê Văn Hùng, KS. Phạm Tất Thắng Đại học Thủy lợi Tóm tắt Hệ thống sông Hồng là nguồn nước chi phối mọi hoạt động dân sinh kinh tế vùng

More information

CMIS 2.0 Help Hướng dẫn cài đặt hệ thống Máy chủ ứng dụng. Version 1.0

CMIS 2.0 Help Hướng dẫn cài đặt hệ thống Máy chủ ứng dụng. Version 1.0 CMIS 2.0 Help Hướng dẫn cài đặt hệ thống Máy chủ ứng dụng Version 1.0 MỤC LỤC 1. Cài đặt máy chủ ứng dụng - Application Server... 3 1.1 Cài đặt và cấu hình Internet Information Service - WinServer2003...

More information

CHƯƠNG I. TỔNG QUAN VỀ HỆ THỐNG DCS- CENTUM CS 3000

CHƯƠNG I. TỔNG QUAN VỀ HỆ THỐNG DCS- CENTUM CS 3000 CHƯƠNG I. TỔNG QUAN VỀ HỆ THỐNG DCS- CENTUM CS 3000 CENTUM CS 3000 là một hệ thống điều khiển sản xuất tích hợp cho các ứng dụng điều khiển quá trình được thiết kế phù hợp với các nhà máy có quy mô từ

More information

KIỂM TOÁN CHU TRÌNH BÁN HÀNG VÀ NỢ PHẢI THU

KIỂM TOÁN CHU TRÌNH BÁN HÀNG VÀ NỢ PHẢI THU KIỂM TOÁN CHU TRÌNH BÁN HÀNG VÀ NỢ PHẢI THU AUDITING THE SALES AND RECEIVABLES PROCESS SVTH: Phạm Nguyễn Anh Thư, Phan Thị Thu Thật Lớp 09A3, Khoa Hệ thống Thông tin Kinh tế, Trường CĐ Công nghệ Thông

More information

PREMIER VILLAGE PHU QUOC RESORT

PREMIER VILLAGE PHU QUOC RESORT PREMIER VILLAGE PHU QUOC RESORT TỔNG QUAN DỰ ÁN PREMIER VILLAGE PHU QUOC RESORT 73 ha 118 Căn biệt thự SALA Design Group 500m2 Diện tích tối thiểu QII/2017 Bàn giao MŨI ÔNG ĐỘI, THỊ TRẤN AN THỚI, PHÚ QUỐC,

More information

5/13/2011. Bài 3: Báo cáo kết quả kinh doanh. Nội dung. Trình bày báo cáo kết quả kinh doanh

5/13/2011. Bài 3: Báo cáo kết quả kinh doanh. Nội dung. Trình bày báo cáo kết quả kinh doanh Bài 3: Báo cáo kết quả kinh doanh 1 Nội dung Thành phần và cách trình bày báo cáo kết quả kinh doanh Nguyên tắc ghi nhận doanh thu và kế toán dồn tích Nguyên tắc ghi nhận chi phí. Khấu hao tài sản dài

More information

Hướng dẫn cài Windows 7 từ ổ cứng HDD bằng ổ đĩa ảo qua file ISO bằng hình ảnh minh họa

Hướng dẫn cài Windows 7 từ ổ cứng HDD bằng ổ đĩa ảo qua file ISO bằng hình ảnh minh họa Hướng dẫn cài Windows 7 từ ổ cứng HDD bằng ổ đĩa ảo qua file ISO bằng hình ảnh minh họa {VnTim } Windows 7 dường như đang hâm nóng trên tất cả các phương diện của cộng đồng mạng, bản RTM vừa mới ra mắt

More information

Bottle Feeding Your Baby

Bottle Feeding Your Baby Bottle Feeding Your Baby Bottle feeding with formula will meet your baby's food needs. Your doctor will help decide which formula is right for your baby. Never give milk from cows or goats to a baby during

More information

Phương thức trong một lớp

Phương thức trong một lớp Phương thức trong một lớp (Method) Bởi: Huỳnh Công Pháp Phương thức xác định giao diện cho phần lớn các lớp. Trong khi đó Java cho phép bạn định nghĩa các lớp mà không cần phương thức. Bạn cần định nghĩa

More information

BIÊN DỊCH VÀ CÀI ĐẶT NACHOS

BIÊN DỊCH VÀ CÀI ĐẶT NACHOS BIÊN DỊCH VÀ CÀI ĐẶT NACHOS Khuyến cáo: nên sử dụng phiên bản Linux: Redhat 9 hoặc Fedora core 3 1. Giới thiệu Nachos Nachos là một phần mềm mã nguồn mở (open-source) giả lập một máy tính ảo và một số

More information

NHỊP ĐẬP THỊ TRƯỜNG QUÝ 3, 2015

NHỊP ĐẬP THỊ TRƯỜNG QUÝ 3, 2015 NHỊP ĐẬP THỊ TRƯỜNG QUÝ 3, 2015 Nielsen Việt nam Tháng 11 năm 2015 KINH TẾ TIẾP TỤC CẢI THIỆN TRONG Q3 15 Cả ngành công nghiệp và bán lẻ đều đóng góp vào sự phát triển chung Tăng trưởng GDP 7.0 6.5 6.0

More information

Hiện nó đang được tân trang toàn bộ tại Hải quân công xưởng số 35 tại thành phố Murmansk-Nga và dự trù trở lại biển cả vào năm 2021.

Hiện nó đang được tân trang toàn bộ tại Hải quân công xưởng số 35 tại thành phố Murmansk-Nga và dự trù trở lại biển cả vào năm 2021. Sưu tầm Chủ đề: Hải quân Nga-sô Tác giả: Daniel Brown Dịch thuật: BKT Bản Việt ngữ Ngành Hàng Không Mẫu Hạm Hải quân Nga-sô (Hàng Không Mẫu Hạm Nga-sô, chiếc Admiral Kuznetsov, là chiến thuyền tồi nhất

More information

CHƯƠNG IX CÁC LỆNH VẼ VÀ TẠO HÌNH (TIẾP)

CHƯƠNG IX CÁC LỆNH VẼ VÀ TẠO HÌNH (TIẾP) CHƯƠNG IX CÁC LỆNH VẼ VÀ TẠO HÌNH (TIẾP) 9.1 Vẽ đường thẳng - Từ dòng Command: ta nhập lệnh Xline, Xl - Từ menu Draw/ Xline - Chọn biểu tượng Lệnh Xline dùng để tạo đường dựng hình (Construction line hay

More information

Chương 3: Chiến lược tìm kiếm có thông tin heuristic. Giảng viên: Nguyễn Văn Hòa Khoa CNTT - ĐH An Giang

Chương 3: Chiến lược tìm kiếm có thông tin heuristic. Giảng viên: Nguyễn Văn Hòa Khoa CNTT - ĐH An Giang Chương 3: Chiến lược tìm kiếm có thông tin heuristic Giảng viên: Nguyễn Văn Hòa Khoa CNTT - ĐH An Giang 1 Nội dung Khái niệm Tìm kiếm tốt nhất trước Phương pháp leo đồi Tìm kiếm Astar (A*) Cài đặt hàm

More information

Chúng ta cùng xem xét bài toán quen thuộc sau. Chứng minh. Cách 1. F H N C

Chúng ta cùng xem xét bài toán quen thuộc sau. Chứng minh. Cách 1. F H N C Từ một bổ đề về đường thẳng uler guyễn Văn inh à ội Tóm tắt nội dung Trong bài viết tác giả giới thiệu tới bạn đọc một bổ đề liên quan tới điểm nằm trên đường thẳng uler và một số ứng dụng trong giải các

More information

XÂY DỰNG MÔ HÌNH CƠ SỞ DỮ LIỆU PHÂN TÁN CHO HỆ THỐNG THÔNG TIN ĐẤT ĐAI CẤP TỈNH VÀ GIẢI PHÁP ĐỒNG BỘ HÓA CƠ SỞ DỮ LIỆU TRÊN ORACLE

XÂY DỰNG MÔ HÌNH CƠ SỞ DỮ LIỆU PHÂN TÁN CHO HỆ THỐNG THÔNG TIN ĐẤT ĐAI CẤP TỈNH VÀ GIẢI PHÁP ĐỒNG BỘ HÓA CƠ SỞ DỮ LIỆU TRÊN ORACLE XÂY DỰNG MÔ HÌNH CƠ SỞ DỮ LIỆU PHÂN TÁN CHO HỆ THỐNG THÔNG TIN ĐẤT ĐAI CẤP TỈNH VÀ GIẢI PHÁP ĐỒNG BỘ HÓA CƠ SỞ DỮ LIỆU TRÊN ORACLE (BUILDING A DISTRIBUTED DATABASE MODEL FOR LAND INFORMATION SYSTEM AND

More information

Các bước trong phân khúc thi truờng. Chương 3Phân khúc thị trường. TS Nguyễn Minh Đức. Market Positioning. Market Targeting. Market Segmentation

Các bước trong phân khúc thi truờng. Chương 3Phân khúc thị trường. TS Nguyễn Minh Đức. Market Positioning. Market Targeting. Market Segmentation Chương 3Phân khúc thị trường và chiến lược định vị TS Nguyễn Minh Đức 1 Các bước trong phân khúc thi truờng và xác định thị trường mục tiêu 2. Chuẩn bị các hồ sơ của các phân khúc TT 1. Xác định các cơ

More information

CÁC BIỆN PHÁP BẢO VỆ THEO THỦ TỤC Quyền Giáo Dục Đặc Biệt của Gia Đình Quý vị

CÁC BIỆN PHÁP BẢO VỆ THEO THỦ TỤC Quyền Giáo Dục Đặc Biệt của Gia Đình Quý vị CÁC BIỆN PHÁP BẢO VỆ THEO THỦ TỤC Quyền Giáo Dục Đặc Biệt của Gia Đình Quý vị Mississippi Department of Education Office of Special Education Chỉnh sửa ngày 3 tháng 9 năm 2013 Các Yêu Cầu Bảo Vệ Theo

More information

QUY CÁCH LUẬN VĂN THẠC SĨ

QUY CÁCH LUẬN VĂN THẠC SĨ QUY CÁCH LUẬN VĂN THẠC SĨ (Trích Quy chế Đào tạo sau đại học) (Áp dụng từ năm 2009, các mẫu ban hành trước đây không còn giá trị) 1. Soạn thảo văn bản Luận văn sử dụng chữ Times New Roman cỡ chữ 13 hoặc

More information

PHÂN PHỐI CHUẨN. TS Nguyen Ngoc Rang; Website: bvag.com.vn; trang:1

PHÂN PHỐI CHUẨN. TS Nguyen Ngoc Rang;   Website: bvag.com.vn; trang:1 PHÂN PHỐI CHUẨN Phân phối chuẩn (Normal distribution) được nêu ra bởi một người Anh gốc Pháp tên là Abraham de Moivre (1733). Sau đó Gauss, một nhà toán học ngưới Đức, đã dùng luật phân phối chuẩn để nghiên

More information

nhau. P Z 1 /(O) P Z P X /(Y T ) khi và chỉ khi Z 1 A Z 1 B XA XB /(Y T ) = P Z/(O) sin Z 1 Y 1A PX 1 P X P X /(Y T ) = P Z /(Y T ).

nhau. P Z 1 /(O) P Z P X /(Y T ) khi và chỉ khi Z 1 A Z 1 B XA XB /(Y T ) = P Z/(O) sin Z 1 Y 1A PX 1 P X P X /(Y T ) = P Z /(Y T ). Định lý Đào về đường thẳng Simson mở rộng Nguyễn Văn Linh Năm 205 Năm 204, tác giả Đào hanh ai đề xuất bài toán sau (không kèm lời giải). ài toán (Đào hanh ai). ho tam giác nội tiếp đường tròn (). là điểm

More information

CƠ SỞ DỮ LIỆU PHÂN TÁN

CƠ SỞ DỮ LIỆU PHÂN TÁN HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ DỮ LIỆU PHÂN TÁN (Dùng cho sinh viên hệ đào tạo đại học từ xa) Lưu hành nội bộ HÀ NỘI - 2009 HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ DỮ LIỆU PHÂN TÁN

More information

Model SMB Lưỡi dao, bộ phận cảm biến nhiệt và lòng bình bằng thép không gỉ 304 an toàn cho sức khỏe.

Model SMB Lưỡi dao, bộ phận cảm biến nhiệt và lòng bình bằng thép không gỉ 304 an toàn cho sức khỏe. Model SMB-7389 Lưỡi dao, bộ phận cảm biến nhiệt và lòng bình bằng thép không gỉ 304 an toàn cho sức khỏe. Thân bình được thiết kế đặc biệt 2 lớp cách nhiệt: thép không gỉ 304 bên trong và nhựa chịu nhiệt

More information

Định hình khối. Rèn kim loại

Định hình khối. Rèn kim loại Định hình khối Rèn kim loại Các chi tiết được chế tạo bằng phương pháp rèn Hình 1 (a) Sơ đồ các bước rèn dao. (b) Càng đáp máy bay C5A và C5B. (c) Máy rèn thủy lực 445 MN (50,000 ton). Nguồn: (a) Courtesy

More information

Giáo dục trí tuệ mà không giáo dục con tim thì kể như là không có giáo dục.

Giáo dục trí tuệ mà không giáo dục con tim thì kể như là không có giáo dục. In 1861, Mary MacKillop went to work in Penola, a small town in South Australia. Here she met a Catholic priest, Father Julian Woods. Together they opened Australia's first free Catholic school. At that

More information

NATIVE ADS. Apply from 01/03/2017 to 31/12/2017

NATIVE ADS. Apply from 01/03/2017 to 31/12/2017 NATIVE ADS Apply from 01/03/2017 to 31/12/2017 NATIVE ADS SPONSORED PLACEMENT Sản phẩm Website Platform Price Type Giá /ngày Specs Branded Playlist Zing Mp3 App Exclusive Full pack: 75,000,000 Single pack:

More information

Điểm Quan Trọng về Phúc Lợi

Điểm Quan Trọng về Phúc Lợi 2013 Điểm Quan Trọng về Phúc Lợi Tôi cực kỳ hài lòng. Giá cả hợp lý là điều rất quan trọng với chúng tôi. Khía cạnh phi lợi nhuận là rất tốt! Karen L., thành viên từ năm 2010 Các Chương Trình Medicare

More information

HỌC SINH THÀNH CÔNG. Cẩm Nang Hướng Dẫn Phụ Huynh Hỗ Trợ CÁC LỚP : MẪU GIÁO ĐẾN TRUNG HỌC. Quốc Gia mọitrẻ em.mộttiếng nói

HỌC SINH THÀNH CÔNG. Cẩm Nang Hướng Dẫn Phụ Huynh Hỗ Trợ CÁC LỚP : MẪU GIÁO ĐẾN TRUNG HỌC. Quốc Gia mọitrẻ em.mộttiếng nói Quốc Gia mọitrẻ em.mộttiếng nói CÁC LỚP : MẪU GIÁO ĐẾN TRUNG HỌC Cẩm Nang Hướng Dẫn Phụ Huynh Hỗ Trợ HỌC SINH THÀNH CÔNG CẨM NANG HƯỚNG DẪN NÀY BAO GỒM: Tổng quan về một số vấn đề quan trọng con quý vị

More information

SB 946 (quy định bảo hiểm y tế tư nhân phải cung cấp một số dịch vụ cho những người mắc bệnh tự kỷ) có ý nghĩa gì đối với tôi?

SB 946 (quy định bảo hiểm y tế tư nhân phải cung cấp một số dịch vụ cho những người mắc bệnh tự kỷ) có ý nghĩa gì đối với tôi? Hệ thống Bảo vệ và Biện hộ của California Điện thoại Miễn cước (800) 776-5746 SB 946 (quy định bảo hiểm y tế tư nhân phải cung cấp một số dịch vụ cho những người mắc bệnh tự kỷ) có ý nghĩa gì đối với tôi?

More information

Sổ tay cài đặt Ubuntu từ live CD

Sổ tay cài đặt Ubuntu từ live CD Sổ tay cài đặt Ubuntu từ live CD Mục Lục Sổ tay cài đặt Ubuntu từ live CD...2 Lời mở đầu...2 Khởi động quá trình cài đặt Ubuntu vào ổ điã cứng...2 Bước 1 : Chọn ngôn ngữ...2 Bước 2 : Chọn quốc gia và vùng

More information

So sánh các phương pháp phân tích ổn định nền đường đắp

So sánh các phương pháp phân tích ổn định nền đường đắp Journal of Science and Technology 1(10) (2014) 1 14 So sánh các phương pháp phân tích ổn định nền đường đắp hiện nay ở Việt Nam Comparison of embankment stability analysis methods in Viet Nam Trương Hồng

More information

Thỏa Thuận về Công Nghệ của UPS

Thỏa Thuận về Công Nghệ của UPS Thỏa Thuận về Công Nghệ của UPS Các Điều Khoản và Điều Kiện Tổng Quát Các Quyền của Người Dùng Cuối THỎA THUẬN VỀ CÔNG NGHỆ CỦA UPS Phiên bản UTA 07012017 (UPS.COM) XIN VUI LÒNG ĐỌC KỸ CÁC ĐIỀU KHOẢN VÀ

More information

ĐIỀU KHIỂN ROBOT DÒ ĐƯỜNG SỬ DỤNG BỘ ĐIỀU KHIỂN PID KẾT HỢP PHƯƠNG PHÁP PWM

ĐIỀU KHIỂN ROBOT DÒ ĐƯỜNG SỬ DỤNG BỘ ĐIỀU KHIỂN PID KẾT HỢP PHƯƠNG PHÁP PWM ĐIỀU KHIỂN ROBOT DÒ ĐƯỜNG SỬ DỤNG BỘ ĐIỀU KHIỂN PID KẾT HỢP PHƯƠNG PHÁP PWM TÓM TẮT Line Following Robot Control by Using PID Algorithm Combined with PWM Method TRẦN QUỐC CƯỜNG 1 TRẦN THANH PHONG 2 Bài

More information

BÀI TẬP DỰ ÁN ĐÂU TƯ (Học kỳ 3. Năm )

BÀI TẬP DỰ ÁN ĐÂU TƯ (Học kỳ 3. Năm ) BÀI TẬP DỰ ÁN ĐÂU TƯ (Học kỳ 3. Năm 2012-2013) Câu 1: Ông A gởi tiết kiệm 350 triệu đồng, thời hạn 3 năm. Hỏi đến khi đáo hạn, ông A nhận được bao nhiêu tiền ứng với ba tình huống sau đây? a. Ngân hàng

More information

2.1.3 Bảng mã ASCII Bộ vi xử lý (Central Processing Unit, CPU) Thanh ghi... 16

2.1.3 Bảng mã ASCII Bộ vi xử lý (Central Processing Unit, CPU) Thanh ghi... 16 Nghệ thuật tận dụng lỗi phần mềm Nguyễn Thành Nam Ngày 28 tháng 2 năm 2009 2 Mục lục 1 Giới thiệu 7 1.1 Cấu trúc tài liệu........................... 7 1.2 Làm sao để sử dụng hiệu quả tài liệu này.............

More information

AT INTERCONTINENTAL HANOI WESTLAKE 1

AT INTERCONTINENTAL HANOI WESTLAKE 1 AT INTERCONTINENTAL HANOI WESTLAKE 1 SUNSET BAR 2 8th December: Christmas Market 13th December: Vinoteca night under the stars 17th December - 2nd January: Special edition festive drink menu 3 MILAN 5

More information

DANH SÁCH THÍ SINH DỰ THI IC3 IC3 REGISTRATION FORM

DANH SÁCH THÍ SINH DỰ THI IC3 IC3 REGISTRATION FORM Tiếng Anh Tiếng Việt Đã có Chưa có Sáng Chiều Tên cơ quan/ tổ chức: Organization: Loại hình (đánh dấu ): Type of Organization: Địa chỉ /Address : Điện thoại /Tel: DANH SÁCH THÍ SINH DỰ THI IC3 IC3 REGISTRATION

More information

Ths. Nguyễn Tăng Thanh Bình, Tomohide Takeyama, Masaki Kitazume

Ths. Nguyễn Tăng Thanh Bình, Tomohide Takeyama, Masaki Kitazume THÍ NGHIỆM LY TÂM CHO PHÁ HOẠI NGOÀI CỦA CỌC ĐẤT TRỘN SÂU GIA CƯỜNG BẰNG TRỘN NÔNG CENTRIFUGE MODEL TEST ON EFFECT OF SHALLOW MIXING REINFORCING DEEP MIXING COLUMNS: EXTERNAL FAILURE Ths. Nguyễn Tăng Thanh

More information

Register your product and get support at. POS9002 series Hướng dẫn sử dụng 55POS9002

Register your product and get support at. POS9002 series   Hướng dẫn sử dụng 55POS9002 Register your product and get support at POS9002 series www.philips.com/tvsupport Hướng dẫn sử dụng 55POS9002 Nội dung 1 Thiết lập 4 9 Internet 37 1.1 1.2 1.3 1.4 1.5 9.1 Khởi động Internet 37 9.2 Tùy

More information

NGHIÊN CỨU ĐẶC ĐIỂM BIẾN ĐỘNG DÒNG CHẢY VÙNG VEN BIỂN HẢI PHÒNG

NGHIÊN CỨU ĐẶC ĐIỂM BIẾN ĐỘNG DÒNG CHẢY VÙNG VEN BIỂN HẢI PHÒNG JOURNAL OF SCIENCE OF HAIPHONG UNIVERSITY Vol.1, No 2, pp. 86-95 NGHIÊN CỨU ĐẶC ĐIỂM BIẾN ĐỘNG DÒNG CHẢY VÙNG VEN BIỂN HẢI PHÒNG Ths. Vũ Duy Vĩnh Viện Tài nguyên và Môi trường biển, 246 Đà Nẵng- Ngô Quyền,

More information

ĐÁNH GIÁ ẢNH HƯỞNG CỦA CHIỀU RỘNG TẤM ĐẾN BIẾN DẠNG GÓC KHI HÀN TẤM TÔN BAO VỎ TÀU THỦY

ĐÁNH GIÁ ẢNH HƯỞNG CỦA CHIỀU RỘNG TẤM ĐẾN BIẾN DẠNG GÓC KHI HÀN TẤM TÔN BAO VỎ TÀU THỦY THOÂNG BAÙO KHOA HOÏC ĐÁNH GIÁ ẢNH HƯỞNG CỦA CHIỀU RỘNG TẤM ĐẾN BIẾN DẠNG GÓC KHI HÀN TẤM TÔN BAO VỎ TÀU THỦY THE ASSESSMENT EFFECT ON THE BREADTH OF PLATE TO AN ANGULAR DISTORTION WHILE WELDING OF SHIP

More information

GIỚI THIỆU. Nguồn: Nguồn:

GIỚI THIỆU. Nguồn: Nguồn: 1-1 1-2 1-3 1 1-4 GIỚI THIỆU 1-5 Nguồn: http://vneconomy.vn 1-6 Nguồn: http://vneconomy.vn 2 1-7 Nguồn: http://vneconomy.vn 1-8 1-9 3 1-10 1-11 1-12 4 1-13 MẪU & TỔNG THỂ Samples and Populations 1-14 Tổng

More information

Thông Tin Dành Cho Gia Đình và Bệnh Nhân. Mụn Trứng Cá. Nguyên nhân gây ra mụn trứng cá là gì? Các loại khác nhau của mụn trứng cá là gì?

Thông Tin Dành Cho Gia Đình và Bệnh Nhân. Mụn Trứng Cá. Nguyên nhân gây ra mụn trứng cá là gì? Các loại khác nhau của mụn trứng cá là gì? Thông Tin Dành Cho Gia Đình và Bệnh Nhân Mụn Trứng Cá Bản tin này sẽ giúp quý vị hiểu được tại sao mọi người lại bị mụn trứng cá và làm thế nào để điều trị. Nguyên nhân gây ra mụn trứng cá là gì? Có một

More information

Thiết bị quang~ Bởi: Khoa CNTT ĐHSP KT Hưng Yên

Thiết bị quang~ Bởi: Khoa CNTT ĐHSP KT Hưng Yên Thiết bị quang~ Bởi: Khoa CNTT ĐHSP KT Hưng Yên Thiết bị quang Ngày nay đĩa quang được sử dụng rất phổ biến, chúng có mật độ ghi thông tin cao hơn đĩa từ thông thường rất nhiều. Ban đầu các đĩa quang được

More information

Những Điểm Chính. Federal Poverty Guidelines (Hướng dẫn Chuẩn Nghèo Liên bang) như được

Những Điểm Chính. Federal Poverty Guidelines (Hướng dẫn Chuẩn Nghèo Liên bang) như được Những Điểm Chính University Hospitals (UH) là một tổ chức từ thiện cung cấp sự chăm sóc cho các cá nhân bất kể khả năng chi trả của họ; tất cả các cá nhân được đối xử với sự tôn trọng, bất kể tình trạng

More information

Chương 17. Các mô hình hồi quy dữ liệu bảng

Chương 17. Các mô hình hồi quy dữ liệu bảng Chương 17 Các mô hình hồi quy dữ liệu bảng Domadar N. Gujarati (Econometrics by example, 2011). Người dịch và diễn giải: Phùng Thanh Bình, O.Y.T (16/12/2017) Các mô hình hồi quy đã được thảo luận trong

More information

Tiến hành Nghiên cứu tổng quan - Phương pháp và công cụ hỗ trợ

Tiến hành Nghiên cứu tổng quan - Phương pháp và công cụ hỗ trợ Tiến hành Nghiên cứu tổng quan - Phương pháp và công cụ hỗ trợ Phạm Quang Trí * Nghiên cứu tổng quan là một phần công việc quan trọng, cơ bản mà bất kỳ một nhà nghiên cứu nào cũng cần phải nắm vững và

More information

TRƢỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP.HCM

TRƢỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP.HCM TRƢỜNG ĐẠI HỌC BÁCH KHOA ĐẠI HỌC QUỐC GIA TP.HCM TRUNG TÂM KỸ THUẬT ĐIỆN TOÁN Tài liệu học tập MICROSOFT EXCEL 2010 LƢU HÀNH NỘI BỘ Chương 1: Tổng quan về Microsoft Excel 2010 Chƣơng 1 TỔNG QUAN VỀ MICROSOFT

More information

MỐI QUAN HỆ GIỮA ĐỘ THOÁNG KHÍ CỦA BAO BÌ BẢO QUẢN CHẤT LƯỢNG CỦA NHÃN XUỒNG CƠM VÀNG TRONG QUÁ TRÌNH TỒN TRỮ

MỐI QUAN HỆ GIỮA ĐỘ THOÁNG KHÍ CỦA BAO BÌ BẢO QUẢN CHẤT LƯỢNG CỦA NHÃN XUỒNG CƠM VÀNG TRONG QUÁ TRÌNH TỒN TRỮ MỐI QUAN HỆ GIỮA ĐỘ THOÁNG KHÍ CỦA BAO BÌ BẢO QUẢN CHẤT LƯỢNG CỦA NHÃN XUỒNG CƠM VÀNG TRONG QUÁ TRÌNH TỒN TRỮ Nguyễn Văn Phong, Nguyễn Khánh Ngọc I. ĐẶT VẤN ĐỀ Ở Việt Nam nhãn xuồng Cơm Vàng là cây ăn

More information

X-MAS GIFT 2017 // THE BODY SHOP

X-MAS GIFT 2017 // THE BODY SHOP X-MAS GIFT 2017 // THE BODY SHOP No PLU Name Image Price 1 77910 STRAWBERRY TREATS Trải nghiệm hương dâu thơm lừng trong không gian tắm với các sản phẩm: Strawberry Shower GeL 60ml Strawberry Softening

More information

MỞ ĐẦU... 1 CHƯƠNG I. TỔNG QUAN MỘT SỐ KHÁI NIỆM CƠ BẢN...

MỞ ĐẦU... 1 CHƯƠNG I. TỔNG QUAN MỘT SỐ KHÁI NIỆM CƠ BẢN... MỤC LỤC Trang MỞ ĐẦU... 1 CHƯƠNG I. TỔNG QUAN... 3 1.1. MỘT SỐ KHÁI NIỆM CƠ BẢN... 3 1.1.1. Xác nhận giá trị sử dụng của phương pháp... 3 1.1.. Độ tập trung... 3 1.1.3. Độ chính xác... 4 1.1.4. Giới hạn

More information

Bài giảng Kiến trúc của hệ vi xử lý

Bài giảng Kiến trúc của hệ vi xử lý Bài giảng Kiến trúc của hệ vi xử lý LỜI NÓI ĐẦU Các bộ vi xử lý ra đời đem lại bước ngoặt trong khoa học kỹ thuật, các thiết bị trở nên thông minh hơn nhờ sự điều khiển theo chương trình. Vi xử lý đang

More information

Bộ Kế hoạch & Đầu tư Sở Kế hoạch & Đầu tư Điện Biên

Bộ Kế hoạch & Đầu tư Sở Kế hoạch & Đầu tư Điện Biên Bộ Kế hoạch & Đầu tư Sở Kế hoạch & Đầu tư Điện Biên KIỂM TOÁN XÃ HỘI DỰA TRÊN QUYỀN TRẺ EM VỀ KẾ HOẠCH PHÁT TRIỂN KINH TẾ XÃ HỘI TỈNH ĐIỆN BIÊN Tháng 11 năm 2014 1. Giới thiệu chung... 9 2. Phương pháp

More information

BỘ THÔNG TIN VÀ TRUYỀN THÔNG TRUNG TÂM INTERNET VIỆT NAM TÀI LIỆU HƯỚNG DẪN TRIỂN KHAI DNSSEC TẠI CÁC NHÀ ĐĂNG KÝ TÊN MIỀN

BỘ THÔNG TIN VÀ TRUYỀN THÔNG TRUNG TÂM INTERNET VIỆT NAM TÀI LIỆU HƯỚNG DẪN TRIỂN KHAI DNSSEC TẠI CÁC NHÀ ĐĂNG KÝ TÊN MIỀN BỘ THÔNG TIN VÀ TRUYỀN THÔNG TRUNG TÂM INTERNET VIỆT NAM TÀI LIỆU HƯỚNG DẪN TRIỂN KHAI DNSSEC TẠI CÁC NHÀ ĐĂNG KÝ TÊN MIỀN Hà Nội, ngày 10 tháng 12 năm 2017 M C C DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT...

More information

Abstract. Recently, the statistical framework based on Hidden Markov Models (HMMs) plays an important role in the speech synthesis method.

Abstract. Recently, the statistical framework based on Hidden Markov Models (HMMs) plays an important role in the speech synthesis method. Tạp chí Tin học và Điều khiển học, T.29, S.1 (2013), 55 65 TRÍCH CHỌN CÁC THAM SỐ ĐẶC TRƯNG TIẾNG NÓI CHO HỆ THỐNG TỔNG HỢP TIẾNG VIỆT DỰA VÀO MÔ HÌNH MARKOV ẨN PHAN THANH SƠN, DƯƠNG TỬ CƯỜNG Học viện

More information

The W Gourmet mooncake gift sets are presently available at:

The W Gourmet mooncake gift sets are presently available at: MID-AUTUMN FESTIVAL 2015 Tết Trung thu trong tiềm thức của mỗi chúng ta luôn là ngày của những ký ức tuổi thơ tràn về, để rồi cứ nhớ tha thiết về ngày xưa ấy, có bánh nướng bánh dẻo, có cỗ đón trăng,

More information

CHẤT LƯỢNG MÔI TRƯỜNG NƯỚC BIỂN VEN BỜ ĐẢO PHÚ QUỐC

CHẤT LƯỢNG MÔI TRƯỜNG NƯỚC BIỂN VEN BỜ ĐẢO PHÚ QUỐC Tạp chí Khoa học và Công nghệ Biển; Tập 13, Số 3; 213: 289-297 ISSN: 1859-397 http://www.vjs.ac.vn/index.php/jmst CHẤT LƯỢNG MÔI TRƯỜNG NƯỚC BIỂN VEN BỜ ĐẢO PHÚ QUỐC Lê Thị Vinh Viện Hải dương học-viện

More information

SỬ DỤNG ENZYME -AMYLASE TRONG THỦY PHÂN TINH BỘT TỪ GẠO HUYẾT RỒNG

SỬ DỤNG ENZYME -AMYLASE TRONG THỦY PHÂN TINH BỘT TỪ GẠO HUYẾT RỒNG SỬ DỤNG ENZYME -AMYLASE TRONG THỦY PHÂN TINH BỘT TỪ GẠO HUYẾT RỒNG Dương Thị Ngọc Hạnh 1 và Nguyễn Minh Thủy 2 1 Học viên Cao học CNTP, Trường Đại học Cần Thơ 2 Khoa Nông nghiệp & Sinh học Ứng dụng, Trường

More information

Trịnh Minh Ngọc*, Nguyễn Thị Ngoan

Trịnh Minh Ngọc*, Nguyễn Thị Ngoan Tạp chí Khoa học: Khoa học Tự nhiên và Công nghệ, Tập 31, Số 3S (2015) 213-221 Xây dựng bản đồ tổn thương tài nguyên nước lưu vực sông Thạch Hãn tỉnh Quảng Trị Trịnh Minh Ngọc*, Nguyễn Thị Ngoan Trường

More information

Biên tập: Megan Dyson, Ger Bergkamp và John Scanlon

Biên tập: Megan Dyson, Ger Bergkamp và John Scanlon Biên tập: Megan Dyson, Ger Bergkamp và John Scanlon Việc quy định về các thực thể địa lý và trình bày các tư liệu trong ấn phẩm này không phản ánh bất cứ quan điểm nào của IUCN về tư cách pháp lý của bất

More information

Các phương pháp thống kê mô tả cho dữ liệu chéo

Các phương pháp thống kê mô tả cho dữ liệu chéo Các phương pháp thống kê mô tả cho dữ liệu chéo Hirschberg, Lu, and Lye (The Australian Economic Review, Vol. 38, No.3, 2005). Người dịch: Phùng Thanh Bình (8/9/2017) 1. Giới thiệu Phân tích kinh tế lượng

More information

Các tùy chọn của họ biến tần điều khiển vector CHV. Hướng dẫn vận hành card cấp nước.

Các tùy chọn của họ biến tần điều khiển vector CHV. Hướng dẫn vận hành card cấp nước. Các tùy chọn của họ biến tần điều khiển vector CHV Hướng dẫn vận hành card cấp nước. Mục lục 1. Model và đặc điểm kỹ thuật... 1 1.1 Mô tả Model:... 1 1.2 Hình dạng:... 1 1.3 Lắp đặt:... 1 2. Đặc tính

More information

TCVN 3890:2009 PHƯƠNG TIỆN PHÒNG CHÁY VÀ CHỮA CHÁY CHO NHÀ VÀ CÔNG TRÌNH TRANG BỊ, BỐ TRÍ, KIỂM TRA, BẢO DƯỠNG

TCVN 3890:2009 PHƯƠNG TIỆN PHÒNG CHÁY VÀ CHỮA CHÁY CHO NHÀ VÀ CÔNG TRÌNH TRANG BỊ, BỐ TRÍ, KIỂM TRA, BẢO DƯỠNG TCVN 3890:2009 PHƯƠNG TIỆN PHÒNG CHÁY VÀ CHỮA CHÁY CHO NHÀ VÀ CÔNG TRÌNH TRANG BỊ, BỐ TRÍ, KIỂM TRA, BẢO DƯỠNG TCVN 3890:2009 thay thế cho TCVN 3890:1984. TCVN 3890:2009 do Ban kỹ thuật tiêu chuẩn quốc

More information

Tạp chí Khoa học Trường Đại học Cần Thơ Số chuyên đề: Thủy sản (2014)(1):

Tạp chí Khoa học Trường Đại học Cần Thơ Số chuyên đề: Thủy sản (2014)(1): ẢNH HƯỞNG CỦA MÔI TRƯỜNG DINH DƯỠNG AGP, MẬT ĐỘ BAN ĐẦU, ĐỘ MẶN, CƯỜNG ĐỘ ÁNH SÁNG LÊN SỰ PHÁT TRIỂN CỦA VI TẢO Thalassiosira weissflogii VÀ THỬ NGHIỆM NUÔI THU SINH KHỐI Nguyễn Văn Công 1 và Nguyễn Kim

More information

Tng , , ,99

Tng , , ,99 XÂY DỰNG BẢN ĐỒ XÂM NHẬP MẶN PHỤC VỤ VIỆC LẤY NƯỚC TƯỚI CHO HỆ THỐNG SÔNG THUỘC TỈNH THÁI BÌNH TS. Nguyễn Thanh Hùng Phòng TNTĐQG về ĐLH sông Biển Tóm tắt: Thái Bình là một tỉnh ven biển, nằm ở phía Đông

More information

Đường thành phố tiểu bang zip code. Affordable Care Act/Covered California Tư nhân (nêu rõ): HMO/PPO (khoanh tròn)

Đường thành phố tiểu bang zip code. Affordable Care Act/Covered California Tư nhân (nêu rõ): HMO/PPO (khoanh tròn) ĐIỀU KIỆN: ĐƠN XIN HỖ TRỢ TÀI CHÍNH BCS cung cấp sự hỗ trợ cho những bệnh nhân đang chữa trị ung thư vú và gặp khó khăn về tài chính bởi vì công việc điều trị. Điều trị tích cực nghĩa là quý vị sắp tiến

More information

PHÁT TRIỂN ỨNG DỤNG WEB

PHÁT TRIỂN ỨNG DỤNG WEB Bài giảng PHÁT TRIỂN ỨNG DỤNG WEB Lê Đình Thanh Bộ môn Mạng và Truyền thông Máy tính Khoa Công nghệ Thông tin Trường Đại học Công nghệ, ĐHQGHN E-mail: thanhld@vnu.edu.vn, thanhld.vnuh@gmail.com Mobile:

More information

Để được hỗ trợ về sản phẩm, truy cập vào Đây là phiên bản trên Internet của xuất bản này. Chỉ in ra để sử dụng cá nhân.

Để được hỗ trợ về sản phẩm, truy cập vào  Đây là phiên bản trên Internet của xuất bản này. Chỉ in ra để sử dụng cá nhân. Cảm ơn bạn đã mua điện thoại Sony Ericsson W890i. Chiếc điện thoại mỏng manh, hợp thời trang được trang bị mọi thứ cần thiết để thưởng thức âm nhạc cho dù bạn đang ở đâu. Để có nội dung bổ sung cho điện

More information

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc Số: 02/2014/TT-BTTTT Hà Nội, ngày 10 tháng 3 năm 2014 THÔNG TƯ

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc Số: 02/2014/TT-BTTTT Hà Nội, ngày 10 tháng 3 năm 2014 THÔNG TƯ BỘ THÔNG TIN VÀ TRUYỀN THÔNG -------- CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc --------------- Số: 02/2014/TT-BTTTT Hà Nội, ngày 10 tháng 3 năm 2014 THÔNG TƯ BAN HÀNH QUY CHUẨN KỸ

More information

PHÂN TÍCH MÓNG CỌC CHỊU TẢI TRỌNG NGANG VÀ KỸ THUẬT LẬP MÔ HÌNH TƯƠNG TÁC CỌC-ĐẤT PHI TUYẾN

PHÂN TÍCH MÓNG CỌC CHỊU TẢI TRỌNG NGANG VÀ KỸ THUẬT LẬP MÔ HÌNH TƯƠNG TÁC CỌC-ĐẤT PHI TUYẾN Vol.03, No.01 Tạp chí Khoa học Kỹ thuật 11-2011 Journal of Science and Technology PHÂN TÍCH MÓNG CỌC CHỊU TẢI TRỌNG NGANG VÀ KỸ THUẬT LẬP MÔ HÌNH TƯƠNG TÁC CỌC-ĐẤT PHI TUYẾN PHẠM NGỌC THẠCH Khoa Công Trình

More information

CHƯƠNG VII HÌNH CẮT, MẶT CẮT VÀ KÍ HIỆU VẬT LIỆU

CHƯƠNG VII HÌNH CẮT, MẶT CẮT VÀ KÍ HIỆU VẬT LIỆU CHƯƠNG VII HÌNH CẮT, MẶT CẮT VÀ KÍ HIỆU VẬT LIỆU Các hình biểu diễn trên bản vẽ gồm có hình chiếu, hình cắt và mặt cắt. Nếu chỉ dùng các hình chiếu vuông góc thì chưa thể hiện hình dạng bên trong vảu một

More information

CÁC PHƯƠNG PHÁP PHÂN TÍCH THỐNG KÊ ĐA BIẾN SỐ LIỆU NGHIÊN CỨU LÂM NGHIỆP BẰNG SAS

CÁC PHƯƠNG PHÁP PHÂN TÍCH THỐNG KÊ ĐA BIẾN SỐ LIỆU NGHIÊN CỨU LÂM NGHIỆP BẰNG SAS CÁC PHƯƠNG PHÁP PHÂN TÍCH THỐNG KÊ ĐA BIẾN SỐ LIỆU NGHIÊN CỨU LÂM NGHIỆP BẰNG SAS Bùi Mạnh Hưng Trường Đại học Lâm nghiệp Lâm học TÓM TẮT Phân tích đa biến đã và đang chứng minh được nhiều ưu điểm nổi

More information

T I Ê U C H U Ẩ N Q U Ố C G I A TCVN 9386:2012. Xuất bản lần 1. Design of structures for earthquake resistances-

T I Ê U C H U Ẩ N Q U Ố C G I A TCVN 9386:2012. Xuất bản lần 1. Design of structures for earthquake resistances- T C V N T I Ê U C H U Ẩ N Q U Ố C G I A TCVN 9386:2012 Xuất bản lần 1 THIẾT KẾ CÔNG TRÌNH CHỊU ĐỘNG ĐẤT PHẦN 1: QUY ĐỊNH CHUNG, TÁC ĐỘNG ĐỘNG ĐẤT VÀ QUY ĐỊNH ĐỐI VỚI KẾT CẤU NHÀ PHẦN 2: NỀN MÓNG, TƯỜNG

More information

Ngôn ngữ lập trình Fortran 90 Phan Văn Tân

Ngôn ngữ lập trình Fortran 90 Phan Văn Tân 1 Ngôn ngữ lập trình Fortran 90 Phan Văn Tân NXB Đại học quốc gia Hà Nội 2005. Từ khoá: Ngôn ngữ lập trình Fortran, Kiểu dữ liệu, Kiểu ký tự, Cấu trúc câu lệnh, Kiểu logic, Lệnh vào giữ liệu, Lệnh xuất

More information

CHƯƠNG IV CÁC KĨ THUẬT HIỆU CHỈNH CƠ BẢN

CHƯƠNG IV CÁC KĨ THUẬT HIỆU CHỈNH CƠ BẢN CHƯƠNG IV CÁC KĨ THUẬT HIỆU CHỈNH CƠ BẢN Ðể hiệu chỉnh một đối tượng trong bản vẽ AutoCAD việc đầu tiên là ta chỉ định đối tượng nào cần hiệu chỉnh. AutoCAD trợ giúp cho chúng ta 1 bộ chỉ định đối tượng

More information

KẾT QUẢ CHỌN TẠO GIỐNG NGÔ NẾP LAI PHỤC VỤ CHO SẢN XUẤT Ở CÁC TỈNH PHÍA NAM

KẾT QUẢ CHỌN TẠO GIỐNG NGÔ NẾP LAI PHỤC VỤ CHO SẢN XUẤT Ở CÁC TỈNH PHÍA NAM KẾT QUẢ CHỌN TẠO GIỐNG NGÔ NẾP LAI PHỤC VỤ CHO SẢN UẤT Ở CÁC TỈNH PHÍA NAM TÓM TẮT Phạm Văn Ngọc, Nguyễn Thị Bích Chi, La Đức Vực Từ năm 2009 đến 2011, Trung tâm Hưng Lộc đã thu thập, lưu giữ và đánh giá

More information

Hướng dẫn GeoGebra. Bản chính thức 3.0

Hướng dẫn GeoGebra. Bản chính thức 3.0 Hướng dẫn GeoGebra Bản chính thức 3.0 Markus Hohenwarter và Judith Preiner www.geogebra.org, 06/2007 Trợ giúp GeoGebra Hiệu chỉnh lần cuối: Ngày 17/07/2007 Trang Web GeoGebra: www.geogebra.org Tác giả

More information

XÂY DỰNG GIẢN ĐỒ SỞ THÍCH SỬ DỤNG PHƯƠNG PHÁP FLASH PROFILE TRONG ĐÁNH GIÁ CHẤT LƯỢNG YAOURT TRÁI CÂY NHIỆT ĐỚI

XÂY DỰNG GIẢN ĐỒ SỞ THÍCH SỬ DỤNG PHƯƠNG PHÁP FLASH PROFILE TRONG ĐÁNH GIÁ CHẤT LƯỢNG YAOURT TRÁI CÂY NHIỆT ĐỚI XÂY DỰNG GIẢN ĐỒ SỞ THÍCH SỬ DỤNG PHƯƠNG PHÁP FLASH PROFILE TRONG ĐÁNH GIÁ CHẤT LƯỢNG YAOURT TRÁI CÂY NHIỆT ĐỚI Dương Thị Phượng Liên 1, Nguyễn Trần Thúy Ái 2 và Nguyễn Thị Thu Thủy 1 1 Khoa Nông nghiệp

More information

Hướng dẫn về Cung cấp thông tin liên quan đến đặc tính phát triển bền vững của sản phẩm

Hướng dẫn về Cung cấp thông tin liên quan đến đặc tính phát triển bền vững của sản phẩm 10YFP Chương trình thông tin cho Người tiêu dùng về Sản xuất và Tiêu dùng Bền vững (CI-SCP) Hướng dẫn về Cung cấp thông tin liên quan đến đặc tính phát triển bền vững của sản phẩm Hướng dẫn quốc tế về

More information

GS1 DataMatrix Giới thiệu và khái quát kỹ thuật về phương pháp mã hình tiên tiến nhất dùng cùng với các số phân định ứng dụng GS1.

GS1 DataMatrix Giới thiệu và khái quát kỹ thuật về phương pháp mã hình tiên tiến nhất dùng cùng với các số phân định ứng dụng GS1. GS1 DataMatrix Giới thiệu và khái quát kỹ thuật về phương pháp mã hình tiên tiến nhất dùng cùng với các số phân định ứng dụng GS1. Nguyên tắc chỉ đạo để xác định tiêu chuẩn ứng dụng dựa theo các nhu cầu

More information

Các dữ liệu của chuỗi thời gian đã và đang được sử dụng một cách thường xuyên và sâu rộng,

Các dữ liệu của chuỗi thời gian đã và đang được sử dụng một cách thường xuyên và sâu rộng, Kinh tế lượng cơ sở - 3rd ed. Phần V CHUỖI THỜI GIAN TRONG KINH TẾ LƯỢNG Các dữ liệu của chuỗi thời gian đã và đang được sử dụng một cách thường xuyên và sâu rộng, trong các nghiên cứu thực nghiệm, tới

More information

Nguyễn Thọ Sáo* Trường Đại học Khoa học Tự nhiên, ĐHQGHN, 334 Nguyễn Trãi, Hà Nội, Việt Nam. Nhận ngày 15 tháng 7 năm 2012

Nguyễn Thọ Sáo* Trường Đại học Khoa học Tự nhiên, ĐHQGHN, 334 Nguyễn Trãi, Hà Nội, Việt Nam. Nhận ngày 15 tháng 7 năm 2012 Tạp chí Khoa học ĐHQGHN, Khoa học Tự nhiên và Công nghệ 28, Số 3S (2012) 108-114 ế ảy Nguyễn Thọ Sáo* Trường Đại học Khoa học Tự nhiên, ĐHQGHN, 334 Nguyễn Trãi, Hà Nội, Việt Nam Nhận ngày 15 tháng 7 năm

More information

BẢN TIN THÁNG 05 NĂM 2017.

BẢN TIN THÁNG 05 NĂM 2017. BẢN TIN THÁNG 05 NĂM 2017. Nội dung I. THUẾ GIÁ TRỊ GIA TĂNG ( GTGT ) Công văn số 1637/TCT-CS ngày 25/4/2017 của Tổng cục Thuế về việc khấu trừ thuế GTGT đối với mua hàng trả chậm. Công văn số 1714/TCT-CS

More information

Ô NHIỄM ĐẤT, NƯỚC VÀ CÁC PHƯƠNG PHÁP XỬ LÝ

Ô NHIỄM ĐẤT, NƯỚC VÀ CÁC PHƯƠNG PHÁP XỬ LÝ Đại Học Quốc Gia TP.HCM Trường Đại Học Bách Khoa Khoa Kỹ thuật Đ a ch t D u h Vietnam National University HCMC Ho Chi Minh City University of Technology Faculty of Geology and Petroleum Engineering Đề

More information

BẢN TIN THÁNG 09 NĂM 2015

BẢN TIN THÁNG 09 NĂM 2015 BẢN TIN THÁNG 09 NĂM 2015 Nội dung I. THUẾ THU NHẬP DOANH NGHIỆP ( TNDN ) Công văn 9545/CT- TTHT về việc chi phí được trừ khi tính thuế TNDN đối với khoản chi vượt mức tiêu hao Công văn 6308/CT-TTHT xác

More information

Bạn có thể tham khảo nguồn tài liệu được dịch từ tiếng Anh tại đây: Thông tin liên hệ:

Bạn có thể tham khảo nguồn tài liệu được dịch từ tiếng Anh tại đây:   Thông tin liên hệ: Khi đọc qua tài liệu này, nếu phát hiện sai sót hoặc nội dung kém chất lượng xin hãy thông báo để chúng tôi sửa chữa hoặc thay thế bằng một tài liệu cùng chủ đề của tác giả khác. Bạn có thể tham khảo nguồn

More information

Ông ta là ai vậy? (3) Who is he? (3) (tiếp theo và hết)

Ông ta là ai vậy? (3) Who is he? (3) (tiếp theo và hết) Who is he? (3) Ông ta là ai vậy? (3) (tiếp theo và hết) Harland Sanders believed that his North Corbin restaurant would remain successful indefinitely, but at age 65 sold it after customer traffic reducing.

More information

Savor Mid-Autumn Treasures at Hilton Hanoi Opera! Gìn giữ nét đẹp cổ truyền

Savor Mid-Autumn Treasures at Hilton Hanoi Opera! Gìn giữ nét đẹp cổ truyền Gìn giữ nét đẹp cổ truyền Hilton tự hào là một trong những khách sạn đầu tiên làm bánh trung thu trong nhiều năm qua. Thiết kế hộp sang trọng và tinh tế, hương vị bánh tinh khiết và chọn lọc, bánh trung

More information

sự phát triển của ngành công nghiệp hỗ trợ ô tô Việt Nam

sự phát triển của ngành công nghiệp hỗ trợ ô tô Việt Nam Tạp chí Khoa học ĐHQGHN: Kinh tế và Kinh doanh, Tập 30, Số 4 (2014) 12-20 Ảnh hưởng của các chính sách tới sự phát triển của ngành công nghiệp hỗ trợ ô tô Việt Nam Nhâm Phong Tuân *, Trần Đức Hiệp ác Trường

More information

Chương1: CÁC THAO TÁC CƠ BẢN TRONG CORELDRAW

Chương1: CÁC THAO TÁC CƠ BẢN TRONG CORELDRAW Chương1: CÁC THAO TÁC CƠ BẢN TRONG CORELDRAW Trong chương 1 nhằm mục đích minh họa, giới thiệu đến các bạn sinh viên về những khái niệm cũng như những thao tác cơ bản trong chương trình CorelDRAW. Cụ thể

More information

CHỌN TẠO GIỐNG HOA LAN HUỆ (Hippeastrum sp.) CÁNH KÉP THÍCH NGHI TRONG ĐIỀU KIỆN MIỀN BẮC VIỆT NAM

CHỌN TẠO GIỐNG HOA LAN HUỆ (Hippeastrum sp.) CÁNH KÉP THÍCH NGHI TRONG ĐIỀU KIỆN MIỀN BẮC VIỆT NAM Vietnam J. Agri. Sci. 2016, Vol. 14, No. 4: 510-517 Tạp chí KH Nông nghiệp Việt Nam 2016, tập 14, số 4: 510-517 www.vnua.edu.vn CHỌN TẠO GIỐNG HOA LAN HUỆ (Hippeastrum sp.) CÁNH KÉP THÍCH NGHI TRONG ĐIỀU

More information

CHƯƠNG 4 BẢO VỆ QUÁ TRÌNH LÊNMEN

CHƯƠNG 4 BẢO VỆ QUÁ TRÌNH LÊNMEN CHƯƠNG 4 BẢO VỆ QUÁ TRÌNH LÊNMEN Hầu hết các quá trình lên men công nghiệp được tiến hành các nuôi cấy thuần khiết trong đó chỉ có các chủng chọn lọc được phép sinh trưởng. Nếu một cơ thể vi sinh vật ngoại

More information

ACBS Trade Pro. Hướng dẫn sử dụng

ACBS Trade Pro. Hướng dẫn sử dụng ACBS Trade Pro Hướng dẫn sử dụng Mục Lục A. Giao diện... 3 B. Thanh menu... 3 C. Thanh công cụ... 7 D. Thông tin thị trường... 9 1. Thông tin cổ phiếu đầy đủ... 9 2. Thông tin cổ phiếu đơn giản... 13 3.

More information

Ghi danh Bỏ phiếu tại Tiểu bang của quý vị bằng cách sử dụng Cẩm nang Hướng dẫn và Mẫu đơn dạng Bưu thiệp này

Ghi danh Bỏ phiếu tại Tiểu bang của quý vị bằng cách sử dụng Cẩm nang Hướng dẫn và Mẫu đơn dạng Bưu thiệp này Ghi danh Bỏ phiếu tại Tiểu bang của quý vị bằng cách sử dụng Cẩm nang Hướng dẫn và Mẫu đơn dạng Bưu thiệp này Dành cho các Công dân Hoa Kỳ Các Hướng dẫn Tổng quát Ai Có thể Sử dụng Đơn này Nếu quý vị là

More information

khu vực Vịnh Nha Trang

khu vực Vịnh Nha Trang Tạp chí Khoa học: Khoa học Tự nhiên và Công nghệ, Tập 31, Số 3S (2015) 172-185 Đặc trưng trường sóng và diễn biến đường bờ bãi tắm khu vực Vịnh Nha Trang Vũ Công Hữu 1, Nguyễn Kim Cương 1, Đinh Văn Ưu

More information

TIÊU CHUẨN QUỐC GIA TCVN : 2013 IEC : 2009

TIÊU CHUẨN QUỐC GIA TCVN : 2013 IEC : 2009 TIÊU CHUẨN QUỐC GIA TCVN 59351 : 2013 IEC 605021 : 2009 CÁP ĐIỆN CÓ CÁCH ĐIỆN DẠNG ĐÙN VÀ PHỤ KIỆN DÙNG CHO ĐIỆN ÁP DANH ĐỊNH TỪ 1kV (Um = 1,2kV) ĐẾN 30kV (Um = 36kV) PHẦN 1: CÁP DÙNG CHO ĐIỆN ÁP DANH

More information

MICROMASTER kw 11 kw

MICROMASTER kw 11 kw 0.12 kw 11 kw Hướng dẫn vận hành Tháng 04/04 Tài liệu cho người lắp máy Cảnh báo, Lưu ý và Chú ý Tháng 07/04 Cảnh báo, lưu ý và chú ý Các cảnh báo, lưu ý và chú ý được đưa ra để đảm bảo an toàn cho người

More information