ฉันจะตรวจสอบได้อย่างไรว่าผู้เล่นได้สำเร็จหรือไม่?


13

ฉันสร้างเกม MMO และฉันเพิ่งมาถึงจุดที่ฉันต้องใช้ความสำเร็จ ... ฉันจะทำอย่างไร สิ่งที่ตรงไปตรงมาที่สุดที่ต้องทำคือเรียกใช้ทุก ๆ 100ms:

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

แต่นั่นก็ทำให้เกิดภาวะแทรกซ้อนมากขึ้น ตัวอย่างเช่นฉันจะตรวจสอบว่าความสำเร็จนั้นเสร็จสมบูรณ์ได้อย่างไร? ผู้เล่นมีคุณสมบัติที่กำหนดเองด้วยตัวเองเพื่อความสำเร็จที่เฉพาะเจาะจงหรือไม่? ฉันทำสิ่งนี้ด้วยเควสต์เพราะพวกเขาส่วนใหญ่จะ“ เก็บไม้ 100 อัน” ดังนั้นเควสต์ที่แอคทีฟของผู้เล่นจึงตรวจสอบว่า นอกจากนี้ต้องมีเวลาที่ดีกว่าในการตรวจสอบซึ่งจะทำให้เซิร์ฟเวอร์ของฉันช้าลงเป็นระยะฉันคิดว่า


7
ทำไมไม่เพียงแค่เรียกใช้การตรวจสอบที่เกี่ยวข้องเมื่อดำเนินการเสร็จแล้ว? คือถ้าผู้ใช้เก็บไม้ดูว่าตรงกับข้อกำหนด "เก็บ 100 ไม้" หรือไม่
Mike Cluck

1
ดูเหมือนว่ายุ่งเกินไป ... จะมีเช็คจำนวนมากทุกที่ ผมคิดว่าผมจะติดขั้นตอนวิธีการดังกล่าวข้างต้นเพราะมันเป็นความเรียบง่าย ...
jcora

10
มีวิธีทำให้ยุ่งเหยิงน้อยลง: เช่นมีตัวจัดการเหตุการณ์ "OnChange" แล้วแนบวัตถุ "สำเร็จ" กับสิ่งเหล่านั้นและจัดการกับตรรกะที่นั่น ยังเข้าใจด้วยว่าการตั้งค่าปัจจุบันของคุณคุณมีระดับความซับซ้อน O (n ^ 2) ซึ่งหมายความว่าเกมของคุณจะช้าลงเร็วขึ้นด้วยตัวละครมากขึ้น ชนิดของปัญหาสำหรับ MMO
Mike Cluck

ที่เกี่ยวข้อง: gamedev.stackexchange.com/questions/908/…
Tetrad

คำตอบ:


23

สิ่งที่คุณทำขึ้นอยู่กับลักษณะของความสำเร็จ นอกจากความสำเร็จของคุณจะพอดีกับรูปแบบเรียบง่าย (รวบรวมจำนวน X จำนวน Y) คุณจะต้องพิจารณาเป็นพิเศษในระดับหนึ่ง

การใช้ระบบการสื่อสารแบบอิงข้อความคุณสามารถจัดให้ hooks ที่ทำให้การเข้ารหัสเป็นกรณีพิเศษ คุณสามารถดำเนินการบางอย่างให้ส่งข้อความถึงผู้ฟังที่ลงทะเบียนตัวเอง จากนั้นรหัส / สคริปต์ความสำเร็จของคุณสามารถลงทะเบียนตัวเองกับผู้ฟังที่เหมาะสมและทำการทดสอบใด ๆ ก็ตามที่จำเป็นเพื่อให้บรรลุผลสำเร็จ

คุณจะมีข้อความสำหรับกิจกรรมทั่วไปที่คุณอาจต้องการความสำเร็จในการฟัง สิ่งที่ชอบ "ผู้เล่นได้รับรายการ X" หรือ "เอนทิตี Y ถูกทำลายเอนทิตี Z" ด้วยวิธีนี้คุณสามารถติดตามสิ่งต่าง ๆ เช่นจำนวน Z ที่ผู้เล่นฆ่าได้

นั่นอาจเป็นวิธีที่ดีที่สุดที่คุณสามารถทำได้สำหรับระบบเพื่อความสำเร็จ มันรวมรหัสให้มากที่สุดและวางความรับผิดชอบไว้ที่ผู้ฟังสำหรับการตรวจจับความสำเร็จที่แท้จริง

นอกจากนี้ควรสังเกตว่าสำหรับระบบความสำเร็จส่วนกลาง (X-Box Live, Steam Achievement) ความคืบหน้าสู่ความสำเร็จจะถูกเก็บไว้บนเซิร์ฟเวอร์ ดังนั้นสำหรับความสำเร็จในการสะสม ("ทำภารกิจ XY จำนวนครั้ง") สคริปต์ผลสัมฤทธิ์จะตรวจพบเมื่อ X ถูกดำเนินการและทำให้จำนวนเซิร์ฟเวอร์ลดลง สำหรับความสำเร็จชนิดอื่น ๆ ("ปฏิบัติภารกิจ X") ความสำเร็จของเซิร์ฟเวอร์คือระบบเลขฐานสอง: คุณทำได้หรือไม่


+1 นี่คือข้อมูลที่ดี แม้มีประโยชน์โดยที่ฉันไม่ต้องใช้ความสำเร็จในเวลานี้
Joshua Hedges

ขอบคุณ!
แทบ

3

คุณสามารถแนะนำ "marker marker" ได้เช่นกัน

หากคุณมีตัวอย่าง 3 ความสำเร็จติดต่อกัน:
ไม้ 1 - เก็บไม้ 100
ไม้ 2 - เก็บไม้ 500
ไม้ 3 - เก็บไม้ 1k

จากนั้นมันก็สมเหตุสมผลแล้วที่จะลงทะเบียนกิจกรรม OnChange สำหรับความสำเร็จครั้งแรกจนกว่าผู้เล่นจะทำมันให้เสร็จ เมื่อเสร็จสิ้นคุณสามารถลงทะเบียนวัตถุสำเร็จต่อไป

หลักสูตรนี้ต้องการการออกแบบ (หรือการคำนวณ) ของแผนภูมิการพึ่งพาผลสัมฤทธิ์ทางการเรียน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.