ฉันต้องการสร้างเกมที่ปรับเปลี่ยนได้ สิ่งนี้มีผลต่อการเลือกภาษาการเขียนโปรแกรมของฉันอย่างไร? [ปิด]


26

ฉันเริ่มเกมเล็ก ๆ ใน Java และฉันกำลังพิจารณาการเรียนรู้ C # สำหรับโครงการขนาดใหญ่ ฉันอยากทำเกม moddable มาก แต่มีคนบอกฉันว่าฉันต้องติดกับ Java ถ้าฉันต้องการให้เกมนั้นเป็น moddable แม้ว่าฉันจะไม่เข้าใจว่าทำไม

ดังนั้นลักษณะของภาษาการเขียนโปรแกรมใดทำให้ภาษาเหมาะกับเกมที่ปรับเปลี่ยนได้มากขึ้น?


3
หากคุณต้องการสร้างเกมที่ปรับเปลี่ยนได้ PhysicsFSอาจเป็นคลังที่มีประโยชน์มากที่คุณควรรู้ (มันไม่มีส่วนเกี่ยวข้องกับวิชาฟิสิกส์อย่าปล่อยให้ชื่อหลอกคุณ :))
Paul Manta

10
"แต่มีคนบอกฉันว่าฉันต้องติดกับ Java ถ้าฉันต้องการให้เกมสามารถแก้ไขได้" นี่คือ BS
Ray Dey

คำตอบ:


18

ขึ้นอยู่กับว่าคุณต้องการออกแบบระบบ mod ของคุณอย่างไร ฉันจะสำรวจพวกเขาสองคน

SDK

เป็นไปได้ว่าคุณจะต้องให้ mod Mod ใช้ภาษาเดียวกับที่คุณทำและโหลด mods ผ่านการสะท้อน (หรือคล้ายกันขึ้นอยู่กับภาษาที่คุณเลือก) สิ่งนี้จะ จำกัด คุณไว้เฉพาะภาษาที่สามารถผูกมัดช้าและมีหลายอย่างที่สามารถทำได้ (แม้แต่ C สามารถผูกสายช้ากับLoadLibraryเล่ห์เหลี่ยมที่ฉลาด) คุณสามารถทำ meta-modding บางตัวซึ่ง mod สามารถโฮสต์ mods อื่น ๆ (เช่น mods ที่เขียนด้วยสคริปต์)

ปัญหาแรกของวิธีนี้คือการซ่อนสถานะภายใน ยกตัวอย่าง C # ที่ modder สามารถใช้การไตร่ตรองเพื่อเข้าถึงสมาชิกส่วนตัว C สามารถทำได้เช่นกัน (แม้ว่าจะต้องใช้ความพยายามมากขึ้น)

ปัญหาที่สองคือการโฮสต์ ผู้คนไม่ชอบโค้ดต่างประเทศที่ทำงานบนระบบของพวกเขาโดยไม่มี Sandbox อยู่ ในสถานการณ์ที่เลวร้ายที่สุดคุณสามารถเขียน mod ที่ตั้งค่า seedbox ได้ ถ้าสิ่งนี้ถูกติดตั้งที่ ISP มันอาจทำอันตรายร้ายแรงต่อชื่อเสียงของพวกเขาได้

การเขียนสคริปต์

Modders จะใช้ภาษาเช่น Lua เพื่อสร้าง mods คุณอาจต้องการภาษาที่สามารถเรียกใช้เนทีฟ (เพื่อติดต่อกับ Lua) หรือคุณจะต้องเขียนภาษาสคริปต์ของคุณเองในภาษาที่คุณเลือก

ปัญหาแรกที่นี่คือภาษาสคริปต์ส่วนใหญ่ตีความซึ่งอาจไม่เป็นที่ยอมรับสำหรับระบบเรียลไทม์ (แม้ว่าดู LuaJIT) เช่นเกม

แดกดันปัญหาที่สองยังคงมีอยู่ที่นี่; การ Lua เป็นตัวอย่างผมผิดหวังมากที่เป็นมี 'ปลอกกระสุนออก' ฟังก์ชั่นรวมอยู่ในห้องสมุด core / เริ่มต้น - ทำให้ไร้ประโยชน์โดยสิ้นเชิงเป็นสภาพแวดล้อม sandboxed (โดยไม่ต้องเป็นจำนวนมากของความพยายามโชคและการบำรุงรักษา) มันยากที่จะ วาดภาพวิธีโกรธผมเกี่ยวกับเรื่องนี้ แต่ผมหวังว่าพวกเขากำลังดื่มค็อกเทลบางอย่างเมื่อพวกเขารวมถึงคุณสมบัติการต่อต้านการเหล่านี้ เห็นได้ชัดว่าคุณสามารถหลีกเลี่ยงปัญหานี้ได้อย่างง่ายดายหากคุณใช้ภาษาของคุณเอง (ดู: UnrealScript)

