ฉันจะกำหนดรายการในเกม RPG ของฉันเช่นเกม Java ได้อย่างไร


21

ฉันตั้งใจทำงานเกมประเภท RPG ใน Java แต่ฉันมีปัญหาในการหาวิธีที่ฉันสามารถมีไอเท็มที่สามารถทำสิ่งต่าง ๆ มากมายโดยไม่ต้องสร้างคลาสที่แตกต่างกันสำหรับทุกรายการ

ตัวอย่างเช่นฉันจะสร้างขวานที่สามารถตัดต้นไม้และโจมตีสัตว์ประหลาดได้อย่างไร

หากฉันขยายการสับหรือคลาสอาวุธฉันก็ไม่สามารถขยายคลาสอื่นได้

ถ้าฉันมีเขียงและอาวุธเป็นส่วนต่อประสานฉันจะมีรหัสซ้ำซ้อนมากมายเมื่อกริชสามารถโจมตีสัตว์ประหลาดและขวานต่าง ๆ สามารถตัดต้นไม้ได้

ฉันหวังว่าจะมีวิธีที่จะมีคลาส Item หนึ่งรายการและโหลดไอเท็มและความสามารถที่เกี่ยวข้องจากไฟล์ หากเป็นไปได้จะทำอย่างไร? ถ้าไม่ใช่อย่างนั้นวิธีที่ดีที่สุดในการมีไอเท็มในเกมคืออะไร?

คำตอบ:


15

คำตอบของ Gregory Weir เป็นที่ชื่นชอบสำหรับวิธีการจัดโครงสร้างอินสแตนซ์ของไอเท็มเพื่อดำเนินการหลายบทบาท

วิธีโหลดจากไฟล์:

ก่อนอื่นให้ใช้ YAML YAML เป็นภาษาคำอธิบายข้อมูลที่มีประโยชน์ สามารถแยกวิเคราะห์ได้ค่อนข้างเร็วอ่านและแก้ไขโดยมนุษย์รองรับข้อมูลไบนารีและไลบรารีที่มีอยู่สำหรับภาษาการเขียนโปรแกรมส่วนใหญ่รวมถึง Java วิธีนี้ช่วยแก้ "ฉันจะนำข้อมูลจากไฟล์ไปสู่วัตถุได้อย่างไร

ประการที่สองการใช้รูปแบบฟลายเวทข้อมูลส่วนใหญ่ที่คุณอ่านจากไฟล์เหล่านั้นเป็นแบบสแตติก มันจะไม่เปลี่ยนแปลงต่อตัวอย่าง ("ขวานทำดาเมจพื้นฐาน 1d10 และทำลายไม้ แต่ไม่ใช่หิน" - นั่นเป็นความจริงของทั้งห้าแกนที่ผู้เล่นมี) สิ่งที่คุณอ่านจากไฟล์ YAML คือคำจำกัดความของคำว่าสงบและอินสแตนซ์ของไอเท็มแต่ละรายการของคุณมีการอ้างอิงที่ไม่เป็นเจ้าของ (และค่าคงที่) พร้อมกับข้อมูลต่ออินสแตนซ์เช่น " ฉันชื่อที่กำหนดเอง? "และอื่น ๆ

ด้วยการแบ่งปันข้อมูลข้ามอินสแตนซ์ในวัตถุเดียวคุณจะเก็บรักษาหน่วยความจำไว้จำนวนมากและทำให้ง่ายต่อการอัปเดตรายการโดยไม่มีสถานะเกมคงอยู่ (บันทึกเกมหรือฐานข้อมูลผู้เล่น)

ดังนั้นโครงสร้างชั้นเรียนของคุณดูเหมือน:

  • รายการระดับ - หนึ่งอินสแตนซ์ต่อรายการ
    • ตัวอย่างอาวุธของ Owns-a
    • อินสแตนซ์ของเครื่องมือ
    • มีชื่อที่กำหนดเอง ฯลฯ
  • อาวุธระดับ - (มากถึง) หนึ่งอินสแตนซ์ต่อไอเท็ม
    • เป็นรายการส่วนประกอบ
    • หมายถึง WeaponDef
    • มีเลเวลโบนัสพิเศษ ฯลฯ
  • เครื่องมือคลาส - (สูงสุด) หนึ่งอินสแตนซ์ต่อหนึ่งรายการ
    • เป็นรายการส่วนประกอบ
    • อ้างอิงถึง ToolDef
    • มีความทนทาน ฯลฯ
  • class WeaponDef - หนึ่งอินสแตนซ์ต่อหนึ่งชนิดของอาวุธ
    • อ่านจากไฟล์ฟิลด์ควรจะคงที่
    • มีจำนวนดาเมจพื้นฐาน 1 หรือ 2 มือเป็นต้น
  • class ToolDef - หนึ่งอินสแตนซ์ต่อชนิดของเครื่องมือ
    • อ่านจากไฟล์ฟิลด์ควรจะคงที่
    • มีความทนทานพื้นฐานวัสดุที่สามารถแตกหัก ฯลฯ

18

รูปแบบการออกแบบ Component (ไม่ใช่ Composite) นั้นยอดเยี่ยมสำหรับจุดประสงค์นี้: http://gameprogrammingpatterns.com/component.html

โดยทั่วไป Axe จะเป็นตัวอย่างของคลาส Item ที่มี WeaponComponent และ ToolComponent (อาจ) หากต้องการทดสอบว่ามีสิ่งใดที่สามารถใช้เป็นอาวุธได้ให้ตรวจสอบว่ามี WeaponComponent ติดอยู่หรือไม่และจากนั้นพูดคุยกับอินสแตนซ์ WeaponComponent นั้นเพื่อรับข้อมูลอาวุธของรายการ

แน่นอนว่าการโหลดจากไฟล์เป็นการออกกำลังกายที่แยกต่างหาก


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

6
@CodexArcanum: "ประเภท Axe ของคุณสามารถใช้ IChopper และ IWeapon แต่สามารถแสดงพฤติกรรมของส่วนประกอบได้" - อะไรคือประเด็นนี้? มันแค่ขยายลำดับชั้นของคุณออกไป ประเด็นของรูปแบบส่วนประกอบคือคุณไม่ต้องการคลาส Axe หรือ IChopper หรืออินเตอร์เฟส IWeapon เพียงส่วนประกอบ Chopper และ Weapon ที่เป็นรูปธรรมและรายการระดับบนสุด

ขณะนี้ฉันกำลังทำงานกับระบบส่วนประกอบสำหรับไอเท็มเกมของฉันและมีการร้องเรียนที่สำคัญเพียงข้อเดียวเกี่ยวกับวิธีการใช้รูปแบบ เมื่อพิจารณาจากส่วนประกอบของอาวุธเครื่องนุ่งห่มและวัสดุสิ้นเปลืองสินค้าอาจมีเหตุผล "เสียหาย" ในแง่ของรายการที่ไม่สามารถเป็นได้ทั้งอาวุธและเครื่องนุ่งห่มหรือเครื่องนุ่งห่มที่บริโภคได้ รายการมีเหตุผลได้เพียงหนึ่ง "องค์ประกอบหลัก" แต่ด้วยการ จำกัด ส่วนประกอบที่คุณทำลายความต้องการของระบบส่วนประกอบทั้งหมดเข้าด้วยกัน ดังนั้นหนึ่งในข้อบกพร่องขั้นพื้นฐานที่มีระบบที่น่าอัศจรรย์อย่างอื่น
Krythic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.