Làm thế nào tôi nên kiểm tra nếu một người chơi đã hoàn thành một thành tích?


13

Tôi đang làm một game MMO và tôi đã đạt đến một điểm mà tôi cần phải thực hiện thành tích ... Làm thế nào để tôi làm điều đó? Điều thẳng thắn nhất cần làm là chạy cái này cứ sau 100ms ,:

for a in achievements
    for p in players
        if a.meetsRequirements(p) then p.completeAchievement(a)

Nhưng điều đó chỉ làm tăng thêm các biến chứng. Ví dụ, làm thế nào để tôi kiểm tra xem thành tích đã thực sự được hoàn thành chưa? Các cầu thủ có thuộc tính tùy chỉnh trên chính họ chỉ cho một thành tích cụ thể? Tôi đã làm điều này với các nhiệm vụ, bởi vì chúng chủ yếu là "thu thập 100 gỗ", vì vậy các nhiệm vụ tích cực trên một người chơi kiểm tra điều đó. Ngoài ra, phải có thời gian tốt hơn để kiểm tra nó, điều này sẽ định kỳ làm chậm máy chủ của tôi, tôi nghĩ vậy.


7
Tại sao không chạy kiểm tra thích hợp khi các hành động được thực hiện? Tức là nếu người dùng thu thập gỗ, hãy xem họ có phù hợp với đặc điểm kỹ thuật "thu thập 100 gỗ" không.
Mike Cluck

1
Điều đó có vẻ quá lộn xộn ... Sẽ có hàng tấn séc ở khắp mọi nơi. Tôi nghĩ rằng tôi sẽ tuân theo thuật toán trên bởi vì nó đơn giản ...
jcora

10
Có nhiều cách để làm cho nó bớt lộn xộn hơn: chẳng hạn như có một trình xử lý sự kiện "OnChange" sau đó gắn "đối tượng" thành tích vào đó và xử lý logic ở đó. Cũng hiểu rằng với thiết lập hiện tại của bạn, bạn có mức độ phức tạp O (n ^ 2), điều đó có nghĩa là trò chơi của bạn trở nên chậm hơn rất nhiều nhanh hơn với nhiều nhân vật hơn. Một loại vấn đề đối với MMO
Mike Cluck

Câu trả lời:


23

Những gì bạn làm phụ thuộc vào bản chất của thành tích. Trừ khi tất cả các thành tích của bạn phù hợp với một mẫu đơn giản (thu thập số X của Y), bạn sẽ phải xử lý chúng ở một mức độ nào đó.

Sử dụng một hệ thống giao tiếp dựa trên thông báo, bạn có thể cung cấp các móc nối làm cho mã hóa trường hợp đặc biệt được bản địa hóa. Bạn có thể có một số hành động nhất định nhắn tin cho người nghe tự đăng ký. Sau đó, mã / kịch bản thành tích của bạn chỉ có thể đăng ký chính nó với những người nghe thích hợp và làm bất cứ thử nghiệm nào là cần thiết để loại bỏ thành tích đó.

Bạn sẽ có thông điệp cho các sự kiện tiêu biểu mà bạn có thể muốn thành tích lắng nghe. Những thứ như "người chơi đã có được vật phẩm X" hoặc "thực thể Y đã giết thực thể Z". Bằng cách này, bạn có thể theo dõi những thứ như người chơi đã giết bao nhiêu Z.

Đó có lẽ là điều tốt nhất bạn có thể làm cho một hệ thống để đạt được thành tích. Nó tập trung mã càng nhiều càng tốt, và đặt trách nhiệm cho người nghe để phát hiện thành tích thực tế.

Ngoài ra, cần lưu ý rằng, đối với các hệ thống thành tích tập trung (X-Box Live, thành tích Steam), tiến trình hướng tới thành tích thường được lưu trữ trên máy chủ. Vì vậy, đối với thành tích tích lũy ("thực hiện nhiệm vụ số lần XY"), tập lệnh thành tích chỉ phát hiện khi X được thực hiện và làm giảm số lượng máy chủ. Đối với các loại thành tích khác ("thực hiện nhiệm vụ X"), thành tích máy chủ là nhị phân: hoặc bạn đã thực hiện hoặc bạn chưa làm.


+1 Đây là thông tin tuyệt vời. Thậm chí hữu ích mà không cần tôi phải thực hiện thành tích tại thời điểm này.
Joshua Hedges

Cảm ơn! Không thể chờ đợi để thực hiện điều này, tôi ước mình có ý tưởng này trước khi ...
jcora

3

Tùy thuộc vào bản chất thành tích của bạn, bạn cũng có thể giới thiệu một số loại "thành tích đánh dấu".

Nếu bạn có 3 thành tích liên tiếp:
Gỗ 1 - Thu thập 100 gỗ
Gỗ 2 - Thu thập 500 gỗ
Gỗ 3 - Thu thập gỗ 1k

Sau đó, sẽ rất hợp lý khi chỉ cần đăng ký một sự kiện OnChange cho thành tích đầu tiên cho đến khi người chơi hoàn thành nó. Sau khi hoàn thành, bạn có thể đăng ký đối tượng thành tích tiếp theo.

Điều này tất nhiên đòi hỏi thiết kế (hoặc tính toán) của cây phụ thuộc thành tích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.