[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:01.14,0:00:01.77,Default,,0000,0000,0000,,Chúng ta cùng tiếp tục khám phá Dialogue: 0,0:00:01.77,0:00:04.09,Default,,0000,0000,0000,,công dụng của đối tượng. Dialogue: 0,0:00:04.09,0:00:05.100,Default,,0000,0000,0000,,Ta sẽ quay lại với chương trình đã sử dụng Dialogue: 0,0:00:05.100,0:00:07.78,Default,,0000,0000,0000,,trong bài hướng dẫn về các hàm. Dialogue: 0,0:00:07.78,0:00:10.61,Default,,0000,0000,0000,,Chương trình này chứa hàm drawWinston Dialogue: 0,0:00:10.61,0:00:12.22,Default,,0000,0000,0000,,có khả năng vẽ Winston, Dialogue: 0,0:00:12.22,0:00:14.61,Default,,0000,0000,0000,,và chứa một cặp x và y nhất định. Dialogue: 0,0:00:14.61,0:00:17.54,Default,,0000,0000,0000,,Ở dưới đây, ta gọi hàm drawWinston 4 lần. Dialogue: 0,0:00:17.54,0:00:20.73,Default,,0000,0000,0000,,Mỗi lần gọi với một cặp tọa độ x và y khác nhau. Dialogue: 0,0:00:20.73,0:00:22.83,Default,,0000,0000,0000,,Các bạn biết tôi mà. Dialogue: 0,0:00:22.83,0:00:25.49,Default,,0000,0000,0000,,Khi tôi nhìn vào 4 lần gọi drawWinston Dialogue: 0,0:00:25.49,0:00:27.54,Default,,0000,0000,0000,,gần giống hệt nhau này, Dialogue: 0,0:00:27.54,0:00:30.79,Default,,0000,0000,0000,,tất cả những gì tôi có thể nghĩ ra là sẽ tốt hơn bao nhiêu Dialogue: 0,0:00:30.79,0:00:32.36,Default,,0000,0000,0000,,nếu ta sử dụng vòng lặp Dialogue: 0,0:00:32.36,0:00:35.63,Default,,0000,0000,0000,,và chỉ cần gọi một lần trong vòng lặp, Dialogue: 0,0:00:35.63,0:00:39.32,Default,,0000,0000,0000,,thay đổi x và y cho mỗi lần lặp. Dialogue: 0,0:00:39.32,0:00:41.70,Default,,0000,0000,0000,,Để làm được điều đó, ta phải tìm cách Dialogue: 0,0:00:41.70,0:00:45.05,Default,,0000,0000,0000,,lưu trữ các tọa độ x và y này trong một mảng Dialogue: 0,0:00:45.05,0:00:47.07,Default,,0000,0000,0000,,để có thể lặp được. Dialogue: 0,0:00:47.07,0:00:49.10,Default,,0000,0000,0000,,Vậy với bộ giá trị này, Dialogue: 0,0:00:49.10,0:00:51.62,Default,,0000,0000,0000,,ta có thể tạo 2 mảng: Dialogue: 0,0:00:52.50,0:00:55.88,Default,,0000,0000,0000,,một mảng cho x, và một mảng cho y. Dialogue: 0,0:00:55.88,0:00:59.59,Default,,0000,0000,0000,,Như vậy xPostitions, ta có thể có 99, 294, Dialogue: 0,0:00:59.59,0:01:01.90,Default,,0000,0000,0000,,101, và 294. Dialogue: 0,0:01:01.90,0:01:06.90,Default,,0000,0000,0000,,Còn yPositions, ta sẽ có 117, 117, Dialogue: 0,0:01:07.04,0:01:08.99,Default,,0000,0000,0000,,316, 316. Dialogue: 0,0:01:08.99,0:01:11.43,Default,,0000,0000,0000,,Được rồi, bây giờ ta có thể lặp qua những tọa độ đó Dialogue: 0,0:01:11.43,0:01:14.03,Default,,0000,0000,0000,,với vòng lặp for, var i = 0, Dialogue: 0,0:01:14.03,0:01:18.20,Default,,0000,0000,0000,,i < xPositions.length, i++. Dialogue: 0,0:01:18.20,0:01:20.65,Default,,0000,0000,0000,,Như vậy ta sẽ lặp qua từng phần tử trong xPositions, Dialogue: 0,0:01:20.65,0:01:22.99,Default,,0000,0000,0000,,và ta nhập drawWinston, Dialogue: 0,0:01:22.99,0:01:26.34,Default,,0000,0000,0000,,xPositions[i]s, Dialogue: 0,0:01:26.34,0:01:29.39,Default,,0000,0000,0000,,và yPositions[i]. Dialogue: 0,0:01:30.51,0:01:32.04,Default,,0000,0000,0000,,Được rồi. Dialogue: 0,0:01:32.04,0:01:33.84,Default,,0000,0000,0000,,Ta thử xóa xem có được không nhé. Dialogue: 0,0:01:33.84,0:01:35.48,Default,,0000,0000,0000,,Vậy là được rồi. Dialogue: 0,0:01:35.48,0:01:38.49,Default,,0000,0000,0000,,Bây giờ ta có thể gọi được, Dialogue: 0,0:01:38.49,0:01:40.14,Default,,0000,0000,0000,,chỉ với một dòng mã Dialogue: 0,0:01:40.14,0:01:41.37,Default,,0000,0000,0000,,chạy hàm drawWinston, nhưng mỗi lần chạy Dialogue: 0,0:01:41.37,0:01:44.48,Default,,0000,0000,0000,,với một vị trí khác nhau trong mảng xPositions. Dialogue: 0,0:01:44.48,0:01:46.96,Default,,0000,0000,0000,,Ta có thể tiếp tục thêm vào Dialogue: 0,0:01:46.96,0:01:49.85,Default,,0000,0000,0000,,bằng cách nhập 10 rồi cộng thêm 1, Dialogue: 0,0:01:49.85,0:01:52.63,Default,,0000,0000,0000,,rồi lại cộng thêm 1 và cộng thêm 1, Dialogue: 0,0:01:52.63,0:01:57.43,Default,,0000,0000,0000,,sau đó là 100 và 1. Dialogue: 0,0:01:58.40,0:02:01.42,Default,,0000,0000,0000,,Trông bắt đầu lộn xộn rồi, Dialogue: 0,0:02:01.42,0:02:04.55,Default,,0000,0000,0000,,tôi chẳng thích tí nào vì rất khó có thể Dialogue: 0,0:02:04.55,0:02:07.82,Default,,0000,0000,0000,,thấy x nào liên quan tới y nào. Dialogue: 0,0:02:08.94,0:02:12.52,Default,,0000,0000,0000,,Tôi muốn chỉ cần liếc qua Dialogue: 0,0:02:12.52,0:02:14.57,Default,,0000,0000,0000,,cũng biết mình đang nhìn vào cặp x, y nào. Dialogue: 0,0:02:14.57,0:02:16.21,Default,,0000,0000,0000,,Thay vì phải đảm bảo Dialogue: 0,0:02:16.21,0:02:18.53,Default,,0000,0000,0000,,sắp xếp chúng một cách hoàn hảo Dialogue: 0,0:02:18.53,0:02:20.55,Default,,0000,0000,0000,,như thế này. Dialogue: 0,0:02:22.26,0:02:26.36,Default,,0000,0000,0000,,Tôi muốn tìm cách khác để lưu trữ những tọa độ này. Dialogue: 0,0:02:26.36,0:02:30.40,Default,,0000,0000,0000,,Ta có thể lưu trữ chúng dưới dạng đối tượng Dialogue: 0,0:02:30.40,0:02:33.40,Default,,0000,0000,0000,,vì thử nghĩ mà xem, mỗi vị trí Dialogue: 0,0:02:33.40,0:02:35.84,Default,,0000,0000,0000,,lại chứa 2 thông tin cơ bản, x và y. Dialogue: 0,0:02:35.84,0:02:39.11,Default,,0000,0000,0000,,Vì vậy ta có thể có 2 đối tượng mang thuộc tính x và y. Dialogue: 0,0:02:39.11,0:02:41.63,Default,,0000,0000,0000,,Sau đó ta có thể tạo một mảng đối tượng Dialogue: 0,0:02:41.63,0:02:44.15,Default,,0000,0000,0000,,với những vị trí x, y này. Dialogue: 0,0:02:44.15,0:02:45.65,Default,,0000,0000,0000,,Ta cùng làm nhé. Dialogue: 0,0:02:45.65,0:02:48.82,Default,,0000,0000,0000,,Ta nhập var positions =, Dialogue: 0,0:02:48.82,0:02:51.26,Default,,0000,0000,0000,,đây cũng sẽ là một mảng, Dialogue: 0,0:02:51.26,0:02:54.02,Default,,0000,0000,0000,,nhưng mỗi phần tử, thay vì là một số, Dialogue: 0,0:02:54.02,0:02:55.75,Default,,0000,0000,0000,,sẽ là một đối tượng. Dialogue: 0,0:02:55.75,0:02:58.68,Default,,0000,0000,0000,,Ta có ngoặc nhọn, Dialogue: 0,0:02:58.68,0:03:01.92,Default,,0000,0000,0000,,sau đó ta sẽ nhập x 99, Dialogue: 0,0:03:01.92,0:03:04.52,Default,,0000,0000,0000,,y 117. Dialogue: 0,0:03:04.52,0:03:08.50,Default,,0000,0000,0000,,Được rồi, bây giờ ta đã có một trong các vị trí ở đây, Dialogue: 0,0:03:08.50,0:03:10.100,Default,,0000,0000,0000,,ta sẽ thêm một vị trí nữa, Dialogue: 0,0:03:10.100,0:03:13.84,Default,,0000,0000,0000,,và thêm một vị trí nữa. Dialogue: 0,0:03:13.84,0:03:18.60,Default,,0000,0000,0000,,Như vậy, x sẽ là 294, 117. Dialogue: 0,0:03:18.60,0:03:23.60,Default,,0000,0000,0000,,Xong, vị trí thứ ba sẽ là 101, 316. Dialogue: 0,0:03:25.28,0:03:29.18,Default,,0000,0000,0000,,Và cuối cùng là 294 Dialogue: 0,0:03:29.18,0:03:31.08,Default,,0000,0000,0000,,và 316. Dialogue: 0,0:03:31.08,0:03:34.74,Default,,0000,0000,0000,,Được rồi, bây giờ ta đã có một mảng đối tượng Dialogue: 0,0:03:34.74,0:03:37.51,Default,,0000,0000,0000,,trong đó mỗi đối tượng đều chứa thuộc tính x và y. Dialogue: 0,0:03:38.91,0:03:40.86,Default,,0000,0000,0000,,Ở dưới đây trong vòng lặp for, Dialogue: 0,0:03:40.86,0:03:44.04,Default,,0000,0000,0000,,ta sẽ chỉ thay đổi cái này để lặp qua positions.length, Dialogue: 0,0:03:44.04,0:03:48.26,Default,,0000,0000,0000,,sau đó ta sẽ đưa vào đối tượng. Dialogue: 0,0:03:48.26,0:03:51.76,Default,,0000,0000,0000,,Hiện tại, ta đang đưa vào toàn bộ đối tượng, Dialogue: 0,0:03:51.76,0:03:53.69,Default,,0000,0000,0000,,nhưng ta chỉ cần đưa vào x và y thôi, Dialogue: 0,0:03:53.69,0:03:58.69,Default,,0000,0000,0000,,vì vậy ta cần có positions[i].x và positions[i].y. Dialogue: 0,0:03:59.05,0:04:00.51,Default,,0000,0000,0000,,Ta-dah! Dialogue: 0,0:04:00.51,0:04:03.76,Default,,0000,0000,0000,,Bây giờ ta có thể xóa chỗ mảng cũ này rồi. Dialogue: 0,0:04:04.64,0:04:05.51,Default,,0000,0000,0000,,Tuyệt vời! Dialogue: 0,0:04:05.51,0:04:07.50,Default,,0000,0000,0000,,Tôi thấy đẹp hơn nhiều rồi đấy, Dialogue: 0,0:04:07.50,0:04:09.61,Default,,0000,0000,0000,,mã dễ đọc hơn nhiều nữa, Dialogue: 0,0:04:09.61,0:04:12.50,Default,,0000,0000,0000,,cứ có mã dễ đọc hơn là tốt rồi. Dialogue: 0,0:04:12.50,0:04:14.63,Default,,0000,0000,0000,,Và ta cũng có thể thêm thắt dễ dàng hơn nữa, Dialogue: 0,0:04:14.63,0:04:16.10,Default,,0000,0000,0000,,nếu tôi muốn thêm, Dialogue: 0,0:04:16.10,0:04:18.51,Default,,0000,0000,0000,,tôi sẽ thêm luôn một cặp vào đây, Dialogue: 0,0:04:18.51,0:04:22.82,Default,,0000,0000,0000,,ta có thể nhập x 200, y 200, Dialogue: 0,0:04:22.82,0:04:24.83,Default,,0000,0000,0000,,cho một Winston nho nhỏ vào giữa đây. Dialogue: 0,0:04:26.61,0:04:27.24,Default,,0000,0000,0000,,Xong. Dialogue: 0,0:04:27.24,0:04:30.87,Default,,0000,0000,0000,,Bây giờ tôi muốn cho các bạn xem một thứ còn hay ho hơn nữa. Dialogue: 0,0:04:30.87,0:04:34.25,Default,,0000,0000,0000,,Hãy chú ý cách hàm của chúng ta tiếp nhận Dialogue: 0,0:04:34.25,0:04:38.56,Default,,0000,0000,0000,,rồi sử dụng 2 số. Dialogue: 0,0:04:38.56,0:04:40.02,Default,,0000,0000,0000,,Ta có thể thay đổi hàm Dialogue: 0,0:04:40.02,0:04:42.13,Default,,0000,0000,0000,,để nó tiếp nhận đối tượng, Dialogue: 0,0:04:42.13,0:04:44.73,Default,,0000,0000,0000,,rồi ta lấy x và y từ đối tượng đó. Dialogue: 0,0:04:44.73,0:04:49.10,Default,,0000,0000,0000,,Điều đó có nghĩa là ta có thể đưa vào đối tượng ở dưới đây. Dialogue: 0,0:04:49.10,0:04:50.48,Default,,0000,0000,0000,,Ta cùng thử nhé. Dialogue: 0,0:04:50.48,0:04:53.50,Default,,0000,0000,0000,,Ta đưa vào một đối tượng, nó hỏng rồi. Dialogue: 0,0:04:53.50,0:04:57.40,Default,,0000,0000,0000,,Đó là bởi hàm của ta cần 2 đối tượng, Dialogue: 0,0:04:57.40,0:04:58.62,Default,,0000,0000,0000,,mà ta lại chỉ đưa vào 1. Dialogue: 0,0:04:58.62,0:05:01.69,Default,,0000,0000,0000,,Vì thế ta sẽ đổi thành facePosition. Dialogue: 0,0:05:01.69,0:05:05.98,Default,,0000,0000,0000,,Bây giờ ta lại nhận được một lỗi có nội dung faceX is not defined Dialogue: 0,0:05:05.98,0:05:10.08,Default,,0000,0000,0000,,vì trước đó, ta đưa vào faceX dưới dạng đối số Dialogue: 0,0:05:10.08,0:05:11.58,Default,,0000,0000,0000,,nhưng lúc này nó không tồn tại. Dialogue: 0,0:05:11.58,0:05:13.76,Default,,0000,0000,0000,,Ta chỉ đang đưa vào một đối tượng, vì vậy ta có thể Dialogue: 0,0:05:13.76,0:05:18.34,Default,,0000,0000,0000,,lưu vị trí x Dialogue: 0,0:05:18.34,0:05:21.18,Default,,0000,0000,0000,,từ một đối tượng trong biến faceX, Dialogue: 0,0:05:21.18,0:05:22.52,Default,,0000,0000,0000,,và ta nghĩ, “Được rồi, mình có đối tượng này. Dialogue: 0,0:05:22.52,0:05:24.54,Default,,0000,0000,0000,,Mình biết đối tượng này có thuộc tính x, Dialogue: 0,0:05:24.54,0:05:27.64,Default,,0000,0000,0000,,vì vậy mình sẽ lưu nó vào biến faceX.” Dialogue: 0,0:05:27.64,0:05:30.10,Default,,0000,0000,0000,,Sau đó ta có thể thực hiện tương tự với y, Dialogue: 0,0:05:30.10,0:05:33.49,Default,,0000,0000,0000,,như vậy faceY = facePosition.y. Dialogue: 0,0:05:33.49,0:05:34.28,Default,,0000,0000,0000,,Ta-dah! Dialogue: 0,0:05:34.28,0:05:37.84,Default,,0000,0000,0000,,Và cuối cùng là phần còn lại của hàm sử dụng faceX và faceY. Dialogue: 0,0:05:37.84,0:05:39.81,Default,,0000,0000,0000,,Bây giờ ta phải đảm bảo đã nhập đúng chính tả. Dialogue: 0,0:05:39.81,0:05:41.74,Default,,0000,0000,0000,,Nếu nhập xx, chương trình sẽ không hoạt động Dialogue: 0,0:05:41.74,0:05:44.03,Default,,0000,0000,0000,,vì đó không phải thứ trong mảng đối tượng Dialogue: 0,0:05:44.03,0:05:46.21,Default,,0000,0000,0000,,mà ta đã đưa vào, Dialogue: 0,0:05:46.21,0:05:48.06,Default,,0000,0000,0000,,vì vậy ta phải nhập thật chính xác. Dialogue: 0,0:05:48.06,0:05:50.09,Default,,0000,0000,0000,,NBây giờ khá gọn gàng rồi đấy, Dialogue: 0,0:05:50.09,0:05:51.77,Default,,0000,0000,0000,,ta có thể có mảng đối tượng, Dialogue: 0,0:05:51.77,0:05:53.62,Default,,0000,0000,0000,,có các hàm nhận đối tượng, Dialogue: 0,0:05:53.62,0:05:56.63,Default,,0000,0000,0000,,và các bạn sẽ thấy rằng chương trình của chúng ta Dialogue: 0,0:05:56.63,0:05:58.62,Default,,0000,0000,0000,,sẽ rất hiệu quả với lối Dialogue: 0,0:05:58.62,0:06:00.27,Default,,0000,0000,0000,,cấu trúc dữ liệu này. Dialogue: 0,0:06:00.27,0:06:02.01,Default,,0000,0000,0000,,Ngoài ra vì ta thường muốn Dialogue: 0,0:06:02.01,0:06:04.82,Default,,0000,0000,0000,,ghép cặp x và y với nhau, tôi nghĩ các bạn sẽ thấy Dialogue: 0,0:06:04.82,0:06:07.22,Default,,0000,0000,0000,,chúng đặc biệt hữu ích cho tất cả Dialogue: 0,0:06:07.22,0:06:08.86,Default,,0000,0000,0000,,những chương trình liên quan đến vẽ và hoạt họa. Dialogue: 0,0:06:08.86,0:00:00.00,Default,,0000,0000,0000,,Chúc các bạn vui vẻ.