Trong trò chơi đang thực hiện, ta dự định cho sao biển di chuyển ngẫu nhiên mỗi khi được bấm trúng (xem như người chơi nhặt được sao biển và một sao biển khác xuất hiện tại vị trí bất kỳ). Muốn vậy, trong hàm onClipEvent(mouseDown) của sao biển, bạn gán trị ngẫu nhiên cho hoành độ _x và tung độ _y của sao biển. Nhưng trước tiên bạn cần làm quen với hàm tính trị ngẫu nhiên random() trong lớp Math.
Bạn bấm chọn sao biển, mở bảng Actions – MovieClip để xem lại chương trình của sao biển và ghi thêm câu lệnh hiển thị trị ngẫu nhiên do hàm Math.random() cung cấp:
1 2 3 4 5 6 7 8 9 10 11 12 13 | onClipEvent(mouseDown) { if (hitTest(_root._xmouse, _root._ymouse, true )) { trace( "Trị ngẫu nhiên: " + Math.random()); score++; trace( "Điểm: " + score); } } |
Thử chạy chương trình, bạn thấy mỗi khi bấm trúng sao biển, sao biển thông báo một trị ngẫu nhiên ở bảng Output. Bấm sao biển nhiều lần, bạn sẽ nhận ra trị ngẫu nhiên trả về bởi hàm Math.random() luôn nhỏ hơn 1. Nói chính xác, hàm Math.random() cho ta trị ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 1. Muốn thu được trị ngẫu nhiên trong khoảng tùy ý, ta phải “phóng lớn” trị trả về của hàm Math.random().
Để cho rõ ràng, ta viết một hàm mới để tính trị ngẫu nhiên trong khoảng tùy ý và dùng hàm đó trong hàm onClipEvent(mouseDown) của sao biển. Chương trình của sao biển chỉ chấp nhận các hàm xử lý tình huống nên bạn phải viết hàm cần thiết ở chỗ khác.
Bấm vào chỗ trống trên sân khấu, bạn thấy chương trình của sao biển biến mất. Bảng Actions – Frame trước mắt bạn dùng để lập trình cho khung đầu tiên (hình 1). Bạn viết hàm tính trị ngẫu nhiên “ngon lành” hơn, gọi là getRandom(min, max), như sau:
1 2 3 4 5 6 7 8 9 10 11 | function getRandom(min, max) { var num = Math.random(); num = num * (max - min); num = num + min; return num; } |
Hàm getRandom(min, max) cho trị ngẫu nhiên trong khoảng từ min đến max bằng cách nhân trị trả về của hàm Math.random() với khoảng cách giữa max và min, tức max – min, rồi cộng kết quả đó với min. Câu lệnh return num; làm cho hàm getRandom(min, max) trả về kết quả tính toán khi được gọi. Đây là lần đầu tiên bạn viết một hàm có trả về một trị số.
Ngoài ra, chắc bạn chú ý đến từ var trong câu lệnh var num = Math.random();. Câu lệnh này tạo ra biến (variable) mang tên num để chứa trị trả về bởi hàm Math.random(). Viết từ var khi tạo ra biến num, ta ngụ ý rằng biến num là biến được tạo ra tạm thời trong hàm getRandom(). Biến như vây gọi là biến cục bộ, được xóa khỏi bộ nhớ máy khi hàm getRandom() kết thúc công việc.
Bạn bấm vào sao biển để trở về với chương trình của sao biển trong bảng Actions -Movie Clip . Trong hàm onClipEvent(mouseDown), bạn gọi hàm getRandom() vừa viết để thử tính trị ngẫu nhiên từ 0 đến 400:
1 2 3 4 5 6 7 8 9 10 11 12 13 | onClipEvent(mouseDown) { if (hitTest(_root._xmouse, _root._ymouse, true )) { trace( "Trị ngẫu nhiên: " + _root.getRandom( 0 , 400 )); score++; trace( "Điểm: " + score); } } |
Có lẽ bạn thắc mắc: “Vì sao phải viết _root.getRandom(0, 400), thay vì viết đơn giản getRandom(0, 400)?”. Nếu bạn không dùng tham chiếu _root, khi xem xét chương trình của sao biển, Flash không biết rằng phải đọc hàm getRandom() ở khung 1 của thời tuyến chính, khác với thời tuyến được dùng bên trong thể hiện của nhân vật sao biển.
Thử chạy chương trình và bấm nhiều lần vào sao biển, bạn thấy rõ hàm getRandom() của ta cho trị ngẫu nhiên nhỏ hơn 400.
Để sao biển di chuyển khắp sân khấu, hoành độ _x của sao biển phải có trị bất kỳ nhỏ hơn chiều rộng sân khấu và tung độ _y phải có trị bất kỳ nhỏ hơn chiều cao sân khấu. Bấm vào chỗ trống trên sân khấu để thôi chọn sao biển, bạn thấy lại chương trình ở thời tuyến chính. Bạn chỉnh sửa và bổ sung để có nội dung như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function getRandomX() { return getRandom( 0 , 550 ); } function getRandomY() { return getRandom( 0 , 400 ); } function getRandom(min, max) { return Math.random()*(max - min) + min; } |
Như bạn thấy, ta định nghĩa thêm hai hàm mới: getRandomX() và getRandomY().
Hàm getRandomX() dùng để tạo ra trị ngẫu nhiên lớn hơn hoặc bằng 0 và nhỏ hơn 550. Trong đó, 550 là chiều rộng mặc định của sân khấu. Hàm getRandomX() thích hợp cho việc tạo ra hoành độ ngẫu nhiên bao quát chiều rộng sân khấu. Hàm getRandomX() không làm gì nhiều, chỉ dựa hoàn toàn vào tính toán của hàm getRandom(min, max). Chiều cao mặc định của sân khấu là 400, do vậy bạn hiểu ngay hàm getRandomY() được viết ra để dùng vào việc gì.
Ngoài ra, vì bạn đã hiểu cách tính toán của hàm getRandom(min, max), ta viết lại nội dung của hàm đó ở dạng gọn hơn, có ý nghĩa tương đương.
Chuyển qua chương trình của sao biển (bấm vào sao biển), bạn chỉnh sửa như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | onClipEvent(mouseDown) { if (hitTest(_root._xmouse, _root._ymouse, true )) { _x = _root.getRandomX(); _y = _root.getRandomY(); score++; trace( "Điểm: " + score); } } |
Thử chạy chương trình, bạn thấy lần này sao biển thực sự di chuyển ngẫu nhiên mỗi khi được bấm trúng.
0 nhận xét:
Đăng nhận xét