ฉันและวิธีแยกความกังวลของอินพุตและออบเจ็กต์เกมหรือไม่?


20

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

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

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

คุณใช้กลยุทธ์อะไรในการจัดการสิ่งนี้?

คำตอบ:


7

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

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

ใช้ตัวควบคุมอินพุตเพื่อติดตามสถานะอินพุต:

Up press event   -> dir = up
Down press event -> dir = down

เมื่อใดก็ตามที่สถานะอินพุตเปลี่ยนแปลงให้ประเมินว่าอ็อบเจ็กต์เกมพร้อมที่จะแก้ไขหรือไม่:

set dir  ->  if gamestate != paused && battlemode == false
             ->  character.changeDir(dir);

ใช้วิธีการทั่วไปบนวัตถุในเกมของคุณที่สามารถเรียกใช้โดยตัวควบคุมอินพุตหรือวัตถุเกมอื่น ๆ ตามต้องการ:

changeDir (dir)
setSpeed (walk/run)

7

ฉันแนะนำวิธี MVC ใน MVC วัตถุของเกมจะต้องกังวลเกี่ยวกับการสร้างแบบจำลองระบบเกมและให้อินเทอร์เฟซระดับสูงเช่น move_left จากนั้นมีวัตถุคอนโทรลเลอร์ที่กังวลเกี่ยวกับการแมปอินพุตกับการเรียกโมเดล ไม่เพียง แต่จะอนุญาตให้เปลี่ยนการควบคุมได้ง่าย แต่ยังให้ส่วนต่อประสานที่ดีสำหรับ AI พวกมันเป็นเพียงตัวควบคุมอื่น

ในตัวเลือกที่สองของคุณฉันจะแยกอินพุต - คอนโทรลเลอร์เป็นสองส่วนส่วนหนึ่งที่จัดการกับการสัมผัสอุปกรณ์จริงแป้นพิมพ์แอคเซลหรืออะไรก็ตามที่คุณสามารถโยนได้ จากนั้นมีส่วนที่สองที่แมปอินพุตทั่วไปเข้ากับอินพุตเฉพาะของเกม พูดแป้นพิมพ์ขึ้นแผนที่ลูกศรเพื่ออินพุต 1 จากนั้นแตะที่ด้านบนของหน้าจอสัมผัสและแผนที่ไปยังอินพุต 1 เช่นกันตอนนี้คุณเขียนชิ้นที่สองที่แมปอินพุต 1 เพื่อกระโดด ตอนนี้คุณสามารถแมปอุปกรณ์ IO ใด ๆ เช่นเดียวกับการเล่นที่เก็บไว้หรืออินพุต AI กับระบบอินพุตทั่วไปนี้และมีส่วนเฉพาะของเกมขนาดเล็กที่โหลดสิ่งที่อินพุต 1 หมายถึงโมเดล


5
มีการถกเถียงกันมากมายในเว็บไซต์นี้ว่าทำไม MVC จึงไม่ใช่รูปแบบที่เหมาะสมสำหรับเกม สิ่งที่ stonemetal อธิบายไม่ใช่แม้แต่ MVC มันเป็นเพียงนามธรรม และ "Use MVC" ไม่ใช่คำตอบเนื่องจาก MVC เป็นคำอธิบายของสถาปัตยกรรมทั้งชั้นและไม่ใช่วิธีการเฉพาะในการแยกข้อกังวล (หรือวิธีเดียวในการทำ)

2
MVC ควรให้เขา A) บทความวิกิพีเดียเพื่ออ่าน B) ความหลากหลายของวิธีการแก้ปัญหาที่แสดงให้เห็นว่าใช้งานได้ C) ฉันพูดถึงวิธีที่ฉันจะตั้งค่าในแบบจำลองที่เปิดเผยอินเตอร์เฟสระดับสูงที่ ตัวควบคุมแมปอินพุตระดับต่ำ (จริงหรือสังเคราะห์) กับแอ็คชั่นระดับสูงและปรับเปลี่ยนโมเดลโดยตรงแทนที่จะใช้ระบบอีเวนติ้งบางระบบ
stonemetal

1

ฉันอยากจะแนะนำให้เกมของคุณ (ตัวแบบ ) กำหนดรายการเหตุการณ์ที่เป็นไปได้ (นำมาใช้เป็น enums หรือวัตถุที่มีอินเตอร์เฟสพื้นฐานเหมือนกัน) สิ่งต่างๆเช่นMovingRightStarted, MovingRightStopped, FiredWeapon1, Escapeฯลฯ ...

เกมกำหนดโครงสร้างข้อมูล (ตัวอย่างเช่นqueue) ที่ใส่รหัสคุณ ( ควบคุม ) สามารถกรอกกับเหตุการณ์การป้อนข้อมูล

จากนั้นเกมของคุณสามารถสำรวจโครงสร้างข้อมูลเพื่อรับเหตุการณ์อินพุต

ด้วยวิธีนี้คุณสามารถเสียบตัวควบคุมชนิดต่าง ๆ เพื่อป้อนรุ่น:

  • แป้นพิมพ์เท่านั้น
  • แป้นพิมพ์ + เมาส์
  • จอยสติ๊ก
  • หน้าจอสัมผัส
  • ปัญญาประดิษฐ์

คุณเพียงแค่มีพวกเขาที่จะผลักดันกิจกรรมการป้อนข้อมูลให้กับรูปแบบ


ฉันคิดว่าฉันเข้าใจสิ่งที่คุณหมายถึงยกเว้นคุณเลือกqueueเป็นประเภทข้อมูลในการจัดเก็บนี้ คุณช่วยอธิบายได้ไหม
Robert Massa

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