มันมีคุณค่าที่จะใช้กลไก / กฎของเกมแยกจากรหัสหลักหรือไม่?


25

ไม่แน่ใจว่าเหมาะกับขอบเขตของชุมชนนี้หรือควรไปที่ Stackoverflow แทน

สมมติว่าฉันต้องการให้เกมของฉันสามารถขยายได้อย่างง่ายดายในแกนกลางของมันนั่นคือฉันต้องการให้ผู้คนจำนวนมากแม้จะไม่มีความรู้ด้านการเขียนโปรแกรมที่ดีจะไม่เพียง แต่ปรับแต่งกฎที่มีอยู่ แต่เพิ่มกลไกเกมใหม่ทั้งหมด ฉันไม่ใช่โปรแกรมเมอร์ที่ดี แต่ฉันพร้อมที่จะเรียนรู้ฉันแค่ต้องการคำแนะนำและความมั่นใจว่าสามารถทำได้

สิ่งที่ฉันคิดเกี่ยวกับว่าเป็นไปได้ / เป็นไปได้ที่จะใช้กลไกเกมแยกจากรหัสยูทิลิตี้หลักหรือไม่? ฉันหมายถึงสำหรับเกมบนโต๊ะเรามีกฎเหล่านั้นซึ่งไม่มีอัลกอริธึมที่แท้จริงของการกระทำทั้งหมด แต่ค่อนข้างจะอธิบายโปรโตคอลและข้อ จำกัด บางอย่างโดยอ้างอิงบริบทของแต่ละรายการดังกล่าวเป็นอย่างมาก เป็นไปได้หรือไม่ที่จะทำสิ่งที่คล้ายกันสำหรับเกมพีซีเช่นอธิบายกฎทั้งหมดในระดับสูงมากอ่านได้ง่าย (และเปลี่ยนแปลงได้) โดยภาษาการเขียนโปรแกรมของมนุษย์ซึ่งเป็น "บริโภค" แล้วแยกวิเคราะห์โดยรหัสยูทิลิตี้ ตัวอย่างการทำงานของกลไกเกม?

ดูเหมือนว่าฉันจะต้องเขียนภาษาของตัวเองและเรียบเรียงสำหรับมัน)) ซึ่งแน่นอนว่าฉันไม่สามารถทำได้ แต่อาจจะมีวิธีแก้ไขปัญหาได้ง่ายขึ้น?

FYI: ภาษาที่ฉันเลือกสำหรับรหัสยูทิลิตี้จะเป็น Python 3.x


ในขณะที่คุณไม่มีประสบการณ์และทำงานในฐานะนักพัฒนาเดียวฉันขอแนะนำให้คุณไม่ลองใช้ทุกอย่างด้วยตนเอง การใช้ไลบรารี SDL2 จะเป็นประโยชน์กับคุณในหลาย ๆ พื้นที่และพวกมันมีการผูก Python เพื่อให้คุณสามารถทำงานในภาษาที่คุณพอใจ เพื่อให้บรรลุถึงสิ่งที่คุณต้องการการออกแบบสถาปัตยกรรมของคุณควรทำอย่างระมัดระวังและฉันคาดว่าจะมีการเขียนใหม่อย่างน้อยหนึ่งครั้งแม้แต่ทีมที่มีประสบการณ์ ยิ่งไปกว่านั้น Python ก็ไม่ได้เรียนรู้ได้ง่ายกว่าภาษาอื่น ๆ และในความคิดของฉันมี gotchas หลักในระดับกลาง
ttbek

แนวคิดที่คุณต้องการนั้นเป็นเรื่องปกตินอกเกม มีชุดเครื่องมือซอฟต์แวร์ที่เรียกว่าเอ็นจินกฎธุรกิจซึ่งจะต้องทำสิ่งนี้ ในเกม dev คุณสามารถใช้เครื่องมือเหล่านี้ได้เช่นกัน ตัวอย่างเช่น GameplayKit ของ Apple รวมถึงคลาส GKRuleSystem และ GKRule เพื่อจุดประสงค์ที่คล้ายกัน อาจต้องใช้ความพยายามในการขยายเพื่อให้สามารถแก้ไขสิ่งนี้จากภายนอกได้ แต่อาจมีโครงสร้างในวิธีที่จะเปลี่ยนพฤติกรรมโดยไม่ต้องคอมไพล์โค้ดของคุณใหม่
Sandy Chapman

