อัปเดต (ปะยาง)
เนื่องจากฉันได้เขียนคำตอบที่ค่อนข้างละเอียดนี่คือสิ่งที่ทำให้ทุกอย่างเดือดลงไป:
- เนมสเปซนั้นดีใช้เมื่อใดก็ตามที่เหมาะสม
- การใช้
inGameIO
และplayerIO
คลาสอาจเป็นความผิดของ SRP เป็นไปได้ว่าคุณกำลังเชื่อมต่อวิธีที่คุณจัดการกับ IO ด้วยตรรกะแอปพลิเคชัน
- มีคลาส IO ทั่วไปสองชั้นที่ใช้ (หรือบางครั้งใช้ร่วมกัน) โดยคลาสตัวจัดการ คลาสตัวจัดการเหล่านี้จะแปลอินพุตดิบเป็นรูปแบบที่แอปพลิเคชันของคุณสามารถเข้าใจได้
- กันไปสำหรับผลลัพธ์: สิ่งนี้สามารถทำได้โดยการเรียนทั่วไปค่อนข้าง แต่ผ่านรัฐเกมผ่านวัตถุตัวจัดการ / ผู้ทำแผนที่ที่แปลสถานะเกมภายในเป็นสิ่งที่เรียน IO ทั่วไปสามารถจัดการ
ฉันคิดว่าคุณกำลังดูสิ่งนี้ในทางที่ผิด คุณกำลังแยก IO ออกมาในฟังก์ชั่นของส่วนประกอบของแอปพลิเคชั่นในขณะที่ - สำหรับฉันแล้วมันสมเหตุสมผลกว่าที่จะมีคลาส IO แยกกันตามแหล่งที่มาและ"type"ของ IO
มีKeyboardIO
คลาสพื้นฐาน / คลาสทั่วไปMouseIO
เพื่อเริ่มต้นด้วยและจากนั้นตามเวลาและสถานที่ที่คุณต้องการมีคลาสย่อยที่จัดการ IO ที่แตกต่างกัน
ตัวอย่างเช่นการป้อนข้อความเป็นสิ่งที่คุณอาจต้องการจัดการกับตัวควบคุมในเกมที่แตกต่าง คุณจะพบว่าตัวเองต้องการแมปบางคีย์แตกต่างกันไปขึ้นอยู่กับแต่ละกรณีการใช้งาน แต่การทำแผนที่นั้นไม่ได้เป็นส่วนหนึ่งของ IO นั่นเป็นวิธีที่คุณจัดการกับ IO
ติดกับ SRP ฉันมีสองคลาสที่ฉันสามารถใช้สำหรับคีย์บอร์ด IO ขึ้นอยู่กับสถานการณ์ฉันอาจต้องการโต้ตอบกับคลาสเหล่านี้แตกต่างกัน แต่งานเดียวของพวกเขาคือบอกฉันว่าผู้ใช้ทำอะไร
จากนั้นฉันจะฉีดวัตถุเหล่านี้ลงในวัตถุตัวจัดการที่จะแมป IO ดิบบนสิ่งที่ตรรกะการใช้งานของฉันสามารถทำงานกับ (เช่น: ผู้ใช้กด"w"ตัวจัดการแผนที่ที่ลงบนMOVE_FORWARD
)
ตัวจัดการเหล่านี้จะถูกใช้เพื่อให้ตัวละครเคลื่อนไหวและวาดหน้าจอตามลำดับ การอนุมานรวมขั้นต้น แต่ส่วนสำคัญของมันคือโครงสร้างชนิดนี้:
[ IO.Keyboard.InGame ] // generic, if SoC and SRP are strongly adhered to, changing this component should be fairly easy to do
||
==> [ Controls.Keyboard.InGameMapper ]
[ Game.Engine ] <- Controls.Keyboard.InGameMapper
<- IO.Screen
<- ... all sorts of stuff here
InGameMapper.move() //returns MOVE_FORWARD or something
||
==> 1. Game.updateStuff();//do all the things you need to do to move the character in the given direction
2. Game.Screen.SetState(GameState); //translate the game state (inverse handler)
3. IO.Screen.draw();//generate actual output
สิ่งที่เรามีตอนนี้คือคลาสที่รับผิดชอบคีย์บอร์ด IO ในรูปแบบดิบ คลาสอื่นที่แปลข้อมูลนี้เป็นสิ่งที่เอ็นจิ้นเกมสามารถเข้าใจได้จริงแล้วข้อมูลนี้จะถูกใช้เพื่ออัปเดตสถานะของส่วนประกอบทั้งหมดที่เกี่ยวข้อง
ทุกคลาสมีหน้าที่เดียว: การจัดการคีย์บอร์ดอินพุตทำได้โดยคลาสที่ไม่รู้ / ดูแล / ต้องรู้ว่าการประมวลผลอินพุตนั้นหมายถึงอะไร สิ่งที่มันรู้ก็คือวิธีรับอินพุต (บัฟเฟอร์, ไม่บัฟเฟอร์, ... )
ตัวจัดการแปลสิ่งนี้เป็นตัวแทนภายในสำหรับแอปพลิเคชั่นที่เหลือเพื่อให้เข้าใจถึงข้อมูลนี้
เอ็นจิ้นของเกมใช้ข้อมูลที่ถูกแปลและใช้เพื่อแจ้งให้ทราบถึงส่วนประกอบที่เกี่ยวข้องทั้งหมดที่มีบางอย่างเกิดขึ้น แต่ละองค์ประกอบเหล่านี้ทำสิ่งเดียวไม่ว่าจะเป็นการตรวจสอบการชนกันของภาพหรือการเคลื่อนไหวของตัวละครมันไม่สำคัญเลยว่าจะลงไปที่แต่ละวัตถุ
จากนั้นวัตถุเหล่านี้จะถ่ายทอดสถานะของพวกเขากลับมาและข้อมูลนี้จะถูกส่งผ่านไปGame.Screen
ซึ่งเป็นตัวจัดการ IO ที่ตรงกันข้าม มันแมปการเป็นตัวแทนภายในกับสิ่งที่IO.Screen
ส่วนประกอบสามารถใช้ในการสร้างผลลัพธ์ที่แท้จริง