Đằng sau hệ thống đường đạn mới của LMHT
Chào mừng các bạn, Brian “Penrif” Bossé sẽ trò chuyện với các bạn về một vài cơ sở kỹ thuật của đường đạn. Chúng tôi đã đưa ra nhiều thay đổi về đường đạn trong vài tháng qua (đã được nhắc đến trong các bản cập nhật gần đây). Nếu chúng tôi làm tốt, các bạn không thể nhận ra những thay đổi đó trong khi chơi. Cho dù vậy, chúng tôi vẫn rất háo hức được tiết lộ điều này, và tôi muốn chia sẻ nhiều điều ẩn sâu hơn đằng sau nó.
Hệ thống đường đạn cũ là cả một đống lộn xộn và gần như không thể làm gì trên đó, trong khi cái mới này cho phép chúng tôi thực hiện dễ dàng những thứ như thế này:
Không phải chúng tôi định làm Tán Xạ Tiễn của Ashe thành ra thế. Nó là thứ tôi chế ra trong hai giờ khi vừa uống thuốc giảm đau xong. Tôi chỉ muốn cho thấy những gì có thể làm với hệ thống mới mà không cần cố gắng nhiều, hay phải tập trung, hay phải đau đầu.
Đường đạn: Phức tạp đến kinh ngạc
Để các bạn hình dung về những gì chúng tôi đang làm, tôi sẽ cho các bạn thấy một biểu đồ thể hiện những luồng dữ liệu thực thi trong mỗi khung hình đối với đường đạn trong hệ thống cũ:
(Giống như nhạc điện tử – từ ngữ chẳng quan trọng gì đâu)
Dù không phức tạp như hệ thống dẫn hướng tên lửa thật, bản chất của những luồng dữ liệu rắc rối này khiến cho các thay đổi trở nên mạo hiểm. Nói ngắn gọn lại thì, những gì chúng ta đang thấy ở đây là một hệ thống các dạng đường đạn, mỗi cái là một tập hợp các đường đạn khác nhau. Các dạng khác nhau có thể có chức năng giống hoặc gần giống nhau — nhưng thường là rất hỗn loạn. Biểu đồ này sắp xếp các dạng đường đạn theo hàng ngang, các chức năng được đặt mã màu riêng. Ví dụ, nếu các bạn muốn biết đường đạn xử lý theo dấu va chạm thế nào, bạn phải xem xét tất cả những thứ có mã hồng—xuất hiện ở khắp nơi trong hình.
Ô trên cùng trong biểu đồ bao gồm những thứ chúng tôi gọi là “đường đạn cơ bản,” phần gốc trong hệ thống. Đây là những đường đạn đơn giản nhất: chúng bay tới một vị trí hoặc một đơn vị và chỉ kích hoạt khi kết thúc chuyển động. Các đòn đánh thường và trụ bắn nắm trong tập hợp này, cũng như những đường đạn của các kỹ năng như Q của Corki và R của Ziggs. Luồng dữ liệu khá đơn giản khi chúng theo dấu mục tiêu, rồi tính toán nơi đường đạn sẽ di chuyển tới, rồi kiểm tra xem chúng đã trúng mục tiêu. Dễ như ăn bánh.
Ô lớn tiếp theo trong biểu đồ bao gồm “đường đạn định tuyến,” là gần như tất cả những gì người chơi có thể gọi là kỹ năng định hướng – những thứ như Khóa Ánh Sáng của Lux, Tán Xạ Tiễn của Ashe, hay gần như mọi kỹ năng của Ezreal. Cũng có vài ngạc nhiên trong nhóm này như Tường Gió của Yasuo: nó là đường đạn định tuyến. Cũng có chút mỉa mai đấy chứ.
Đường đạn định tuyến có cách vận hành phức tạp hơn nhiều so với đường đạn cơ bản. Ví dụ, chúng có thể đánh trúng những thứ trên đường di chuyển, quay trở lại chỗ người sử dụng (như chiêu cuối của Draven), hay bám trên mặt đất (như Rễ Cây của Zyra). Xếp tất cả những thứ này vào một chỗ cũng quá đủ rồi, nhưng đường đạn định tuyến còn — của đường đạn cơ bản. Vì thế, đường đạn định tuyến thừa hưởng mọi chức năng của đường đạn cơ bản, nhưng sử dụng chúng theo một cách khác. Điều này đặt chúng tôi vào tình trạng khó khăn khi thay đổi đường đạn cơ bản mang lại nguy cơ phá vỡ đường đạn định tuyến theo những cách vô cùng phức tạp.
Các nhóm nhỏ ở dưới dành cho ba đường đạn vòng tròn của chúng tôi: Q và W của Diana, và W của Ahri. Chúng hoạt động rất giống với đường đạn định tuyến, nhưng di chuyển theo vòng tròn. Chúng cũng bắt nguồn từ đường đạn cơ bản và có sự tương tự đáng kinh ngạc với đường đạn định tuyến trong mọi thứ khác ngoài chuyển động. Trong khi làm biểu đồ này tôi phát hiện một số sửa lỗi cho đường đạn định tuyến chưa được áp dụng cho đường đạn vòng tròn. Các mã trùng lặp cũng gây ra các lỗi trùng lặp; đó là sự đau đầu mà ác quỷ cóp – dán gây ra
Một minh họa dễ hiểu cho luồng dữ liệu của hệ thống đường đạn này
Tóm lại, hệ thống đường đạn trong LMHT phức tạp một cách không cần thiết, rối tung từ bên trong, và khá là dễ gặp trục trặc. Vì đường đạn có một không gian thiết kế lớn trong game, rõ ràng là chúng tôi phải làm nó dễ sử dụng hơn.
Phương pháp chúng tôi dùng để đạt được điều này là phá hủy hệ thống và viết lại từ đầu. Đó là cách duy nhất để chắc chắn mọi thứ sẽ ổn.
Hoàn toàn sạch sẽ
Quá trình viết lại có bốn nguyên tắc trọng tâm:
- Chức năng giống nhau được đặt cùng nhau trong mã để dễ hiểu hơn.
- Sự phụ thuộc giữa các nhóm chức năng khác nhau phải là tối thiểu và rõ ràng.
- Dễ giải thích được về những gì đường đạn làm được nói chung.
- Các hoạt động đặc biệt của đường đạn phải được tách biệt hẳn khỏi quá trình chính.
Đội phát triển bắt đầu bằng việc xác định những vấn đề chính của đường đạn, và lên kế hoạch các thành phần để giải quyết các vấn đề đó một cách độc lập. Có vẻ như tôi thích lên danh sách mọi thứ, nên đây là một danh sách những gì đường đạn làm:
- Di chuyển: đạn đi qua các vị trí.
- Va chạm: đạn đánh trúng những thứ nó gặp.
- Theo dấu mục tiêu: đạn di chuyển tới những thứ có thể di chuyển tới.
- Tương tác với mã lệnh: người thiết kế sẽ vạch ra hành động cho các loại đạn.
- Nhìn thấy được: đạn được nhìn thấy bởi thứ này chứ không phải thứ khác.
- Hình ảnh và âm thanh: các bạn sẽ thấy và nghe được những gì đang diễn ra.
Chúng tôi bắt đầu việc viết lại với danh sách đó, thiết lập các thành phần cho mỗi thứ có thể xây dựng ngay hoặc thậm chí thay đổi giữa chừng. Hơn nữa, chúng tôi liên tục đánh giá lại những phần không phù hợp và thực hiện các điều chỉnh khi tính trừu tượng không còn phục vụ cho một mục đích nào nữa. Ví dụ, đưa logic theo dấu mục tiêu vào trong mã di chuyển khi thấy các mối liên hệ đã rất chặt chẽ, và đưa các mã lệnh vào nhóm đường đạn cơ bản chung khi thấy không cần phải phân biệt nó giữa các loại đường đạn khác nhau.
Cuối cùng, chúng tôi có một hệ thống trông như thế này:
Chúng tôi gọi biểu đồ đầu tiên là “bãi nôn màu cầu vồng,” còn cái này thì chỉ là cầu vồng thôi.
Cầu vồng là một vật liệu xây dựng tuyệt vời.
Điều này có ý nghĩa gì
Khi đi vào chi tiết, công việc này mang lại hai lợi ích chính. Đầu tiên, mã đường đạn không còn làm các lập trình viên phát sợ nữa, các lỗi có thể dễ dàng được tìm ra và sửa lại. Điều đó đã đem đến giải pháp cho một số lỗi từng được coi là không thể sửa được trong một thời gian dài.
Ví dụ, chúng tôi đã điên đầu với vài đoạn phim cho thấy đạn bắn xuyên qua mục tiêu của chúng. Trong một trường hợp rất hiếm, lỗi này tác động lớn đến trò chơi khi nó xảy ra. Vì không có cách nào dựng lại vấn đề và không có dấu hiệu nào cho thấy việc này sẽ dẫn đến đâu, điều duy nhất chúng tôi có thể làm là để nó lại phía sau và tiếp tục. Tuy nhiên, khi đem tất cả va chạm đường đạn gom vào một chỗ và sắp xếp gọn ghẽ, hai trường hợp có thể làm va chạm bị sai đã được phát hiện dễ dàng. Sau khi sửa lại, chúng tôi cực kỳ tự tin rằng đạn chắc chắn sẽ đánh trúng mục tiêu của nó.
Để tránh bị ăn tạ, tôi phải thừa nhận vẫn còn vài tình huống mà đạn bay xuyên qua một đơn vị. Nhưng tôi nghi rằng cái đó là do lỗi trong quá trình đồng bộ hóa vị trí của các đơn vị hơn là phát hiện va chạm của đường đạn.
Rất tốt khi các lập trình viên vui vẻ hơn và lỗi thì ít hơn, nhưng đối với chúng tôi, lợi ích to lớn hơn là có thể tạo ra những thứ mới với đường đạn nhanh hơn rất nhiều. Không cần phải thiết lập cả một lớp đường đạn mới để tạo ra một loại đạn chỉ di chuyển khác đi một chút, chúng tôi hoàn toàn tự do biến chúng thành đủ thứ điên rồ nhất có thể. Tôi sẽ cho các bạn vài ví dụ minh họa. Những cái này không phải là ý tưởng sản xuất: chúng chỉ là sản phẩm của những kỹ sư có chút thời gian rảnh và thích làm mấy chuyện vớ vẩn.
Chúng tôi khá vui khi biến đòn đánh thường thành một màn nhào lộn, trông cũng khá tốt với Draven đấy chứ
Và với một thay đổi nhỏ ở điểm xoáy trung tâm, Varus đã có thêm chút tình yêu
Lục giác là hình đẹp nhất
Hãy tiến lên và bắn mọi thứ đi \o/
Đội ngũ thực hiện:
- Brian “Riot Penrif” Bossé
- Anoop “Noopmoney” Kamboj
- Kevin “kbox” Borer
- Vasiliki “vLemon” Siakka
- Abe “Riot Meyea” Nguyen
- Jessica “Safelocked” Nam
- Richard “Riot Asyrite” Henkel
Các bức ảnh trong bài:
- Ảnh trộn bột của Jimmie
- Ảnh mì spaghetti của Jessica Spengler
- Ảnh cầu vòng của Steve Snodgrass
Theo LMHT
No comments:
Post a Comment