คำตอบ:


34

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

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

สิ่งที่มีอยู่ใกล้เคียงที่สุดที่ฉันรู้คือ Vassal (ซึ่งเป็นโปรแกรมมากกว่าที่คุณอธิบายไว้) หรือสร้าง mod สำหรับ Tabletop Simulator (ซึ่งส่วนใหญ่ขึ้นอยู่กับการปฏิสัมพันธ์ของมนุษย์ในการตีความและบังคับใช้กฎของเกมใด ๆ )


คำแนะนำที่มั่นคง ฉันพยายามที่จะรักษารหัสของฉันให้แน่นที่สุดเท่าที่จะเป็นไปได้เพื่อเพิ่มความสะดวกในการขยาย แต่คุณจะมีกรณีที่มันยากที่จะ hardcode / คู่อะไรบางอย่าง แม้ในฐานะนักพัฒนามืออาชีพไม่ใช่เรื่องง่ายและไม่เป็นมิตรกับมือใหม่
angarg12

TTS ในขณะนี้สนับสนุน Lua และการบังคับใช้กฎไม่ได้ขึ้นอยู่กับการปฏิสัมพันธ์ของมนุษย์ในขณะนี้
Ave

17

สิ่งที่ฉันคิดเกี่ยวกับว่าเป็นไปได้ / เป็นไปได้ที่จะใช้กลไกเกมแยกจากรหัสยูทิลิตี้หลักหรือไม่?

เป็นไปได้อย่างแน่นอน วิธีการหนึ่งที่มักจะใช้ในการเล่นเกมเป็นLua สคริปต์

จากบทความที่เชื่อมโยง:

Lua เดิมถูกออกแบบในปี 1993 เป็นภาษาสำหรับขยายแอปพลิเคชั่นซอฟต์แวร์เพื่อตอบสนองความต้องการที่เพิ่มขึ้นสำหรับการปรับแต่งในเวลานั้น

มีหลายเกมที่ใช้ Lua (ฉันจะเชื่อมโยง แต่ชื่อเสียงของผู้ใช้ใหม่ จำกัด จำนวนการเชื่อมโยงของฉัน)

สคริปต์ Lua สามารถรวบรวมได้ในเวลาทำงาน ซึ่งหมายความว่าพวกเขาสามารถ (เช่น) เป็นไฟล์ข้อความที่อยู่ในไดเรกทอรี "สคริปต์" ของเกมของคุณซึ่งสามารถแก้ไขได้อย่างง่ายดายโดย modder เกมของคุณโหลดขึ้นมาและรัน

ฉันเคยเห็นสคริปต์ Lua กำหนดคุณสมบัติของหน่วยในเกม นี่คือตัวอย่างแบบสุ่มจาก TA Spring

แต่คุณต้องการ "อธิบายกฎทั้งหมด" เป็นไปได้ในทางทฤษฎีเนื่องจาก Lua เป็นภาษาเต็มรูปแบบ แต่ปัญหาคือคุณต้องมีสติปัญญาพอที่จะรู้รหัสเกมหลักเพื่อค้นหาสคริปต์เพื่อขยายพฤติกรรมของมัน

ตัวอย่างเช่นคุณอาจพัฒนาเกมไพ่ที่รู้วิธีมองหาการ์ดในไดเรกทอรี "สคริปต์ / การ์ด" นั่นยอดเยี่ยมสำหรับการเพิ่มการ์ดใหม่หรือแก้ไขการ์ดที่มีอยู่ แต่ถ้าคุณต้องการขยายเกมของคุณเพื่อรวมขนาดเล็กลงบนกริดคุณจะต้องแก้ไขรหัสหลัก - ไม่มีการเล่นซอ Lua จำนวนมากที่จะพาคุณไปที่นั่นด้วยตัวเอง

