ในบางจุดเครื่องยนต์ต้องมีความเชี่ยวชาญและมีความรู้เกี่ยวกับเกม ฉันจะไปแทนเจนต์ที่นี่
ใช้ทรัพยากรใน RTS เกมหนึ่งอาจมีCredits
และเกมCrystal
อื่นMetal
และPotatoes
คุณควรใช้แนวคิด OO อย่างถูกต้องและดำเนินการให้ได้สูงสุด รหัสนำมาใช้ใหม่ เป็นที่ชัดเจนว่าแนวคิดของการResource
มีอยู่ที่นี่
ดังนั้นเราจึงตัดสินใจว่าทรัพยากรมีดังต่อไปนี้:
- เบ็ดในห่วงหลักเพื่อเพิ่ม / ลดลงด้วยตนเอง
- วิธีรับจำนวนเงินปัจจุบัน (ส่งคืน
int
)
- วิธีการลบ / เพิ่มตามอำเภอใจ (ผู้เล่นโอนทรัพยากรซื้อ .... )
ขอให้สังเกตว่าความคิดในเรื่องนี้Resource
อาจหมายถึงการฆ่าหรือแต้มในเกม! มันไม่ได้ทรงพลังมาก
ตอนนี้ลองคิดเกี่ยวกับเกม เราสามารถเรียงลำดับของสกุลเงินได้โดยการซื้อขายเป็นสกุลเงินและเพิ่มจุดทศนิยมไปยังผลลัพธ์ สิ่งที่เราไม่สามารถทำได้คือทรัพยากร "ทันที" ชอบพูดว่า "การสร้างกริดพลังงาน"
ให้บอกว่าคุณเพิ่ม InstantResource
คลาสด้วยวิธีการที่คล้ายกัน ตอนนี้คุณ (เริ่มต้น) สร้างมลพิษให้เครื่องยนต์ด้วยทรัพยากร
ปัญหา
ให้นำตัวอย่าง RTS อีกครั้ง สมมติว่าผู้เล่นคนใดบริจาคCrystal
ให้ผู้เล่นคนอื่น คุณต้องการทำสิ่งที่ชอบ:
if(transfer.target == engine.getPlayerId()) {
engine.hud.addIncoming("You got "+transfer.quantity+" of "+
engine.resourceDictionary.getNameOf(transfer.resourceId)+
" from "+engine.getPlayer(transfer.source).name);
}
engine.getPlayer(transfer.target).getResourceById(transfer.resourceId).add(transfer.quantity)
engine.getPlayer(transfer.source).getResourceById(transfer.resourceId).add(-transfer.quantity)
อย่างไรก็ตามมันค่อนข้างยุ่งจริงๆ มันมีวัตถุประสงค์ทั่วไป แต่ยุ่ง ถ้าอย่างนั้นก็resourceDictionary
หมายความว่าทรัพยากรของคุณต้องมีชื่อ! และมันก็เป็นต่อผู้เล่นดังนั้นคุณไม่สามารถมีทรัพยากรทีมได้อีกต่อไป
นี่คือสิ่งที่เป็นนามธรรมมากเกินไป (ไม่ใช่ตัวอย่างที่ยอดเยี่ยมที่ฉันจะยอมรับ) แทนที่จะเป็นจุดที่คุณยอมรับว่าเกมของคุณมีผู้เล่นและคริสตัลจากนั้นคุณก็สามารถมี (ตัวอย่าง)
engine.getPlayer(transfer.target).crystal().receiveDonation(transfer)
engine.getPlayer(transfer.source).crystal().sendDonation(transfer)
ด้วยคลาสPlayer
และคลาสCurrentPlayer
ที่CurrentPlayer
's crystal
วัตถุจะแสดงสิ่งที่อยู่บนฮัดสำหรับการโอน / ส่งของการบริจาค
สิ่งนี้ทำให้เครื่องยนต์เสียมลภาวะด้วยคริสตัลการบริจาคคริสตัลข้อความบน HUD สำหรับผู้เล่นปัจจุบันและทุกสิ่ง มันทั้งเร็วและง่ายต่อการอ่าน / เขียน / บำรุงรักษา (ซึ่งสำคัญกว่าเพราะมันไม่เร็วกว่าอย่างมาก)
หมายเหตุสุดท้าย
กรณีทรัพยากรไม่ได้ยอดเยี่ยม ฉันหวังว่าคุณจะยังคงเห็นประเด็นนี้อยู่ หากมีสิ่งใดที่ฉันได้แสดงให้เห็นว่า"ทรัพยากรไม่ได้อยู่ในเอนจิ้น"เป็นสิ่งที่เกมต้องการโดยเฉพาะและสิ่งที่สามารถนำไปใช้ได้กับแนวคิดเรื่องทรัพยากรทั้งหมดนั้นต่างกันมาก สิ่งที่คุณมักจะพบคือ "เลเยอร์" 3 (หรือ 4)
- "Core" - นี่คือคำจำกัดความของตำราเรียนของเอ็นจิ้นมันเป็นกราฟฉากที่มีตะขอเหตุการณ์มันเกี่ยวข้องกับ shaders และแพ็กเก็ตเครือข่ายและแนวคิดที่เป็นนามธรรมของผู้เล่น
- "GameCore" - เป็นเกมที่ค่อนข้างธรรมดาสำหรับประเภทของเกม แต่ไม่ใช่สำหรับเกมทั้งหมด - ตัวอย่างเช่นทรัพยากรใน RTS หรือกระสุนใน FPS ตรรกะของเกมเริ่มซึมเข้าไปที่นี่ นี่คือที่ความคิดก่อนหน้าของทรัพยากรของเราจะเป็น เราได้เพิ่มสิ่งเหล่านี้ที่เหมาะสมกับทรัพยากร RTS ส่วนใหญ่
- "GameLogic" โดยเฉพาะกับเกมที่เกิดขึ้นจริง คุณจะพบตัวแปรที่มีชื่อเหมือน
creature
หรือหรือship
squad
ใช้มรดกคุณจะได้รับการเรียนที่ครอบคลุมทั้งหมด 3 ชั้น (ตัวอย่างเช่นCrystal
เป็น Resource
ซึ่งเป็น GameLoopEventListener
พูด)
- "สินทรัพย์" สิ่งเหล่านี้ไร้ประโยชน์สำหรับเกมอื่น ๆ ยกตัวอย่างเช่นการรวมสคริปต์ AI ในครึ่งชีวิต 2 พวกเขาจะไม่ถูกใช้ใน RTS ด้วยเอ็นจิ้นเดียวกัน
สร้างเกมใหม่จากเอนจิ้นเก่า
นี่เป็นเรื่องธรรมดามาก ขั้นตอนที่ 1 คือการตัดเลเยอร์ 3 และ 4 (และ 2 ถ้าเกมเป็นประเภทที่แตกต่างกันโดยสิ้นเชิง) สมมติว่าเรากำลังสร้าง RTS จาก RTS เก่า เรายังมีทรัพยากรไม่ใช่คริสตัลและสิ่งของดังนั้นคลาสพื้นฐานในเลเยอร์ 2 และ 1 จึงยังคงมีเหตุผลคริสตัลทั้งหมดที่อ้างอิงใน 3 และ 4 สามารถถูกละทิ้งได้ ดังนั้นเราทำ อย่างไรก็ตามเราอาจตรวจสอบว่ามันเป็นข้อมูลอ้างอิงสำหรับสิ่งที่เราต้องการจะทำ
มลพิษในชั้นที่ 1
สิ่งนี้สามารถเกิดขึ้นได้ สิ่งที่เป็นนามธรรมและประสิทธิภาพเป็นศัตรู ยกตัวอย่างเช่น UE4 มีกรณีที่เหมาะสมที่สุดในการจัดองค์ประกอบ (ดังนั้นถ้าคุณต้องการให้ X และ Y มีคนเขียนโค้ดที่ทำ X และ Y ด้วยกันเร็วมาก - มันรู้ว่ามันกำลังทำทั้งสองอย่าง) และผลก็ค่อนข้างใหญ่จริงๆ สิ่งนี้ไม่เลว แต่ใช้เวลานาน เลเยอร์ 1 จะตัดสินใจในสิ่งต่าง ๆ เช่น "คุณส่งข้อมูลไปยังผู้ที่แรเงา" และเคลื่อนไหวอย่างไร การทำสิ่งที่ดีที่สุดสำหรับโครงการของคุณคือทำดีอยู่เสมอ เพียงลองและวางแผนในอนาคตการใช้รหัสซ้ำคือเพื่อนของคุณสืบทอดตำแหน่งที่เหมาะสม
การจำแนกเลเยอร์
สุดท้าย (ฉันสัญญา) อย่ากลัวเลเยอร์เกินไป Engine เป็นคำคร่ำครึจากสมัยก่อนของฟังก์ชั่นคงที่ซึ่งเครื่องยนต์ทำงานได้ดีในลักษณะเดียวกับกราฟิก ด้วยผลกระทบอะไรก็ตามที่นักพัฒนาต้องการที่จะบรรลุ AI นั้นเป็นคุณสมบัติที่แตกต่าง (เพราะมีวิธีการมากมาย) ของเครื่องยนต์ตอนนี้ก็คือ AI และกราฟิก
ไม่ควรกรอกรหัสของคุณในเลเยอร์เหล่านี้ แม้แต่เอนจิ้น Unreal ที่โด่งดังก็มีเวอร์ชั่นที่แตกต่างกันมากมายสำหรับแต่ละเกม มีไฟล์ไม่กี่ไฟล์ (นอกเหนือจากโครงสร้างข้อมูลเช่นนั้น) ที่จะไม่เปลี่ยนแปลง ไม่เป็นไร! หากคุณต้องการสร้างเกมใหม่จากเกมอื่นมันใช้เวลานานกว่า 30 นาที กุญแจสำคัญคือการวางแผนที่จะรู้ว่าบิตที่จะคัดลอกและวางและสิ่งที่จะทิ้ง