ฉันกำลังทำงานในเกมตัวต่อที่ง่าย
การเล่นเกมประกอบไปด้วยบล็อกที่เคลื่อนไหวได้ค่อนข้างมากในบริเวณเกมดังนั้นมันเป็นการจำลองทางฟิสิกส์ที่ไม่สำคัญ อย่างไรก็ตามการใช้งานของฉันอยู่ในความคิดของฉันไกลจากอุดมคติและฉันสงสัยว่าถ้าคุณสามารถให้คำแนะนำกับฉันเกี่ยวกับวิธีที่จะทำให้ดีขึ้น
ฉันแบ่งรหัสออกเป็นสองส่วน: ตรรกะของเกมและ UI อย่างที่ฉันทำกับเกมปริศนามากมาย:
- ตรรกะของเกมรับผิดชอบกฎทั่วไปของเกม (เช่นระบบกฎอย่างเป็นทางการในหมากรุก)
- UI แสดงพื้นที่เกมและชิ้นส่วน (เช่นกระดานหมากรุกและชิ้นส่วน) และรับผิดชอบภาพเคลื่อนไหว (เช่นการเคลื่อนไหวของชิ้นส่วนหมากรุก)
ตรรกะของเกมแสดงถึงสถานะของเกมเป็นตารางตรรกะซึ่งแต่ละหน่วยเป็นความกว้าง / ความสูงของเซลล์หนึ่งในตาราง ดังนั้นสำหรับกริดที่มีความกว้าง 6 คุณสามารถย้ายบล็อกของความกว้าง 2 ได้สี่ครั้งจนกว่ามันจะชนกับขอบเขต
UI ใช้กริดนี้และวาดโดยการแปลงขนาดโลจิคัลเป็นขนาดพิกเซล (นั่นคือคูณด้วยค่าคงที่) อย่างไรก็ตามเนื่องจากเกมแทบจะไม่ได้มีตรรกะของเกมเลยเลเยอร์ตรรกะในเกมของฉัน [1] จึงไม่ต้องทำอะไรมากมายนอกจากการตรวจจับการชน นี่คือวิธีการทำงาน:
- ผู้เล่นเริ่มลากชิ้นส่วน
- UI ถามตรรกะของเกมสำหรับพื้นที่การเคลื่อนไหวทางกฎหมายของชิ้นส่วนนั้นและให้ผู้เล่นลากมันภายในพื้นที่นั้น
- ผู้เล่นปล่อยชิ้นส่วนไป
- UI จัดเรียงส่วนเข้ากับกริด (เพื่อให้อยู่ในตำแหน่งตรรกะที่ถูกต้อง)
- UI บอกตรรกะของเกมถึงตำแหน่งโลจิคัลใหม่ (ผ่านวิธีการเปลี่ยนแปลงซึ่งฉันควรหลีกเลี่ยง)
ฉันไม่ค่อยมีความสุขกับสิ่งนั้น:
- ฉันกำลังเขียนการทดสอบหน่วยสำหรับเลเยอร์เกมตรรกะของฉัน แต่ไม่ใช่ UI และมันกลับกลายเป็นว่ารหัสที่ยุ่งยากทั้งหมดนั้นอยู่ใน UI: การหยุดชิ้นส่วนจากการชนกับผู้อื่นหรือขอบเขตและสแนปอินตาราง
- ฉันไม่ชอบความจริงที่ว่า UI บอกตรรกะของเกมเกี่ยวกับสถานะใหม่ฉันอยากให้มันเรียก
movePieceLeft()
วิธีการหรืออะไรทำนองนั้นเหมือนในเกมอื่น ๆ ของฉัน แต่ฉันไม่ได้ไปไกลเพราะมันเข้าใกล้ ตรรกะของเกมรู้อะไรเกี่ยวกับการลากและหักมุมที่เป็นไปได้ใน UI
ฉันคิดว่าสิ่งที่ดีที่สุดที่จะทำคือกำจัดชั้นตรรกะของเกมและใช้เลเยอร์ฟิสิกส์แทน ฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้:
- เลเยอร์ฟิสิกส์เป็นเรื่องธรรมดาหรือเป็นเรื่องธรรมดามากกว่าที่จะให้เลเยอร์เกมลอจิกทำเช่นนี้?
- การสแนปไปยังกริดและรหัสการลากชิ้นส่วนจะเป็นของ UI หรือเลเยอร์ฟิสิกส์หรือไม่
- เลเยอร์ฟิสิกส์แบบนี้จะทำงานกับขนาดพิกเซลหรือหน่วยทางลอจิคัลบางประเภทเช่นเลเยอร์ตรรกะเกมของฉันหรือไม่
- ฉันเคยเห็นการตรวจจับการชนกันของเหตุการณ์ในฐานรหัสของเกมหนึ่งครั้งนั่นคือผู้เล่นจะลากชิ้นส่วน UI จะแสดงผลอย่างเชื่อฟังและแจ้งให้ทราบถึงระบบฟิสิกส์และระบบฟิสิกส์จะเรียกวิธี onCollision () บนชิ้นงานเมื่อตรวจพบการชน เป็นเรื่องธรรมดามากขึ้น? วิธีนี้หรือขอพื้นที่เคลื่อนไหวทางกฎหมายก่อน?
[1] เลเยอร์อาจไม่ใช่คำที่ถูกต้องสำหรับสิ่งที่ฉันหมายถึง แต่ระบบย่อยฟังดูไม่น่าเชื่อและคลาสก็เข้าใจผิดเพราะแต่ละชั้นอาจประกอบด้วยหลายชั้น