โปรดทราบ: ฉันนำ Lua ขึ้นมาเพราะฉันรู้ว่ามันใช้งานทั่วไปทั้งในการเล่นเกมและซอฟต์แวร์เพื่อการปรับแต่ง ฉันไม่ได้บอกว่ามันเป็นทางออกเดียวหรือดีที่สุดสำหรับความต้องการของผู้ถาม


7
คำตอบนี้บอกเป็นนัยว่า Lua เป็นภาษาสคริปต์เดียวที่ใช้ในวิธีนั้น มีภาษาสคริปต์อื่น ๆ อีกมากมายที่สามารถฝังในเอ็นจินเกม เอ็นจิ้นบางตัวก็ใช้วิธีการของตนเองและใช้ภาษาสคริปต์เฉพาะโดเมนของตนเอง ฉันมักจะไม่แนะนำว่า (เพราะการสร้างภาษาเป็นงานตัน) แต่ควรพูดถึง
ฟิลิปป์

3

มีความต่อเนื่องของวิธีการและไม่ว่าคนใดคนหนึ่งในพวกเขาจะคุ้มค่าหรือไม่ขึ้นอยู่กับสิ่งที่คุณพยายามทำ คุณต้องการควบคุม tweaker มากแค่ไหน?

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

วิธีการที่ให้การควบคุมน้อยกว่านั้นคือ "หยุด" รหัสยูทิลิตี้ของคุณ (พูดโดยรวบรวมมันไว้ล่วงหน้า) และให้ tweakers กรอกฟังก์ชันเฉพาะ (การเรียกกลับ) จำกัด การทำงานของพวกเขา วิธีนี้อาจมีหลายรูปแบบขึ้นอยู่กับสิ่งที่คุณต้องการทำ วิธีการทั่วไปคือการวางส่วนแสดงผลทั้งหมดในยูทิลิตี้ / รหัสหลักและกลไกทั้งหมดในส่วนที่ปรับแต่งได้ หรือคุณอาจต้องการเก็บกลไกบางอย่างไว้ในส่วน "แช่แข็ง" เนื่องจากผู้เล่นไม่น่าจะต้องการเปลี่ยนแปลงหรือทำให้การเปลี่ยนแปลงนั้นซับซ้อนเกินไป

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

รายละเอียดของวิธีการเหล่านี้ทั้งหมดและสิ่งที่เหมาะกับกรณีการใช้งานของคุณขึ้นอยู่กับประเภทของเกมพื้นฐานที่คุณต้องการทำและการควบคุมที่คุณต้องการเลิกใช้ โปรดทราบว่าโดยทั่วไปเกมเพื่อการค้าจะใช้วิธีที่สองและสามเท่านั้นเนื่องจากเกมแรกอนุญาตให้ผู้เล่นสร้างเกมที่แยกจากกันโดยสิ้นเชิงซึ่งนำเสนอปัญหาการออกใบอนุญาตที่ซับซ้อน โปรดทราบว่าเนื่องจากวิธีการเหล่านี้ก่อให้เกิดความต่อเนื่องแนวทางที่สองอาจแนะนำปัญหาเหล่านี้เช่นกัน


การทำให้โอเพนซอร์สเป็นเป้าหมายของฉันจริง ๆ แล้ว สิ่งที่ฉันเห็นว่าเป็นปัญหาคือวิธีการใช้ความสามารถนี้ในวิธีที่ง่ายที่สุดเพื่อให้ผู้เล่นคนอื่น ๆ ของเกม (ซึ่งเป็นเกม MP, btw) สามารถสร้างส่วนขยายของกฎพื้นฐานพื้นฐานของตัวเอง อื่นหลีกเลี่ยงความขัดแย้งในเวลาเดียวกัน ดังนั้นหากผู้ใช้รายหนึ่งพัฒนาส่วนขยายที่เอาชนะกฎบางอย่างและอีกกลุ่มหนึ่งพัฒนาส่วนขยายที่แตกต่างกันวิธีการตรวจสอบให้แน่ใจว่าผู้ใช้รายที่สามที่ต้องการใช้ทั้งสองอย่างในเกมของเขาจะไม่พบปัญหาความเข้ากันได้ นอกเหนือจากการบังคับให้พวกเขาทำงานร่วมกันอย่างแน่นหนา
อก

