Bài 52: Lớp key
| Lớp Key [Hoàng Ngọc Giao] |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lớp Key giúp bạn theo dõi bàn phím trong chương trình của mình, giúp bạn biết được người dùng gõ phím nào. Mọi hàm của lớp Key đều là hàm tĩnh, vì vậy bạn không cần tạo ra đối tượng thuộc lớp Key khi muốn gọi hàm của lớp Key. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Để tìm hiểu các hàm của lớp Key, bạn hãy mở tập tin FLA mới, mở bảng Action - Frames của khung 1 và gõ vào đoạn mã như sau: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
this.onEnterFrame = function() { if(Key.isDown(65)) trace("Bạn ấn phím 'A'."); } |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Đoạn mã trên định nghĩa hàm xử lý tình huống onEnterFrame. Từ chốt this ở đây tương đương với từ chốt _root, nhằm chỉ sân khấu (thời tuyến chính của Flash). Mỗi khi Flash hiển thị khung mới, hàm onEnterFrame được gọi. Với tốc độ mặc định 12 fps (12 khung mỗi giây), cứ sau 1/12 giây hàm onEnterFrame lại được gọi. Hiện thời, tuy ta chỉ có một khung duy nhất, hàm onEnterFrame vẫn được gọi lặp đi lặp lại vào lúc chạy sau mỗi 1/12 giây. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bạn có thể viết đoạn mã trên theo cách tương đương: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
this.onEnterFrame = doEnterFrame; function doEnterFrame() { if(Key.isDown(65)) trace("Bạn ấn phím 'A'."); } |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| trong đó ta quy định hàm xử lý tình huống onEnterFrame là hàm doEnterFrame và nêu ra định nghĩa của hàm doEnterFrame. Khi hàm xử lý tình huống có nội dung khá dài, cách viết như vậy dễ đọc hơn. Nếu hàm xử lý tình huống có nội dung đơn giản, cách viết đầu tiên gọn gàng hơn. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thử chạy chương trình rồi gõ phím A, bạn thấy xuất hiện dòng chữ ở bảng Output: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bạn ấn phím 'A'. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Điều này chứng tỏ khi người dùng gõ phím A, chương trình nhận biết được ngay. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Nhìn vào nội dung hàm onEnterFrame, bạn hiểu ngay rằng mỗi khi Flash hiển thị khung mới, hàm Key.isDown được gọi. Ta trao cho hàm Key.isDown trị số 65. Đó là mã số tương ứng với phím A trên bàn phím. Nhờ vậy, khi phím A được ấn xuống, hàm Key.isDown trả về trị true. Nếu phím được ấn không phải là phím A, hàm Key.isDown trả về trị false. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Các phím mũi tên thường được dùng để điều khiển trò chơi. Bạn hãy viết thêm như sau vào chương trình hiện có để nhận biết khi nào người dùng ấn các phím mũi tên: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
this.onEnterFrame = function() { if(Key.isDown(65)) trace("Bạn ấn phím 'A'."); else if(Key.isDown(Key.UP)) trace("Bạn ấn phím mũi tên lên."); else if(Key.isDown(Key.DOWN)) trace("Bạn ấn phím mũi tên xuống."); else if(Key.isDown(Key.LEFT)) trace("Bạn ấn phím mũi tên trái."); else if(Key.isDown(Key.RIGHT)) trace("Bạn ấn phím mũi tên phải."); } |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thử chạy chương trình và lần lượt ấn các phím mũi tên, bạn thấy chương trình biết "vanh vách" bạn vừa ấn phím nào. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Trong đoạn mã vừa thêm, ta cũng dùng hàm Key.isDown để kiểm tra việc ấn phím. Thay vì ghi cụ thể mã số tương ứng với các phím mũi tên cho hàm Key.isDown, ta dùng các biến mang tên UP, DOWN, LEFT, RIGHT của lớp Key. Đó lần lượt là các biến chứa mã số của phím mũi tên lên, mũi tên xuống, mũi tên trái, mũi tên phải. Trị số của các biến như vậy thực ra không bao giờ thay đổi nên người ta gọi chúng là hằng (constant) của lớp. Rõ ràng, việc dùng các hằng như trên thuận tiện cho việc lập trình, giúp chương trình dễ đọc hơn. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bảng 1 trình bày các hằng của lớp Key để bạn tham khảo. Chúng ứng với các phím điều khiển của bàn phím. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bảng 1: Các hằng của lớp Key | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Đoạn mã bạn vừa viết để nhận biết phím được ấn thực ra chỉ thích hợp khi chương trình cần theo dõi một vài phím. Nếu cần theo dõi khoảng chục phím khác nhau chẳng hạn, việc dùng câu lệnh if else như vậy không thuận tiện lắm. Ngoài ra, việc kiểm tra phím được ấn trong từng thời khoảng 1/12 giây là không đủ nhanh. Có một cách khác giúp bạn kiểm tra phím được ấn trong từng thời khoảng rất ngắn, cỡ 1/1000 giây. Bạn hãy xóa chương trình hiện có và viết đoạn mã khác như sau: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
obj = new Object(); obj.onKeyDown = function() { trace("Bạn ấn phím gì dó."); } Key.addListener(obj); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Thử chạy chương trình và gõ phím bất kỳ, bạn nhận được thông báo chứng tỏ chương trình biết ngay bạn vừa gõ phím... gì đó. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Trong đoạn mã vừa viết, câu lệnh obj = new Object() nhằm tạo ra một đối tượng thuộc lớp Object. Mọi lớp trong ActionScript đều là lớp con (subclass) của lớp Object. Nói khác đi, mọi lớp đều thừa kế (inherit) từ lớp Object. Sau này ta sẽ tìm hiểu thêm về khái niệm thừa kế. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Tạo ra một đối tượng thuộc lớp Object nghĩa là tạo ra một đối tượng "chung chung". Ta chỉ dùng đối tượng này vào việc lắng nghe mọi "động tĩnh" từ bàn phím. Trong những chương trình thực tế, ta thường dùng một nhân vật cụ thể để lắng nghe bàn phím. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Trong đoạn mã vừa viết, ta quy định hàm xử lý tình huống onKeyDown của đối tượng obj, theo đó, mỗi khi có phím được ấn, thông báo "Bạn ấn phím gì đó" xuất hiện ngay trong bảng Output. Bạn có thể quy định hàm xử lý tình huống onKeyUp nếu muốn thực hiện việc gì đó khi người dùng thôi ấn phím. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sau việc quy định hàm xử lý tình huống onKeyDown của đối tượng obj, bạn còn phải thực hiện một bước nữa để hoàn thành thủ tục cần thiết. Câu lệnh Key.addListener(obj) nhằm "đăng ký" đối tượng obj với lớp Key, cho phép đối tượng obj lắng nghe bàn phím. Nếu muốn "rút phép" vào lúc nào đó, không cho đối tượng obj lắng nghe bàn phím nữa, bạn dùng câu lệnh Key.removeListener(obj). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Có lẽ bạn đang thắc mắc rằng "phím gì đó" được ấn là phím gì. Nếu không biết rõ phím nào được ấn thì đoạn mã vừa nêu chẳng có ích gì. Vâng, đúng là như vậy. Bạn hãy tiến thêm một bước bằng cách sửa chương trình như sau: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
obj = new Object(); obj.onKeyDown = function() { //trace("Bạn ấn phím gì dó."); trace("Bạn ấn phím " + Key.getCode()); } Key.addListener(obj); |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hàm getCode của lớp Key trả về mã số của phím vừa được ấn. Chạy chương trình và ấn thử vài phím, quả thực thông báo ở bảng Output cho bạn biết mã số của phím được ấn. |
Đỗ Thanh Dương @ 07:54 06/04/2012
Số lượt xem: 636
- Bài 51: Đối tượng String (05/04/12)
- Bài 50: LỚP VÀ ĐỐI TƯỢNG (05/04/12)
- Bài 49: Những chỉnh sửa cấp bách (05/04/12)
- Bài 48: Trò chơi tìm số giống nhau (05/04/12)
- Bài 47: Trình bày phân số (05/04/12)

Ý kiến trao đổi