ฉันไม่แน่ใจว่าคุณกำลังอ่านสิ่งนี้อยู่หรือไม่ แต่ฉันได้ต่อสู้กับปัญหาแบบนี้มาเป็นเวลานาน
ฉันได้ออกแบบระบบที่มีผลกระทบหลายประเภท ฉันจะข้ามพวกเขาไปชั่วครู่ ทั้งหมดนี้ขึ้นอยู่กับประสบการณ์ของฉัน ฉันไม่ได้อ้างว่ารู้คำตอบทั้งหมด
ตัวดัดแปลงแบบคงที่
ระบบประเภทนี้ส่วนใหญ่อาศัยจำนวนเต็มอย่างง่าย ๆ เพื่อตรวจสอบการดัดแปลงใด ๆ ตัวอย่างเช่น +100 ถึง Max HP, +10 เพื่อโจมตีเป็นต้น ระบบนี้ยังสามารถจัดการร้อยละเช่นกัน คุณเพียงแค่ต้องแน่ใจว่าการซ้อนกันไม่ได้อยู่เหนือการควบคุม
ฉันไม่เคยแคชค่าที่สร้างขึ้นสำหรับระบบประเภทนี้จริงๆ ตัวอย่างเช่นถ้าฉันต้องการแสดงสุขภาพสูงสุดของบางสิ่งบางอย่างฉันจะสร้างมูลค่าทันที สิ่งนี้ป้องกันไม่ให้เกิดข้อผิดพลาดได้ง่ายและเข้าใจง่ายสำหรับทุกคนที่เกี่ยวข้อง
(ฉันทำงานใน Java ดังนั้นสิ่งที่ตามมาคือ Java แต่ควรทำงานกับการแก้ไขบางอย่างสำหรับภาษาอื่น ๆ ) ระบบนี้สามารถทำได้อย่างง่ายดายโดยใช้ enums สำหรับประเภทการดัดแปลงแล้วจำนวนเต็ม ผลลัพธ์สุดท้ายสามารถวางลงในคอลเลกชันบางประเภทที่มีคู่ของคีย์มูลค่าสั่งซื้อ นี่จะเป็นการค้นหาและการคำนวณที่รวดเร็วดังนั้นประสิทธิภาพจึงดีมาก
โดยรวมแล้วมันใช้งานได้ดีมากกับตัวดัดแปลงแบบคงที่ แม้ว่าโค้ดจะต้องมีอยู่ในสถานที่ที่เหมาะสมสำหรับการใช้งานตัวดัดแปลง: getAttack, getMaxHP, getMeleeDamage และอื่น ๆ
ที่วิธีนี้ล้มเหลว (สำหรับฉัน) มีปฏิสัมพันธ์ที่ซับซ้อนมากระหว่างชื่นชอบ ไม่มีวิธีง่าย ๆ ที่แท้จริงในการโต้ตอบยกเว้นการสลัมเล็กน้อย มันมีความเป็นไปได้ในการโต้ตอบง่ายๆ ในการดำเนินการดังกล่าวคุณต้องทำการปรับเปลี่ยนวิธีการจัดเก็บตัวดัดแปลงแบบคงที่ แทนที่จะใช้ enum เป็นคีย์คุณจะใช้ String สตริงนี้จะเป็นชื่อ Enum + ตัวแปรพิเศษ 9 ครั้งจาก 10 ไม่ใช้ตัวแปรพิเศษดังนั้นคุณยังคงชื่อ enum ไว้เป็นกุญแจ
ลองทำตัวอย่างด่วน: ถ้าคุณต้องการที่จะสามารถแก้ไขความเสียหายต่อสิ่งมีชีวิตที่ไม่ตายคุณสามารถมีคู่ที่ได้รับคำสั่งดังนี้: (DAMAGE_Undead, 10) ความเสียหายคือ Enum และ Undead เป็นตัวแปรพิเศษ ดังนั้นระหว่างการต่อสู้คุณสามารถทำสิ่งต่อไปนี้:
dam += attacker.getMod(Mod.DAMAGE + npc.getRaceFamily()); //in this case the race family would be undead
อย่างไรก็ตามมันใช้งานได้ดีและรวดเร็ว แต่มันล้มเหลวในการโต้ตอบที่ซับซ้อนและมีรหัส "พิเศษ" ทุกที่ ตัวอย่างเช่นพิจารณาสถานการณ์ของ“ โอกาส 25% ที่จะส่งผ่านทางไกลต่อความตาย” นี่คือคอมเพล็กซ์ที่“ ยุติธรรม” ระบบดังกล่าวสามารถจัดการกับมันได้ แต่ไม่ง่ายอย่างที่คุณต้องการ:
- ตรวจสอบว่าผู้เล่นมี mod นี้หรือไม่
- มีบางรหัสที่จะดำเนินการ teleportation หากประสบความสำเร็จ ตำแหน่งของรหัสนี้เป็นการสนทนาในตัวมันเอง!
- รับข้อมูลที่ถูกต้องจากแผนที่ Mod คุณค่าหมายถึงอะไร? เป็นห้องที่พวกเขาส่งผ่านทางไกลด้วยหรือไม่ จะเป็นอย่างไรถ้าผู้เล่นมีสองเทเลพอร์ตพอร์ท? จำนวนเงินจะไม่ถูกรวมเข้าด้วยกัน ?????? ความล้มเหลว!
ดังนั้นสิ่งนี้จะพาฉันไปที่หน้าถัดไปของฉัน:
ระบบ Buff ที่ซับซ้อนที่สุด
ฉันเคยพยายามเขียน 2D MMORPG ด้วยตัวเอง นี่เป็นความผิดพลาดอันยิ่งใหญ่ แต่ฉันได้เรียนรู้มากมาย!
ฉันเขียนผลของระบบอีก 3 ครั้ง คนแรกใช้การเปลี่ยนแปลงที่มีประสิทธิภาพน้อยกว่าของข้างต้น อย่างที่สองคือสิ่งที่ฉันจะพูดคุยเกี่ยวกับ
ระบบนี้มีชุดคลาสสำหรับการแก้ไขแต่ละครั้งดังนั้นสิ่งต่าง ๆ เช่น: ChangeHP, ChangeMaxHP, ChangeHPByPercent, ChangeMaxByPercent ฉันมีพวกหนึ่งล้านคน - แม้แต่อย่าง TeleportOnDeath
ชั้นเรียนของฉันมีสิ่งต่าง ๆ ที่จะทำดังต่อไปนี้:
- applyAffect
- removeAffect
- checkForInteraction <--- สำคัญ
นำไปใช้และลบอธิบายตนเอง (แม้ว่าจะเป็นสิ่งต่าง ๆ เช่นเปอร์เซ็นผลกระทบจะติดตามว่า HP เพิ่มขึ้นเท่าใดเพื่อให้แน่ใจว่าเมื่อเอฟเฟกต์หายไปมันจะลบยอดเงินที่เพิ่มเข้าไปเท่านั้นนี่คือ buggy, lol และ ฉันใช้เวลานานมากเพื่อให้แน่ใจว่าถูกต้องฉันยังไม่ได้รับความรู้สึกที่ดีเกี่ยวกับมัน)
วิธีการ checkForInteraction นั้นเป็นโค้ดที่ซับซ้อนอย่างน่ากลัว ในแต่ละคลาสที่ได้รับผลกระทบ (เช่น: ChangeHP) มันจะมีรหัสเพื่อตรวจสอบว่าสิ่งนี้ควรได้รับการแก้ไขโดยอินพุตที่ส่งผลกระทบหรือไม่ ตัวอย่างเช่นถ้าคุณมีบางอย่างเช่น ....
- บัฟ 1: สร้างความเสียหาย 10 ไฟกับการโจมตี
- บัฟ 2: เพิ่มความเสียหายทางไฟทั้งหมด 25%
- บัฟ 3: เพิ่มความเสียหายจากไฟทั้งหมด 15
เมธอด checkForInteraction จะจัดการกับปัญหาเหล่านี้ทั้งหมด เพื่อที่จะทำสิ่งนี้จะมีการตรวจสอบผู้เล่นทุกคนที่อยู่ใกล้ ๆ ด้วย !! นี่เป็นเพราะประเภทของผลกระทบที่ฉันจัดการกับผู้เล่นหลายคนในช่วงระยะเวลาหนึ่งของพื้นที่ นี่หมายความว่ารหัสไม่เคยมีคำแถลงพิเศษเหมือนด้านบน -“ ถ้าเราเพิ่งตายเราควรตรวจสอบ teleport on death” ระบบนี้จะจัดการอย่างถูกต้องโดยอัตโนมัติในเวลาที่เหมาะสม
พยายามที่จะเขียนระบบนี้ฉันใช้เวลา 2 เดือนและทำโดยหัวระเบิดหลายครั้ง อย่างไรก็ตามมันมีพลังจริงๆและสามารถทำสิ่งต่าง ๆ ที่บ้าคลั่งได้โดยเฉพาะอย่างยิ่งเมื่อคุณคำนึงถึงข้อเท็จจริงสองประการต่อไปนี้สำหรับความสามารถในเกมของฉัน: 1. พวกเขามีช่วงเป้าหมาย (เช่น: เดี่ยวตัวเองกลุ่มเดียวเท่านั้น เป้าหมาย PB AE เป้าหมาย AE เป้าหมายและอื่น ๆ ) 2. ความสามารถอาจมีผลกระทบมากกว่า 1 รายการ
ดังที่ฉันได้กล่าวไว้ข้างต้นนี่เป็นระบบลำดับที่ 2 ใน 3 ของเกม ทำไมฉันถึงย้ายออกไปจากนี้
ระบบนี้มีประสิทธิภาพที่แย่ที่สุดที่ฉันเคยเห็น! มันช้ามากเพราะมันต้องทำการตรวจสอบมากสำหรับแต่ละสิ่งที่เกิดขึ้น ฉันพยายามปรับปรุง แต่ก็ถือว่ามันล้มเหลว
ดังนั้นเรามาถึงรุ่นที่สามของฉัน (และระบบบัฟประเภทอื่น):
คลาสที่มีผลกระทบซับซ้อนกับตัวจัดการ
ดังนั้นนี่เป็นการรวมกันของสองอย่างแรก: เราสามารถมีตัวแปรแบบสแตติกในคลาส Affect ที่มีฟังก์ชันการทำงานจำนวนมากและข้อมูลเพิ่มเติม จากนั้นเพียงแค่เรียกตัวจัดการ (สำหรับฉันวิธีการยูทิลิตี้คงที่บางอย่างแทน subclasses สำหรับการกระทำที่เฉพาะเจาะจง แต่ฉันแน่ใจว่าคุณสามารถไปกับ subclasses สำหรับการกระทำหากคุณต้องการด้วย) เมื่อเราต้องการทำอะไร
คลาส Affect จะมีสิ่งของที่ฉ่ำทั้งหมดเช่นชนิดเป้าหมายระยะเวลาจำนวนการใช้โอกาสที่จะดำเนินการและอื่น ๆ
เรายังคงต้องเพิ่มรหัสพิเศษเพื่อจัดการกับสถานการณ์เช่นเทเลพอร์ตบนความตาย เรายังคงต้องตรวจสอบสิ่งนี้ในรหัสการต่อสู้ด้วยตนเองและถ้ามันมีอยู่เราจะได้รับรายการผลกระทบ รายการผลกระทบนี้มีผลกระทบทั้งหมดที่มีผลกับผู้เล่นที่จัดการกับการเคลื่อนย้ายด้วยความตาย จากนั้นเราก็จะดูแต่ละคนและตรวจสอบเพื่อดูว่ามันดำเนินการและประสบความสำเร็จ (เราจะหยุดที่ประสบความสำเร็จครั้งแรก) มันประสบความสำเร็จเราแค่เรียกผู้ดูแลจัดการเรื่องนี้
การโต้ตอบสามารถทำได้ถ้าคุณต้องการเช่นกัน มันแค่ต้องเขียนโค้ดเพื่อค้นหา buffs เฉพาะของผู้เล่น / etc เนื่องจากมีประสิทธิภาพที่ดี (ดูด้านล่าง) จึงควรมีประสิทธิภาพพอสมควร มันแค่ต้องการตัวจัดการที่ซับซ้อนมากขึ้นเรื่อย ๆ
ดังนั้นมันจึงมีประสิทธิภาพของระบบแรกและยังคงมีความซับซ้อนมากมายเช่นระบบที่สอง (แต่ไม่มากเท่า) อย่างน้อยใน Java คุณสามารถทำสิ่งที่ยุ่งยากเพื่อให้ได้ประสิทธิภาพเกือบเป็นกรณีแรกในกรณีส่วนใหญ่ (เช่น: มีแผนที่ enum ( http://docs.oracle.com/javase/6/docs/api/java) /util/EnumMap.html ) ที่มี Enums เป็นคีย์และ ArrayList ที่มีผลกระทบกับค่าซึ่งจะช่วยให้คุณดูว่าคุณมีผลกระทบอย่างรวดเร็วหรือไม่ [เนื่องจากรายการจะเป็น 0 หรือแผนที่จะไม่มี enum] และไม่มี เพื่อย้ำเหนือรายการผลกระทบของผู้เล่นอย่างต่อเนื่องโดยไม่มีเหตุผลฉันไม่คิดว่าจะทำซ้ำถ้าหากเราต้องการพวกเขาในขณะนี้
ขณะนี้ฉันกำลังเปิดใหม่ (เขียนเกมใหม่ใน Java แทนที่จะเป็นรหัสฐาน FastROM เดิม) MUD ของฉันที่สิ้นสุดในปี 2548 และฉันเพิ่งพบว่าฉันต้องการนำระบบบัฟมาใช้อย่างไร ฉันกำลังจะใช้ระบบนี้เพราะมันทำงานได้ดีในเกมที่ล้มเหลวก่อนหน้าของฉัน
หวังว่าบางคนจะพบว่าข้อมูลเชิงลึกเหล่านี้มีประโยชน์บ้าง