.. และนำไปใช้งานในลักษณะที่ไม่ต้องการการแก้ไขรหัสยูทิลิตี้ใด ๆ และทำให้มีความรู้เกี่ยวกับการเขียนโปรแกรมมากเกินไป
อก

1
ฉันไม่คิดว่าจะมีวิธีในการป้องกันปัญหาความเข้ากันได้ (แม้แต่การตั้งค่าสีของบางสิ่งบางอย่างอาจทำให้เกิดปัญหานั้น!) ฉันคิดว่าสิ่งที่ดีกว่าที่จะทำคือมีวิธีการตรวจสอบปัญหาความเข้ากันได้ที่เป็นไปได้ เพื่อตอบสนอง ขึ้นอยู่กับการออกแบบของอินเตอร์เฟสรหัสยูทิลิตี้และส่วนขยายที่เป็นปัญหาอาจมีวิธีการสั่งซื้อการโทรกลับ ฯลฯ ที่ให้ผลลัพธ์ที่ต้องการ จากนั้นอีกครั้งอาจไม่มี แจ้งเตือนผู้ใช้ว่าอาจมีปัญหาและเหตุใดจึงดูเหมือนว่าประสบการณ์การใช้งานที่ดีกว่าสิ่งที่ไม่มีคำอธิบาย
Ryan1729

2

เป็นไปได้อย่างยิ่งที่จะแยกกฎของระบบออกจากรหัสที่ใช้กฎเหล่านั้น ฉันชอบที่จะจัดโครงสร้างโค้ดของฉันในแบบที่เป็นโครงการที่ซับซ้อนเนื่องจากมันง่ายต่อการเพิ่มกฎใหม่หรือเปลี่ยนกฎในภายหลังโดยไม่ต้องแนะนำบั๊กเข้าสู่ระบบพื้นฐาน และบั๊กในเอ็นจิ้นกฎจะพบได้เร็วกว่าบั๊กในระบบที่กฎและโค้ดอื่น ๆ ผสมกันเข้าด้วยกันเป็น higgledy-piggledy เพราะเอ็นจิ้นกฎเดียวกันได้ถูกใช้ซ้ำทุกกฎ

ไม่ว่าจะคุ้มหรือไม่นั้นขึ้นอยู่กับความซับซ้อนของระบบ เหมือนฉันจะไม่รบกวน Pac-Man แต่ฉันไม่สามารถจินตนาการได้ว่าการเขียนป้อมปราการ Dwarf ในทางอื่น


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

ไม่มีหนังสือขอโทษ แต่แนวคิดพื้นฐานของเอ็นจินกฎอย่างง่าย: สร้างคลาส Rule ที่มีคุณสมบัติสำหรับข้อมูลทุกชิ้นที่คุณต้องการอธิบายกฎ หากคุณสมบัติเหล่านี้บางอย่างมีฟังก์ชั่นแลมบ์ดาคุณสามารถกำหนดพฤติกรรมที่ซับซ้อนให้กับพวกเขาได้ สร้างคลาสที่สร้างรายการของกฎให้อินสแตนซ์ดังนั้นกฎทั้งหมดของคุณอยู่ในที่เดียว สร้างคลาสอื่นที่มีเมธอดที่รับรายการกฏเป็นอินพุตและใช้กับระบบ
Robyn

2

มันเป็นไปได้อย่างแน่นอน ถ้ามันคุ้มค่าขึ้นอยู่กับเป้าหมายของคุณ

คุณไม่จำเป็นต้องประดิษฐ์ภาษาของคุณเองหรือเขียนคอมไพเลอร์เพื่อทำงานนี้

หากคุณต้องการให้เกมของคุณสามารถขยายได้อย่างง่ายดายอาจเป็นความคิดที่ดีที่จะทำเช่นนั้น