ในที่สุดค่าใช้จ่ายในการมีปฏิสัมพันธ์กับเอ็นจิ้นการเขียนสคริปต์อาจเป็นสิ่งต้องห้าม - นำตัวอย่าง Lua มารวมกับ C #: C # มีค่าใช้จ่ายจำนวนมากเมื่อเรียกใช้ฟังก์ชั่นดั้งเดิม (ผ่าน P / Invoke) และ Lua เป็น API แบบ 'ช่างพูด' สิ่งนี้อาจนำไปสู่ปัญหาได้หากวิธีที่คุณออกแบบ 'สคริปต์ SDK' ต้องการการสนทนาระหว่างภาษาหลักของคุณกับภาษาสคริปต์ของคุณ (โปรดทราบว่า C ไม่มีปัญหานี้จริงๆ) คุณสามารถหลบสิ่งนี้ได้โดยการเขียนภาษาสคริปต์ของคุณเอง (และในกรณีของการคอมไพล์ภาษา C # เป็น MSIL) และดำเนินการด้วยวิธีที่เร็วที่สุดภายใต้สภาพแวดล้อม [เสมือน] ของคุณ

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

ข้อสรุป

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


ในสถานการณ์แรกที่คุณอธิบายคุณกำลังพูดถึงผู้ใช้งานจริงในการเขียนโปรแกรมไลบรารีแบบไดนามิกของเขาและเสียบเข้ากับเกม? ฉันเคยเห็นสิ่งนี้มาก่อนในไลบรารี (เช่นไลบรารีเสียงเพื่อเพิ่มตัวแปลงสัญญาณใหม่ ฯลฯ ) แต่อาจเป็นเพราะฉันไม่เคยดู modding มากเกินไปฉันไม่เคยเจอกรณีแบบนี้สำหรับเกม ฉันอยากรู้เกี่ยวกับเรื่องนี้ (เพราะมันยากสำหรับผู้ใช้ที่จะรู้วิธีการทำและฉันมักจะเห็น mods ว่าสามารถเข้าถึงได้) เพื่อให้คุณรู้ตัวอย่างใด ๆ ? เวลาส่วนใหญ่ฉันเห็นเครื่องมือพิเศษเช่นบรรณาธิการโลกที่มีการใช้งานสคริปต์เล็กน้อย
David Gouveia

1
@DavidGouveia ฉันเชื่อว่าอย่างน้อยหนึ่งรุ่นของเครื่องยนต์ Paradox ที่ใช้สำหรับ Europa Universalis (และเกมที่เทียบเท่ากันในช่วงเวลาที่แตกต่างกัน) รองรับรูปแบบของการปะแบบไบนารี (แม้ว่ามันอาจจะเป็นเพราะ modder patch เป็นแหล่งที่มาของ เกม DLLs แทนการรองรับ SDK ที่เหมาะสม) นอกเหนือจาก mod ที่ใช้บ่อยโดยเปลี่ยนการใช้ไฟล์ข้อมูล
Dan Neely

2
@DavidGouveia ดู: Source engine; หรือแม้แต่ปลั๊กอิน Winamp ฉันคิดว่า Quake ใช้งานได้เช่นนี้ ฉันรวบรวมว่าคุณใช้ C #; ดังนั้นคุณอาจต้องการมองหา MEF (Managed Extensibility Framework): เปิดเผยอินเทอร์เฟซโหลดมันผ่านการสะท้อนและบ๊อบลุงของคุณ
Jonathan Dickinson

@ JonathanDickinson โอ้ฉันไม่รู้ว่า Source engine นั้นทำงานภายใต้รุ่นนี้ จินตนาการถึงชุดเครื่องมือเช่นชุดการก่อสร้างม้วนของ The Elder's Scroll ขอบคุณสำหรับข้อมูล (ฉันมีความคิดวิธีการทำงานเพียงแค่คิดว่ามันอาจซับซ้อนเกินไปสำหรับโมเดอเรเตอร์ทั่วไปที่จะใช้) และฉันหัวเราะจริงๆที่ "บ๊อบส่วนคุณลุง" :-)
David Gouveia

