ฉันเพิ่งสร้างเกม Space Invadors ง่ายๆโดยใช้ 'ระบบเอนทิตี' มันเป็นรูปแบบที่แยกคุณลักษณะและพฤติกรรมออกมาได้ดีมาก ฉันต้องใช้การทำซ้ำสองสามครั้งเพื่อทำความเข้าใจอย่างสมบูรณ์ แต่เมื่อคุณได้รับการออกแบบไม่กี่องค์ประกอบมันจะกลายเป็นเรื่องง่ายมากในการเขียนวัตถุใหม่โดยใช้ส่วนประกอบที่มีอยู่ของคุณ
คุณควรอ่านสิ่งนี้:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
มันอัปเดตบ่อยครั้งโดยคนที่มีความรู้สูง นอกจากนี้ยังเป็นเพียงการหารือระบบเอนทิตีกับตัวอย่างโค้ดที่เป็นรูปธรรม
การทำซ้ำของฉันเป็นดังนี้:
การวนซ้ำครั้งแรกมีวัตถุ "EntitySystem" ซึ่งเหมือนกับอดัมอธิบาย อย่างไรก็ตามองค์ประกอบของฉันยังคงมีวิธีการ - องค์ประกอบ 'ที่แสดงผลได้' ของฉันมีวิธีการทาสี () และองค์ประกอบตำแหน่งของฉันมีวิธีการเคลื่อนไหว () และอื่น ๆ เมื่อฉันเริ่มเนื้อความเอนทิตีฉันรู้ว่าฉันต้องเริ่มส่งข้อความระหว่าง ส่วนประกอบและสั่งการดำเนินการของการปรับปรุงส่วนประกอบ .... ทางยุ่งเกินไป
ดังนั้นฉันจึงกลับไปอ่านบล็อกของเครื่อง T อีกครั้ง มีข้อมูลจำนวนมากในหัวข้อความคิดเห็น - และในนั้นพวกเขาเน้นจริง ๆ ว่าส่วนประกอบไม่ได้พฤติกรรมนั้นมีให้โดยระบบเอนทิตี ด้วยวิธีนี้คุณไม่จำเป็นต้องส่งข้อความระหว่างส่วนประกอบและการอัพเดทองค์ประกอบคำสั่งเพราะการสั่งซื้อจะถูกกำหนดโดยคำสั่งทั่วโลกของการดำเนินการระบบ ตกลง. อาจเป็นนามธรรมเกินไป
ต่อไปสำหรับการทำซ้ำ # 2 นี่คือสิ่งที่ฉันรวบรวมจากบล็อก:
EntityManager - ทำหน้าที่เป็นส่วนประกอบ "ฐานข้อมูล" ซึ่งสามารถสอบถามได้สำหรับเอนทิตีที่มีส่วนประกอบบางประเภท สิ่งนี้สามารถสำรองข้อมูลได้จากฐานข้อมูลในหน่วยความจำเพื่อการเข้าถึงที่รวดเร็ว ... ดูที่ส่วนเครื่อง 5 สำหรับข้อมูลเพิ่มเติม
EntitySystem - แต่ละระบบเป็นเพียงวิธีการที่ทำงานกับชุดของการเข้า แต่ละระบบจะใช้ส่วนประกอบ x, y และ z ของเอนทิตีเพื่อทำให้งานสำเร็จ ดังนั้นคุณจะสอบถามผู้จัดการสำหรับเอนทิตีที่มีส่วนประกอบ x, y และ z แล้วส่งผ่านผลลัพธ์นั้นไปยังระบบ
เอนทิตี - เพียงแค่รหัสเช่นยาว เอนทิตีคือกลุ่มอินสแตนซ์ของกลุ่มส่วนประกอบเข้าด้วยกันเป็น 'เอนทิตี'
ส่วนประกอบ - ชุดของฟิลด์ .... ไม่มีพฤติกรรม! เมื่อคุณเริ่มเพิ่มพฤติกรรมมันจะเริ่มยุ่ง ... แม้ในเกม Space Invadors ง่ายๆ
แก้ไข : โดยวิธีการ 'dt' เป็นเวลาของเดลต้านับตั้งแต่การร้องขอลูปหลักล่าสุด
ดังนั้นห่วง Invadors หลักของฉันคือ:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
มันดูแปลก ๆ เล็กน้อยในตอนแรก แต่มันยืดหยุ่นได้อย่างเหลือเชื่อ นอกจากนี้ยังง่ายต่อการปรับให้เหมาะสม สำหรับประเภทส่วนประกอบที่แตกต่างกันคุณสามารถมีที่เก็บข้อมูลสำรองที่แตกต่างกันเพื่อให้สามารถดึงข้อมูลได้เร็วขึ้น สำหรับคลาส 'form' คุณสามารถสำรองข้อมูลด้วย quadtree เพื่อเพิ่มความเร็วในการเข้าถึงการตรวจจับการชน
ฉันชอบคุณ; ฉันเป็นนักพัฒนาที่มีประสบการณ์ แต่ไม่มีประสบการณ์ในการเขียนเกม ฉันใช้เวลาค้นคว้ารูปแบบของ dev และอันนี้จับตาฉัน มันไม่ใช่วิธีเดียวที่จะทำสิ่งต่าง ๆ แต่ฉันพบว่ามันใช้งานง่ายและแข็งแกร่ง ผมเชื่อว่ารูปแบบที่ถูกกล่าวถึงอย่างเป็นทางการในหนังสือเล่ม 6 ของชุด "อัญมณีเขียนโปรแกรมเกม" - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 ฉันไม่ได้อ่านหนังสือด้วยตัวเอง แต่ฉันได้ยินมาว่าพวกเขาเป็นข้อมูลอ้างอิงจริงสำหรับการเขียนโปรแกรมเกม