มันอาจจะทำงานได้มากขึ้นสำหรับคุณอย่างน้อยในระยะสั้นเพื่อสร้างระบบที่เข้าใจได้และทำให้การปรับเปลี่ยนเป็นเรื่องง่าย

เกมหนึ่งที่ทำเช่นนี้คือRimworld (ฉันไม่มีส่วนเกี่ยวข้อง) และคุณอาจจะสามารถดูและเรียนรู้จากวิธีการที่พวกเขาทำโดยทั่วไปแล้วใส่ข้อมูลเกมและกลไกในไฟล์ XML จำนวนมากที่อยู่ในโฟลเดอร์เกมเพื่อให้ทุกคนได้เห็นและ ปรับเปลี่ยน หลัก / กลไกของเกมถูกสร้างขึ้นโดยใช้ Unity

นอกจากนี้ยังมีความเป็นไปได้ในการขยายเกมเพิ่มเติม / ลึกลงไปโดยการเขียนโปรแกรมจริงฉันรู้น้อยเกี่ยวกับเรื่องนั้น แต่คุณสามารถเรียนรู้ได้โดยดูฟอรัม mods

ความเป็นไปได้ของการดัดแปลงทำให้เกมน่าสนใจมากขึ้นสำหรับผู้คนจำนวนมากและฉันคิดว่ามันมีส่วนทำให้ความสำเร็จเป็นอย่างมาก นอกจากนี้ยังช่วยให้นักพัฒนาสามารถนำเนื้อหาดัดแปลงใด ๆ ที่พวกเขาต้องการลงในเกมหลักและในทางที่เร่งการพัฒนาและปรับปรุงเกมเนื่องจากพวกเขาได้รับความช่วยเหลือจากผู้คนจำนวนมากและพวกเขาสามารถตัดสินใจที่จะทำสิ่งต่าง ๆ ตาม สิ่งที่ได้รับความนิยมสิ่งที่ดูเหมือนว่าจะทำงาน ฯลฯ

และโดยเฉพาะอย่างยิ่งสำหรับสตูดิโออิสระเล็ก ๆ พวกเขามีคนหลายร้อยคนที่คิดไอเดียและทดสอบพวกเขาสำหรับพวกเขาซึ่งเป็นงานจำนวนมากที่พวกเขาทำเองไม่ได้หรืออาจจ้างคนให้ทำ


แม้ว่าฉันจะเห็นได้ว่าข้อมูลเกมจะถูกกำหนดด้วย xml อย่างไรฉันไม่สามารถจินตนาการได้ว่าคุณจะใช้มันเพื่อกำหนดกลศาสตร์ / กฎของเกมได้อย่างไร คุณช่วยยกตัวอย่าง / บทความเรื่องหัวเรื่องได้ไหม?
อก

@tis Rules เป็นเพียงข้อมูลประเภทอื่น หากเอ็นจิ้นของฉันมี "If A do B" ฉันสามารถโหลด A และ B จากไฟล์ XML ได้ตอนนี้ผู้ใช้สามารถวางกฎเกณฑ์ที่เป็นธรรมได้อีกหนึ่งบิตเพิ่มเติมที่สามารถช่วยได้คือจัดเตรียมรายการที่เป็นไปได้ทั้งหมดที่คุณสนับสนุน เช่น "ถ้าสถานะสเตตัสเปียร์แล้วย้าย 100", "ถ้าสถานะสแตติกและเวลา> x จากนั้นสเตตัสสถานะ" ดังนั้นในการออกแบบของคุณให้คิดว่ากฎประเภทใดที่คุณต้องการอนุญาตให้ใช้กับวัตถุประเภทใด (สถานะเวลา movespeed) และ ด้วยประเภทขององค์ประกอบที่จะอนุญาต (และ / หรือ, ฯลฯ ... ) หากสถานะใต้น้ำและเวลา> 5 สุขภาพ -10
ttbek

1

คุณอาจต้องการที่จะมองเข้าไปในการออกแบบเชิงวัตถุ Python ให้การสนับสนุนเป็นอย่างดี