1
Re Lua: คนเหล่านี้มี Lua แบบ sandbox ที่เหมาะสำหรับใช้ในซอฟต์แวร์ wiki (และเสถียรพอที่ Wikipedia ภาษาอังกฤษจะใช้) ฉันแน่ใจว่าคุณสามารถปรับให้เข้ากับความต้องการของคุณได้ แต่ส่วนขยายบางส่วนเป็น GPL โปรดตรวจสอบกับทนายความของคุณ
Kevin

16

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

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

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

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


5

ภาษาที่คุณเลือกนั้นไม่ได้กำหนดว่าเกมจะดัดแปลงได้อย่างไรวิธีที่คุณใช้ภาษานั้นมีความสำคัญมากกว่า

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

อย่างไรก็ตามนั่นไม่ได้หมายความว่าจะไม่ใช้สิ่งเหล่านั้นโดยอัตโนมัติทำให้ไม่สามารถดัดแปลงเกมได้ ตัวอย่างเช่น Minecraft ไม่ใช่เกมที่ปรับเปลี่ยนได้มาก แต่มีตัวถอดรหัสที่ดีสำหรับ Java และชุมชนขนาดใหญ่มากสำหรับ Minecraft ดังนั้นเครื่องมือจำนวนมากถูกสร้างขึ้นเพื่อให้ moddable ของ Minecraft (ตัวดัดแปลงหลายตัว, Bukkit) ด้วยเครื่องมือเหล่านี้เป็นไปได้ที่จะดัดแปลง Minecraft (อย่างไรก็ตามอาจเป็นเทคนิคที่ผิดกฎหมายในบางประเทศ)

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


1

Java เหมาะอย่างยิ่งสำหรับการเขียนเกม moddable

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

ตัวเลือกภาษาแบบไดนามิกที่ควรพิจารณา:

  • Groovy - ภาษาจาวาแบบไดนามิกที่ยอดเยี่ยมที่สามารถฝังไว้ในโปรแกรม Java ขนาดใหญ่
  • Clojure - พลังเสียงกระเพื่อมที่ทรงพลังสำหรับ JVM อาจเป็นเรื่องยากสำหรับผู้ควบคุมบางคนที่จะก้าวไปข้างหน้า แต่เป็นภาษาที่ทรงพลังและสามารถฝังตัวได้ง่ายมาก ยังไม่เคยเห็นมันใช้สำหรับการดัดแปลงเกม แต่ไม่มีเหตุผลว่าทำไม
  • Lua - ภาษาสคริปต์ของเกมที่นิยมมาก ฉันเชื่อว่ามีรุ่นสำหรับ JVM ที่คุณสามารถใช้จากภายใน Java (แม้ว่าฉันไม่ได้ลองด้วยตัวเอง)
  • JavaScript - ที่มีอยู่บน JVM ผ่านแรด ทางเลือกที่ค่อนข้างแข็งสำหรับการเขียนสคริปต์เกมเนื่องจากผู้คนจำนวนมากรู้จัก JavaScript บางตัวรวมทั้งโมเดลวัตถุต้นแบบที่เหมาะกับ mods เกมเป็นอย่างดี

-2

มีวิธีที่ง่ายกว่าในการทำเช่นนี้ใน java แม้ว่ามันจะเลอะเทอะเล็กน้อย สิ่งที่คุณต้องทำคือใช้ไฟล์ dot java ในโฟลเดอร์จากนั้นใส่แบทช์ไฟล์นี้กับโฟลเดอร์ตั้งชื่อเรียกใช้:

javac /src/.java Java / src /

หมายเหตุ: คุณสามารถเพิ่มคลาสได้มากเท่าที่คุณต้องการ หมายเหตุ: ในบรรทัดสุดท้ายตรวจสอบให้แน่ใจว่าไม่ได้ใส่ส่วนขยายใด ๆ aka. java, .exe, .bat, ect

โดยทั่วไปแล้วจะทำการคอมไพล์โค้ดใหม่ทุกครั้งที่เกมรันดังนั้นหากแหล่งที่มาของเกมเปลี่ยนไปมันจะทำการคอมไพล์แล้วรันเกมที่คอมไพล์ใหม่ ... น่าเศร้าที่คุณไม่สามารถเพิ่ม mods ของคนอื่นในเกมได้


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