หนังสือหนาถูกเขียนเกี่ยวกับเรื่องนี้ซึ่งอาจน่ากลัวเมื่อคุณใหม่ แต่หลักการสำคัญค่อนข้างง่าย

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

หากคุณต้องการเกมประเภทต่าง ๆ คุณอาจต้องการวัตถุเกมที่ดูแลสภาพแห่งชัยชนะและเช่นนั้น อาจเป็นวัตถุแผนที่ด้วย

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

คลาสย่อย:ทั้งอาวุธและเกราะเป็นอุปกรณ์ อุปกรณ์เป็นรายการ อาจมีรายการประเภทอื่น ๆ คุณอาจพบว่ามีประโยชน์ในการกำหนดคลาส Combatant ที่ทั้งผู้เล่นและสัตว์ประหลาดเป็นคลาสย่อยของ

แนวคิดก็คือตัวอย่างเช่นอาวุธจะมีหลายสิ่งร่วมกันกับรายการประเภทอื่น ๆ ทั้งหมดพวกเขามีน้ำหนักขนาดและคุณสมบัติอื่น ๆ เช่นนั้น

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

การแบ่งคลาสย่อยยังช่วยให้ผู้สร้าง mod ของคุณพูดว่า "อาวุธชนิดใหม่ของฉันเหมือนกับอาวุธมาตรฐานยกเว้นว่า ... "

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

ตราบใดที่คุณแค่ทำมันด้วยตัวเองคุณก็สามารถเปลี่ยนแปลงสิ่งต่างๆรอบตัวได้ แต่เมื่อคุณปล่อยบางอย่างออกสู่สาธารณะการเปลี่ยนแปลงจะยากขึ้นมาก! ผู้คนจะสร้าง mods ที่ขึ้นอยู่กับสิ่งต่าง ๆ ที่เป็นเหมือนตอนนี้ แม้กระทั่งโรคจิต ผู้คนจะเขียน mod ที่ขึ้นอยู่กับข้อบกพร่องที่อยู่ในรหัส หากคุณเปลี่ยนสิ่งต่าง ๆ mods เหล่านั้นจะแตกและลินช์ mobs จะปรากฏที่บ้านของคุณ

ตัวอย่างเช่น:

ผู้เล่นที่ถืออาวุธโจมตีสัตว์ประหลาดที่สวมเกราะหลายแขน สิ่งนี้เกิดขึ้นในโหมดเกมโดยเฉพาะและบนแผนที่บางอัน

นักสู้ทั้งคู่อาจมีทักษะเช่น Critical Hit และ Dodge

ทีนี้วัตถุใดรับผิดชอบอะไร?

ไม่มีคำตอบที่ถูกต้องสำหรับสิ่งนี้ มากขึ้นอยู่กับชนิดของการปรับแต่งที่คุณต้องการอนุญาต

หากคุณไม่เคยโทรหาวัตถุใด ๆ (เช่นแผนที่) วัตถุนั้นจะไม่สามารถเปลี่ยนการโจมตีได้ แต่อย่างใด

หลังจากที่การตัดสินใจทั้งหมดเหล่านี้เอกสารพวกเขา เขียน "Modders manual" ซึ่งแสดงรายการที่วิธีการที่แต่ละ moddable สามารถแก้ไขได้คืออะไรพารามิเตอร์ที่พวกเขาใช้สิ่งที่ควรกลับมาและอื่น ๆ เรื่อย ๆ ...

โชคดี!


การป้อนข้อมูลของคุณได้รับการชื่นชมจริง ๆ และคุณใช้ความพยายามอย่างมากในนั้นดังนั้นมันจึงคุ้มค่ากับ +1 อย่างแน่นอน แต่โดยทั่วไปฉันรู้เกี่ยวกับ OOP โดยทั่วไป (แม้ว่าจะไม่มีประสบการณ์ในเรื่องนี้) ปัญหาปัจจุบันของฉันคือวิธีการออกแบบทั่วไปที่ฉันควรทำ เกมของฉันไม่ได้มีขนาดใหญ่เท่า D & D ตามสัดส่วน แต่มันก็ลึกมากในกลไกของมัน นั่นหมายถึงความซับซ้อนมากมายผสมผสานกับกฎระดับต่าง ๆ ซึ่งฉันต้องการอนุญาตให้ผู้ใช้ขยายอย่างมีนัยสำคัญไม่เพียง แต่ปรับแต่งค่าบางอย่างเล็กน้อย อาจจะไม่มีวิธีแก้ปัญหาที่ง่ายขึ้นแน่นอน ..
อก

@tis กุญแจสำคัญในการนี้จะทำให้การตัดสินใจที่ถูกต้องเกี่ยวกับสิ่งที่เป็นจริงวัตถุในรูปแบบของคุณ OO ของเกม สถานที่ "ชัดเจน" ที่จะเริ่มต้นคือ "นาม" เช่นอาวุธชุดเกราะและอื่น ๆ ไม่ใช่วิธีเดียวและสามารถนำไปสู่ความยุ่งเหยิงของรหัสที่ไม่สามารถปรับแต่งได้ หากกฎบอกว่า "คุณยิงสัตว์ประหลาดบางชนิดที่มีกระสุนเงินในสุสานตอนเที่ยงคืน" คุณบังคับใช้กฎนั้นในรหัสที่ไหน? ในคลาส Gun (หรือ Bullet) ในคลาส Monster ในคลาส Fighter ของผู้ใช้ปืนในคลาส Churchyard หรือในคลาส Time? คำตอบที่ดีที่สุดอาจเป็น "ไม่มีข้อใดข้อหนึ่งข้างต้น" ...
alephzero

... และทบทวนการออกแบบทั้งหมดในแง่ของคลาสกฏ (ซึ่งอาจเป็นฐานข้อมูลจริงๆ) และคลาสการแก้ไขข้อขัดแย้ง ตอนนี้กฎอื่น ๆ เช่น "ถ้าคุณไม่มีกระสุนคุณยังสามารถใช้ปืนของคุณเป็นสโมสร" และ "ถ้าอลิซใช้คาถาที่บางส่วน (แต่ไม่สมบูรณ์) ปกป้องบ๊อบจากบาดแผลกระสุนปืนในขณะที่ชาร์ลีพยายามยิงบ๊อบ จากนั้น .... "มีสถานที่เดียวและ" ชัดเจน "ที่จะนำไปใช้ในโค้ด คุณอาจพบว่าคลาส Gun ดั้งเดิมของคุณมีน้อยมากยกเว้นเอฟเฟกต์ภาพและเสียงบางส่วน - และไม่ถึงกับเป็นเช่นนั้นถ้าเป็นเกมที่ใช้ข้อความ!
alephzero

1

วิธีง่ายๆในการรับการสนับสนุนขั้นพื้นฐานสำหรับสิ่งนี้คือการแยกค่าตัวเลขส่วนใหญ่ออกเป็นไฟล์ข้อความแยกต่างหากหนึ่งไฟล์หรือมากกว่าเพื่อให้บุคคลที่สนใจสามารถปรับเปลี่ยนพวกเขาในการให้อภัย

ตัวอย่างเช่นคุณพูดถึงเกมบนโต๊ะ หากคุณมีเกมที่ใช้ D&D คุณอาจมีweapon_damageไฟล์ที่มีบรรทัดเช่นBattleaxe: 1d12นี้ รหัสยูทิลิตี้ของคุณจะอ่านไฟล์ที่และเมื่อใดก็ตามที่ความเสียหายที่ได้รับการจัดการโดยBattleaxeรหัสของคุณจะgenerate a number from 1-12, 1 time(s)และเพิ่มพวกเขา การปรับแต่งบรรทัดเพื่ออ่านBattleaxe: 4d6จะเป็นการgenerate a number from 1-6, 4 time(s)เพิ่มและเพิ่มเข้าไปแทน ในทำนองเดียวกันคุณสามารถมีโฟลเดอร์Creaturesและภายในคุณมีไฟล์สำหรับสิ่งมีชีวิตแต่ละรายการรวมถึงบรรทัดที่ชอบAC: 12; จากนั้นการเพิ่มไฟล์ใหม่ไปยังโฟลเดอร์นั้นจะสร้างสิ่งมีชีวิตใหม่ มันสามารถทำได้สำหรับชั้นเรียนของตัวละครประเภทภูมิประเทศสิ่งต่าง ๆ มากมาย

การปรับแต่งที่ไม่ใช่โค้ดลักษณะนี้ยังคงมีประสิทธิภาพมากและครอบคลุมเกมของคุณเป็นจำนวนมาก อย่างไรก็ตามสิ่งนี้ไม่อนุญาตให้ผู้ใช้ทำการเปลี่ยนแปลงที่คุณไม่ได้ระบุอย่างชัดเจน ตัวอย่างเช่นคุณอาจอนุญาตSneak Attack: [damage]ให้สิ่งมีชีวิตหรือคลาส[damage]ใด ๆ เพื่อเพิ่มการโจมตีใด ๆ ที่ตรงตามเงื่อนไขสำหรับการโจมตีแบบแอบแฝง คุณยังสามารถให้วิธีในการเปลี่ยนแปลงเงื่อนไขเช่น "เมื่อใดก็ตามที่คุณโจมตีจากการลักลอบ" หรือ "เมื่อใดก็ตามที่คุณขนาบ" หรือ "เมื่อใดก็ตามที่คุณมีข้อได้เปรียบ" อย่างไรก็ตามหากผู้ใช้ตัดสินใจว่าพวกเขาต้องการให้การโจมตีที่แอบ "เมื่อคุณทำการโจมตีม้วนคุณยังสามารถม้วนการลักลอบกับการรับรู้ของเป้าหมายหากทั้งสองม้วนประสบความสำเร็จแล้วเพิ่มความเสียหายแอบโจมตี"

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


ใช่ฉันต้องอนุญาตให้พวกเขาเพิ่มกลไกใหม่เช่นกันเพียงแค่ปรับค่าบางอย่างจะไม่ทำ ฉันคิดว่านี่อาจต้องใช้ภาษาแยกต่างหากฉันแค่คิดว่าอาจจะมีภาษาที่ฉันสามารถใช้ในรหัสยูทิลิตี้ Python ของฉันแล้ว
อก

@tis คุณคิดว่า Wikipedia มีอะไรในหัวข้อนี้บ้าง? en.wikipedia.org/wiki/Logic_programming
ttbek

0

[ฉันเป็นนักพัฒนาซอฟต์แวร์มานานหลายทศวรรษ แต่ไม่มีประสบการณ์ในการพัฒนาเกมดังนั้นอุตสาหกรรมเกมอาจใช้วิธีการที่แตกต่างกันอาจเป็นเพราะเหตุผลที่ดี ... ]

แนวทางของคุณเหมาะสมกับฉันอย่างยิ่ง แกนกลางให้ฟังก์ชันการทำงานพื้นฐานที่กลไกและกฎสร้างขึ้นดังนั้นจึงเป็น API ที่ใช้โดยส่วนประกอบระดับสูง

และเมื่อออกแบบ API แนวทางที่ฉันชอบคือการสร้างภาษาที่คุณต้องการแสดงรหัสระดับที่สูงกว่าของคุณใน (แน่นอนโดยมีข้อ จำกัด ทางไวยากรณ์ของภาษาโปรแกรมของคุณ)

ดังนั้นวิธีการที่ดีคือการเขียนกฎและกลศาสตร์เชิงสมมุติในแบบที่คุณต้องการให้แสดงออก (โดยใช้ไวยากรณ์ของ Python) ดังนั้นค้นหาสิ่งที่คุณต้องการให้ API หลักจัดทำกับกฎและกลไก ชั้น

และแน่นอนฉันขอแนะนำให้ดูสิ่งอำนวยความสะดวกด้านการเขียนสคริปต์ของเกมที่มีอยู่เพื่อทำความเข้าใจกับสิ่งที่พวกเขาทำ

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